Rescan, superseding an import session
Auth: Authorization: Bearer nsin_… or X-Api-Key: nsin_… — see API keys.
Marks this session superseded and starts a fresh one against the
same nameservers the original scan read. Requires records.edit.
Reusing the stored nameservers is the whole point: once the domain is delegated to NSIN, resolving its nameservers again finds ours, and a rescan would transfer our own still-empty zone and report that the old provider had nothing.
The old session is kept rather than rewritten, so a rescan can never race a commit already in flight, and the record of what was originally found survives.
Path parameters
- domainstringrequiredpath
The domain name (for example
example.com) — not a numeric id. - sessionIdintegerrequiredpath
Numeric id of the record import session. Sessions are resolved within the domain, so an id from another domain reads as not found.
Responses
200An open session already existed and is returned unchanged.
Content type: application/json
- idinteger
- domain_idinteger
- statusstring
scanning— the sweep is running.ready— waiting for a commit or a discard.committing— a commit is in flight and holds the claim.auto_committed— nobody answered beforeauto_commit_atand the records were written anyway, rather than leaving the zone empty.superseded— replaced by a rescan.One of:"scanning""ready""committing""committed""auto_committed""discarded""superseded""failed" - sourcestringOne of:
"manual_scan""domain_create""zone_file" - clientstring
What started the session. An API key has nowhere to show a review screen, so adding a domain with a key still imports automatically; staged review is the panel path.
One of:"panel""api" - methodstring
Which branch found the records — a full zone transfer, or a resolver sweep of common names. The first support question about a bad import is where the records came from.
One of:"axfr""scan" - source_nsarray of string
The nameservers this scan read. Stored because a rescan has to reuse them: once the domain is delegated to NSIN, resolving it again finds our own — still empty — zone.
- errorstring
Why the scan, or the last commit attempt, failed.
- started_atstring (date-time)
- finished_atstring (date-time)
When the scan finished and the session turned
ready. - committed_atstring (date-time)
- auto_commit_atstring (date-time)
When an unanswered
readysession commits itself. Cleared by a commit, a discard or a rescan. - countsImportSessionCounts
The header line of a review screen.
Fields
- totalinteger
- preselectedinteger
Rows a
mode "all"commit would write. - proxiedinteger
- warningsinteger
Rows carrying at least one warning.
- recordsarray of ImportSessionRecord
Empty while
statusisscanning.Item fields
- idinteger
Staging row id. It is not a record id — it exists only until the session is committed or discarded.
- namestring
- typestringOne of:
"A""AAAA""CNAME""ANAME""NS""TXT""MX""SRV""PTR""CAA""TLSA""SSHFP""URI" - destinationstring
- ttlinteger
- mx_priorityinteger
- proxiedboolean
Whether this row would be proxied — and, because a
mode: "all"commit (the unattendedauto_commit_atone included) writes exactly this flag, what happens to the row if nobody answers.It is
truefor the rows the edge can carry: a proxyable type on a routable origin. It isfalsewherever proxying would take a service away rather than accelerate it — a mail host, the target of an in-zoneMX, an underscored name (_acme-challenge,selector1._domainkey), or a label that names something that does not speak HTTP (ssh,vpn,mysql,ns1, …). Those rows carry amail_hostornon_web_servicewarning saying so.An
overwriterow mirrors the record it would replace: an import refreshes content and TTL and never changes an existing record's proxy setting. - statusstring
overwritemeans the domain already holds a record with this name and type and it would be replaced. TXT is neveroverwrite: many TXT records share one name.One of:"new""overwrite""unsupported" - existing_idinteger
The record that would be replaced. Set when
statusisoverwrite. - proxy_eligibleboolean
Whether this row could be proxied if you switched it on — a proxyable type pointing at an address the edge will accept.
- preselectedboolean
Whether the row is included when you commit with
mode: "all". Rows carrying anerrorwarning arrive unticked. - warningsarray of ImportWarning
Item fields
- codestringOne of:
"unsupported""not_proxyable_type""private_address""points_at_nsin""proxy_ineligible_origin""mail_host""non_web_service""overwrite""wildcard" - severitystring
Only
errorrows arrive unticked (preselected: false) — they are the ones NSIN cannot import at all.One of:"info""warning""error" - messagestring
- reasonstring
The first warning's message, kept for clients written against the flat scan preview.
{
"id": 0,
"domain_id": 0,
"status": "scanning",
"source": "manual_scan",
"client": "panel",
"method": "axfr",
"source_ns": [
"string"
],
"error": "string",
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"committed_at": "2026-01-01T00:00:00Z",
"auto_commit_at": "2026-01-01T00:00:00Z",
"counts": {
"total": 0,
"preselected": 0,
"proxied": 0,
"warnings": 0
},
"records": [
{
"id": 0,
"name": "string",
"type": "A",
"destination": "string",
"ttl": 0,
"mx_priority": 0,
"proxied": true,
"status": "new",
"existing_id": 0,
"proxy_eligible": true,
"preselected": true,
"warnings": [
{
"code": "unsupported",
"severity": "info",
"message": "string"
}
],
"reason": "string"
}
]
}202The replacement session was created and its scan is running.
Content type: application/json
- idinteger
- domain_idinteger
- statusstring
scanning— the sweep is running.ready— waiting for a commit or a discard.committing— a commit is in flight and holds the claim.auto_committed— nobody answered beforeauto_commit_atand the records were written anyway, rather than leaving the zone empty.superseded— replaced by a rescan.One of:"scanning""ready""committing""committed""auto_committed""discarded""superseded""failed" - sourcestringOne of:
"manual_scan""domain_create""zone_file" - clientstring
What started the session. An API key has nowhere to show a review screen, so adding a domain with a key still imports automatically; staged review is the panel path.
One of:"panel""api" - methodstring
Which branch found the records — a full zone transfer, or a resolver sweep of common names. The first support question about a bad import is where the records came from.
One of:"axfr""scan" - source_nsarray of string
The nameservers this scan read. Stored because a rescan has to reuse them: once the domain is delegated to NSIN, resolving it again finds our own — still empty — zone.
- errorstring
Why the scan, or the last commit attempt, failed.
- started_atstring (date-time)
- finished_atstring (date-time)
When the scan finished and the session turned
ready. - committed_atstring (date-time)
- auto_commit_atstring (date-time)
When an unanswered
readysession commits itself. Cleared by a commit, a discard or a rescan. - countsImportSessionCounts
The header line of a review screen.
Fields
- totalinteger
- preselectedinteger
Rows a
mode "all"commit would write. - proxiedinteger
- warningsinteger
Rows carrying at least one warning.
- recordsarray of ImportSessionRecord
Empty while
statusisscanning.Item fields
- idinteger
Staging row id. It is not a record id — it exists only until the session is committed or discarded.
- namestring
- typestringOne of:
"A""AAAA""CNAME""ANAME""NS""TXT""MX""SRV""PTR""CAA""TLSA""SSHFP""URI" - destinationstring
- ttlinteger
- mx_priorityinteger
- proxiedboolean
Whether this row would be proxied — and, because a
mode: "all"commit (the unattendedauto_commit_atone included) writes exactly this flag, what happens to the row if nobody answers.It is
truefor the rows the edge can carry: a proxyable type on a routable origin. It isfalsewherever proxying would take a service away rather than accelerate it — a mail host, the target of an in-zoneMX, an underscored name (_acme-challenge,selector1._domainkey), or a label that names something that does not speak HTTP (ssh,vpn,mysql,ns1, …). Those rows carry amail_hostornon_web_servicewarning saying so.An
overwriterow mirrors the record it would replace: an import refreshes content and TTL and never changes an existing record's proxy setting. - statusstring
overwritemeans the domain already holds a record with this name and type and it would be replaced. TXT is neveroverwrite: many TXT records share one name.One of:"new""overwrite""unsupported" - existing_idinteger
The record that would be replaced. Set when
statusisoverwrite. - proxy_eligibleboolean
Whether this row could be proxied if you switched it on — a proxyable type pointing at an address the edge will accept.
- preselectedboolean
Whether the row is included when you commit with
mode: "all". Rows carrying anerrorwarning arrive unticked. - warningsarray of ImportWarning
Item fields
- codestringOne of:
"unsupported""not_proxyable_type""private_address""points_at_nsin""proxy_ineligible_origin""mail_host""non_web_service""overwrite""wildcard" - severitystring
Only
errorrows arrive unticked (preselected: false) — they are the ones NSIN cannot import at all.One of:"info""warning""error" - messagestring
- reasonstring
The first warning's message, kept for clients written against the flat scan preview.
{
"id": 0,
"domain_id": 0,
"status": "scanning",
"source": "manual_scan",
"client": "panel",
"method": "axfr",
"source_ns": [
"string"
],
"error": "string",
"started_at": "2026-01-01T00:00:00Z",
"finished_at": "2026-01-01T00:00:00Z",
"committed_at": "2026-01-01T00:00:00Z",
"auto_commit_at": "2026-01-01T00:00:00Z",
"counts": {
"total": 0,
"preselected": 0,
"proxied": 0,
"warnings": 0
},
"records": [
{
"id": 0,
"name": "string",
"type": "A",
"destination": "string",
"ttl": 0,
"mx_priority": 0,
"proxied": true,
"status": "new",
"existing_id": 0,
"proxy_eligible": true,
"preselected": true,
"warnings": [
{
"code": "unsupported",
"severity": "info",
"message": "string"
}
],
"reason": "string"
}
]
}401Missing, malformed, revoked or expired API key. (A valid key whose
account has been deactivated gets 403 account is inactive instead.)
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "invalid API key"
}403The key is read-only, your role on the domain lacks the required permission, or the domain's plan does not include the feature.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "read-only API key"
}404No such domain or import session, the session belongs to another domain, or the domain is not visible to this account.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "import session not found"
}409The domain is disabled, or this session is being committed right now and cannot be superseded.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
{
"error": "this import is being committed"
}429A scan for this domain ran less than five minutes ago. One scan is up to
roughly 1100 outbound DNS queries, so it is throttled per domain — this
is separate from, and additional to, the per-key rate limit. Wait
retry_after_seconds and retry.
Content type: application/json
- errorstringrequired
Human-readable description of what went wrong.
- retry_after_secondsinteger
Seconds left on this domain's five-minute scan window.
{
"error": "a scan for this domain ran a moment ago; please wait before scanning again",
"retry_after_seconds": 173
}Example request
curl -X POST "https://api.nsin.ir/domains/example.com/records/import-sessions/0/rescan" \
-H "Authorization: Bearer $NSIN_API_KEY"