Skip to content

Describe a hosted zone's DNSSEC status.

GET
/v1/projects/{projectId}/dns/zones/{zoneId}/dnssec
Code sample: Shell / cURL
curl --request GET \
--url https://stratum.example.com/v1/projects/example/dns/zones/example/dnssec \
--header 'Authorization: Bearer <token>'

Reports whether the zone is signed and, crucially, whether it is ANCHORED — a signed zone with no DS in its parent is treated by every validating resolver as unsigned. Returns the DS to publish when this install does not serve the zone’s parent. Everything here is public key material, readable by anyone who can describe the zone.

projectId
required
string
/^p-[a-z0-9-]+$/
zoneId
required
string
/^zone-[a-z0-9]+$/

The zone’s DNSSEC status.

Media typeapplication/json

A hosted zone’s DNSSEC status. For a zone delegated under the domain this install serves, nothing here needs acting on: the DS is published into the parent zone automatically. It exists for the case automation cannot reach — a zone whose parent lives at an external registrar — where Stratum can only hand over the DS and say that nothing is anchored until somebody publishes it.

object
zoneId
required
string
enabled
required

The DESIRED state: whether signing was asked for. Whether the zone is signed and anchored right now is state.

boolean
state
required

The OBSERVED state. insecure — not signed. pending_ds — signed, but no DS is published in any parent, so validating resolvers still treat the zone as unsigned. secure — DS published; the chain of trust is complete. withdrawing — the DS has been withdrawn and the zone keeps signing until it expires from resolver caches. Its keys are retired only then; stopping sooner would make the zone unreachable rather than unsigned.

string
Allowed values: insecure pending_ds secure withdrawing
servedFqdn

The on-wire name this zone is signed at, and the owner name of its DS. Empty for a zone that is not delegated.

string
parentHosted
required

Whether this install serves the zone’s parent and so publishes the DS itself. When false, publishing it is the operator’s job.

boolean
actionRequired
required

True when the chain of trust is waiting on a human.

boolean
summary
required

One line stating what is true on the wire and what, if anything, to do.

string
dsWithdrawnAt

When the DS was withdrawn from the parent. Set only while withdrawing.

string format: date-time
rotationRequestedAt

When a ZSK roll was requested. Present while one is in flight: a replacement key is published but not yet signing, and is promoted once the DNSKEY rrset has had time to propagate. Cleared on completion. ZSK-specific on purpose. A KSK roll runs a different schedule and the two can be in flight at once, so a single “a roll is happening” field could not tell a caller which window they are waiting on.

string format: date-time
kskRotationRequestedAt

When a KSK roll was requested. A KSK roll is a double-DS sequence: the parent publishes the outgoing and incoming DS together, and the new key only starts signing once the DS TTL has elapsed.

string format: date-time
kskDsPublishedAt

When the parent began holding BOTH DS records for a KSK roll. This — not kskRotationRequestedAt — is what the promotion clock runs from, so it is the field that answers “how much longer”. The gap between the two is the time the data plane took to mint the key and the control plane to publish its DS.

string format: date-time
ds

The delegation signer that anchors this zone in its parent, in the several shapes registrars ask for it. Present whenever the zone has an active key-signing key.

object
name
required

The DS owner name — the zone’s served FQDN, not its logical name.

string
keyTag
required
integer
algorithm
required

DNSSEC algorithm number. 13 is ECDSAP256SHA256, the only one emitted.

integer
digestType
required

Digest algorithm. 2 is SHA-256.

integer
digest
required

Hex digest of the DNSKEY.

string
recordData
required

The RDATA alone — <keytag> <algorithm> <digesttype> <digest> — which is what most registrar forms take.

string
zoneFileLine
required

The complete record, for a registrar that accepts one.

string
dnskey

The zone’s active key-signing key, which the DS is a digest of. Provided for registrars that ask for a key rather than a digest.

object
name
required
string
flags
required

