DNSSEC cryptographically signs your DNS so resolvers can detect tampering. You generate the keys at your DNS provider; this API publishes the resulting DS records at the registry.
GET /api/v1/domains/dns/dnssec
Section titled “GET /api/v1/domains/dns/dnssec”Current DNSSEC state, the published DS records, and what this extension accepts. Call this before any write — it tells you which algorithms and digest types are permitted.
Request
GET /api/v1/domains/dns/dnssec?domainName=apiname.comResponse — 200
{ "domainName": "apiname.com", "isDnssecAvailable": true, "status": 2, "delegationSigned": true, "maxSigLife": null, "lastChangedAt": "2026-10-28T09:14:52", "dsRecords": [ { "keyTag": 12345, "algorithm": 13, "digestType": 2, "digest": "49FD46E6C4B45C55D4AC69CBD3CD34AC1AFE51DE7D4C6F9CFBF5F8A1B2C3D4E5", "status": 1, "isAlgorithmNotRecommended": false, "createdAt": "2026-10-28T09:12:03", "activatedAt": "2026-10-28T09:14:52", "removedAt": null } ], "allowedAlgorithms": [8, 13, 14, 15, 16], "allowedDigestTypes": [2, 4], "maxDsRecordCount": 8}| Field | How to use it |
|---|---|
isDnssecAvailable |
If false, every write here fails with Dnssec:10001. Hide the DNSSEC option in your UI. |
delegationSigned |
The authoritative “is it live” signal. status can lag behind registry reality; this reflects what is actually published. |
allowedAlgorithms |
The algorithm numbers you may send. Build your dropdown from this, not from a hard-coded list — it varies by extension. |
allowedDigestTypes |
Same for digest types. |
maxDsRecordCount |
Maximum DS records. Default 8. Relevant during key rollover, when you briefly need two. |
dsRecords[].isAlgorithmNotRecommended |
The algorithm works but is discouraged by current standards. Plan to migrate. |
status
| Value | Name | Meaning |
|---|---|---|
| 0 | Unsigned |
No DS record at the registry. DNSSEC is off. |
| 1 | PendingEnable |
Add request sent, awaiting registry confirmation. |
| 2 | Signed |
At least one DS record is live. |
| 3 | PendingDisable |
Removal sent, awaiting confirmation. |
| 4 | Error |
The last DNSSEC operation failed. Read the DS records’ individual statuses. |
dsRecords[].status
| Value | Name | Meaning |
|---|---|---|
| 0 | Pending |
Submitted, not confirmed. |
| 1 | Active |
Live at the registry. |
| 2 | Removing |
Removal in flight. |
| 3 | Removed |
Gone. Excluded from this list. |
| 4 | Failed |
The registry rejected it. |
Algorithms and digest types
Section titled “Algorithms and digest types”Allowed values vary by extension — always read them from this endpoint. For reference:
| Value | Algorithm | Status |
|---|---|---|
| 8 | RSA/SHA-256 |
Recommended |
| 13 | ECDSA P-256/SHA-256 |
Recommended — the usual modern choice |
| 14 | ECDSA P-384/SHA-384 |
Recommended |
| 15 | Ed25519 |
Recommended |
| 16 | Ed448 |
Recommended |
| 5, 7 | RSA/SHA-1 variants |
Accepted but discouraged |
| 10 | RSA/SHA-512 |
Accepted but discouraged |
| 1, 3, 6, 12 | MD5, DSA, GOST |
Rejected — never accepted, even if an extension lists them |
| Value | Digest type | Required digest length |
|---|---|---|
| 1 | SHA-1 |
40 hex characters |
| 2 | SHA-256 |
64 hex characters — the usual choice |
| 4 | SHA-384 |
96 hex characters |
| 3 | GOST |
Rejected |
POST /api/v1/domains/dns/dnssec
Section titled “POST /api/v1/domains/dns/dnssec”Publishes one or more DS records at the registry, enabling DNSSEC.
Request
{ "domainName": "apiname.com", "records": [ { "keyTag": 12345, "algorithm": 13, "digestType": 2, "digest": "49FD46E6C4B45C55D4AC69CBD3CD34AC1AFE51DE7D4C6F9CFBF5F8A1B2C3D4E5" } ]}| Field | Required | Notes |
|---|---|---|
domainName |
required | |
records |
required | At least one entry. |
records[].keyTag |
required | 0–65535. From your DNS provider. |
records[].algorithm |
required | Must be in allowedAlgorithms. |
records[].digestType |
required | Must be in allowedDigestTypes. |
records[].digest |
required | Hex, exact length for the digest type. |
Response — 200
{ "items": [ { "keyTag": 12345, "operationType": 0, "isSuccess": true, "isPending": true, "resultMessage": "Command completed successfully; action pending" } ]}operationType: 0 Add · 1 Remove · 2 RemoveAll · 3 Sync.
DELETE /api/v1/domains/dns/dnssec · POST /api/v1/domains/dns/dnssec/disable
Section titled “DELETE /api/v1/domains/dns/dnssec · POST /api/v1/domains/dns/dnssec/disable”Remove one DS record, or all of them.
DELETE — remove one record
{ "domainName": "apiname.com", "keyTag": 12345, "algorithm": 13, "digestType": 2, "digest": "49FD46E6C4B45C55D4AC69CBD3CD34AC1AFE51DE7D4C6F9CFBF5F8A1B2C3D4E5"}The record is identified by its full value, not by an ID. All four fields must match exactly — copy them straight from GET /dnssec. Any mismatch gives Dna.DomainService:Dnssec:10007.
The fields travel in the request body of the DELETE. Make sure your HTTP client sends a body with DELETE requests; some drop it unless told otherwise.
Response — 200, DELETE
{ "keyTag": 12345, "operationType": 1, "isSuccess": true, "isPending": false, "resultMessage": "Command completed successfully"}POST /dnssec/disable — remove all records
{ "domainName": "apiname.com"}Response — 200, disable
{ "keyTag": null, "operationType": 2, "isSuccess": true, "isPending": false, "resultMessage": "Command completed successfully"}operationType says what was done: 1 one record removed, 2 all records removed. As when adding, isSuccess: true with isPending: true means the registry accepted the removal and will finish it later. Poll GET /dnssec rather than sending it again.
Errors — all DNSSEC endpoints
| Code | Meaning and fix |
|---|---|
Dna.DomainService:Dnssec:10001 |
This extension does not support DNSSEC. |
Dna.DomainService:Dnssec:10002 |
keyTag outside 0–65535. |
Dna.DomainService:Dnssec:10003 |
Algorithm not permitted. Read allowedAlgorithms. |
Dna.DomainService:Dnssec:10004 |
Digest type not permitted. Read allowedDigestTypes. |
Dna.DomainService:Dnssec:10005 |
The most common one. The digest is not hex, or its length does not match the declared digestType. details states the expected length. |
Dna.DomainService:Dnssec:10006 |
That DS record already exists, or you sent it twice in one request. |
Dna.DomainService:Dnssec:10007 |
Delete: no record matches all four fields. Copy them from GET /dnssec. |
Dna.DomainService:Dnssec:10008 |
Would exceed maxDsRecordCount. Remove an old record first. |
Dna.DomainService:Dnssec:10013 |
The registry returned no DS record. Your local records were preserved rather than wiped. Check GET /dnssec. |
Dna.DomainService:Domain:10007 |
Domain not found or not yours. |
Dna.DomainService:Domain:10070 |
Waiting for registry documents. |
Dna.DomainService:Epp:10001 |
The registry rejected the operation. |