Contact verification
This is the part of the API that most often surprises new integrators. Read it before you register your first domain.
For most domain extensions, registry rules require the registrant’s contact data to be verified. There are two independent processes:
| Type | What it verifies | Who gets the e-mail | Started by |
|---|---|---|---|
Email |
That the contact’s e-mail address is real and reachable. | The contact’s own address. | Creating a domain or contact; changing an e-mail address. |
Owner |
That the current owner consents to an ownership change. | The previous owner’s address. | Changing firstName, lastName or companyName on a contact behind an in-scope domain. |
Timings you need to design around
Section titled “Timings you need to design around”| Setting | Value |
|---|---|
| Verification link validity | 15 days from issue |
| Automatic reminder e-mails | every 3 days while pending |
| Minimum gap between manual re-sends | 1 minute |
| Maximum re-sends | 100 |
What happens if nobody verifies
Section titled “What happens if nobody verifies”- You register a domain. It becomes active straight away — verification is not a precondition for registration.
- We open a verification process for each distinct contact e-mail on the domain. One address used for all four roles produces one verification, not four.
- The contact receives a link valid for 15 days, plus a reminder every 3 days.
- If nobody clicks within 15 days, the domain is suspended: its status becomes
PendingHold, the reason becomesRddsVerificationPending, and its name servers are switched to our suspension servers — the website and e-mail stop working. - When the contact finally verifies, the domain is reactivated automatically. This is not instant — it is handled by a background process shortly afterwards.
Which extensions this applies to
Section titled “Which extensions this applies to”Verification applies to most generic extensions (.com, .net, .org and the newer gTLDs). A number of country-code extensions are outside its scope and never enter the process.
The practical test: call GET /api/v1/contacts/{handleCode}. If verificationObjects comes back empty and the contact is not already verified, that handle’s domains are outside scope.
Renewing a suspended domain
Section titled “Renewing a suspended domain”A domain suspended for unverified contact data can still be renewed — do not let it expire while you chase the verification. Renewing does not lift the suspension; only verification does.
Changing an e-mail address mid-verification
Section titled “Changing an e-mail address mid-verification”Changing the address does not reset the clock to zero and does not avoid verification. The new address joins the same verification chain. If the new address is already verified from another contact, the chain inherits that verification and suspended domains become eligible for reactivation. The number of address changes within one chain is capped; past the limit only support can intervene.
GET /api/v1/contacts/verification/check
Section titled “GET /api/v1/contacts/verification/check”Current verification state for a handle. This is the endpoint to poll from your dashboard.
Request
GET /api/v1/contacts/verification/check?handleCode=D-174829301847Response — 200
{ "results": [ { "fieldType": "Email", "fieldValue": "ahmet@apiname.com", "ownerName": "Ahmet Yilmaz", "operationStatus": "VerificationPending", "isUserVerified": false, "userVerificationDate": null, "tokenExpireDate": "2026-11-14T10:22:31", "resendDate": "2026-10-30T10:23:31", "resendRetryCount": 100, "attemptNumber": 1, "lastAttemptDate": "2026-10-30T10:22:31", "createdDate": "2026-10-30T10:22:31" } ]}Status values
| Value | Name | Meaning |
|---|---|---|
| 0 | None |
Just created. |
| 1 | VerificationPending |
Waiting for the user. Re-send is allowed. |
| 2 | Completed |
Finished. |
| 3 | TokenExpired |
The 15 days ran out. Re-sending issues a fresh link and a fresh 15-day window. |
| 4 | Cancelled |
Abandoned. |
| 5 | ResendLimitReached |
Allowance exhausted. Open a support ticket. |
| 6 | MailChanged |
Superseded because the address changed; the chain continues on the new address. |
| 7 | OperationPending |
The user responded; we are applying the result. |
Errors
| Code | Meaning and fix |
|---|---|
Dna.DomainService:Contact:10019 |
handleCode is empty. |
Dna.DomainService:Contact:Verification:10006 |
Handle not found in your account. |
Dna.DomainService:Contact:Verification:10005 |
No verification record. See the note above. |
POST /api/v1/contacts/verification/request
Section titled “POST /api/v1/contacts/verification/request”Re-sends the verification e-mail. Use it when the customer says they never received it, or when the link has expired.
Request
{ "handleCode": "D-174829301847"}Response — 204, no body
Errors
| Code | Meaning and fix |
|---|---|
Dna.DomainService:Contact:Verification:10002 |
You are inside the 1-minute cooldown. The message tells you how many seconds to wait. |
Dna.DomainService:Contact:Verification:10003 |
Already verified — nothing to send. Treat as success. |
Dna.DomainService:Contact:Verification:10001 |
Send limit reached. Open a support ticket; the customer most likely has a mail-delivery problem. |
Dna.DomainService:Contact:Verification:10009 |
This verification is already finalised (completed, cancelled or superseded) and cannot be re-sent. |
Dna.DomainService:Contact:Verification:10005 |
No verification record to re-send against. |
Dna.DomainService:Contact:Verification:10004 |
The e-mail could not be sent. Try again shortly. |
Dna.DomainService:Contact:Verification:10006 |
Handle not found in your account. |
Changing an owner’s name when the e-mail is unverified
Section titled “Changing an owner’s name when the e-mail is unverified”You cannot change firstName, lastName or companyName while the contact’s e-mail is unverified — the request fails with Dna.DomainService:Contact:Verification:10010. The reason is that the ownership-change notice is sent to that very address, so it has to be known to work first.
The working sequence:
POST /api/v1/contacts/verification/request— send the e-mail verification.- The customer clicks the link.
GET /api/v1/contacts/verification/checkuntilisUserVerifiedistrueforfieldType: "Email".PUT /api/v1/contacts/{handleCode}with the new name. This now starts an ownership verification, sent to the current owner.