257 — a key-signing key (ZONE with the SEP bit set).

integer
protocol
required

Always 3.

integer
algorithm
required
integer
keyTag
required
integer
publicKey
required

Base64, as it appears on the wire.

string
zoneFileLine
required
string
keys

The zone’s whole key inventory, oldest first within each role: what is signing, what is staged behind it, what has been stood down, and when each retired key becomes safe to remove. Absent on a zone that has never been signed.

Array<object>

One key in a zone’s DNSSEC key inventory. A zone holds more keys than the one signing it. A rollover publishes the successor BEFORE it signs, so that every resolver has it cached when the first signature from it arrives, and keeps the outgoing key published AFTER it stops signing, so that signatures already in caches remain verifiable. Both are normal, and neither is visible from the DS or the active DNSKEY alone.

object
role
required

ksk signs the DNSKEY rrset and is what the parent’s DS points at; zsk signs everything else.

string
Allowed values: ksk zsk
keyTag
required

The key’s tag on the wire. An RRSIG names the key that made it by this tag, so it is how a signature in a capture is traced back to a row here.

integer
algorithm
required

DNSSEC algorithm number (13 = ECDSA P-256 SHA-256).

integer
state
required

signing — makes new RRSIGs. pre_published — in the DNSKEY rrset but signing nothing: the successor waiting out its propagation window during a roll. retired — stopped signing, and published only until the signatures it made can no longer be in any cache.

string
Allowed values: signing pre_published retired
published
required

Whether the key is in the zone’s DNSKEY rrset right now. True for every key except a retired one past prunableAt.

boolean
publishedAt
required

When the key became visible in the DNSKEY rrset.

string format: date-time
retiredAt

When the key stopped signing. Present only on a retired key.

string format: date-time
prunableAt

When the key can be deleted without making any signature it produced unverifiable — retiredAt plus the retired-key publish window. Deleting a key before this makes cached answers BOGUS rather than unsigned: a resolver holding an RRSIG whose key has vanished can neither verify the answer nor fall back to trusting it. Present only on a retired key; a signing or pre-published key has no such time.

string format: date-time

Example

{
"state": "insecure",
"keys": [
{
"role": "ksk",
"state": "signing"
}
]
}

Resource not found.

Media typeapplication/problem+json
object
type
required
string format: uri
title
required
string
status
required
integer
>= 400 <= 599
detail
string
instance
string format: uri-reference
requestId
required
string
code
required
string
issues

The findings of a rejected IAM policy document (custom and resource policies).

Array<object>

One finding of a rejected IAM policy document. A rejection lists every finding, so the author fixes the document in one round trip.

object
code
required

The finding, e.g. INVALID_DOCUMENT, UNKNOWN_ACTION, ACTION_NOT_APPLICABLE.

string
statement
required

Index of the statement at fault; -1 for the document as a whole.

integer
>= -1
detail
required
string
action

The offending action, where one is at fault (ACTION_NOT_APPLICABLE).

string
errors

Field errors, for codes that carry them: each problem at its field (see FieldError). Documented on the responses that set it, e.g. approveNodeJoin’s INVALID_INPUT and JOIN_APPROVAL_REFUSED. Absent otherwise.

Array<object>

One field’s problem, the stage-2 installer API’s shape. field is the field’s path, message what is wrong with it.

object
field
required

The field’s path, e.g. links[0].interface, disks[1].confirm, mgmt.address or role; empty for the whole request.

string
message
required
string
details

Structured facts about the refusal, for codes that carry them. The shape is fixed per code and documented on the response that answers it, e.g. IMAGE_POOL_MISMATCH (see ImagePoolMismatchDetails) and IMAGE_IN_USE. Absent for codes that carry none.

object
key
additional properties
any

Example

{
"issues": [
{
"code": "ACTION_NOT_APPLICABLE",
"action": "compute:CreateVpc"
}
]
}