runlot
ReferenceAPI

DNS zones

Covers the 8 API operations in the dns category.

MethodPathDescription
GET/v1/orgs/{orgSlug}/dns/zonesThe list of DNS zones (runlot dns zones)
POST/v1/orgs/{orgSlug}/dns/zonesCreate a DNS zone (runlot dns create)
GET/v1/orgs/{orgSlug}/dns/zones/{zone}One DNS zone and all of its records
DELETE/v1/orgs/{orgSlug}/dns/zones/{zone}Delete a DNS zone (runlot dns delete)
PUT/v1/orgs/{orgSlug}/dns/zones/{zone}/rrsets/{name}/{type}Create or update a record (runlot dns set)
DELETE/v1/orgs/{orgSlug}/dns/zones/{zone}/rrsets/{name}/{type}Delete a record (runlot dns rm)
POST/v1/orgs/{orgSlug}/dns/zones/{zone}/dnssecTurn zone signing on or off
PUT/v1/orgs/{orgSlug}/dns/zones/{zone}/dnssec/dsStore the DS to register with the parent zone

GET /v1/orgs/{orgSlug}/dns/zones

The DNS zones this organization runs on runlot nameservers (docs/domains.md §4). rrsets is not included; it is provided on the single-zone lookup only. Requires viewer or above.

operationId listZones

StatusDescriptionResponse body
200ListZoneList
403
404
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

POST /v1/orgs/{orgSlug}/dns/zones

Idempotent — a zone that already exists comes back as it is. A zone is born with an SOA (the generator builds it with serial) and an apex NS rrset, and that NS is managed_by = system, so it is locked in the editor: if a user deleted it, the whole domain would stop resolving (§7).

Creating the zone alone does not yet make any name take our answers. Delegation stands only once you change NS to nameservers at the registrar (the delegation badge shows that state). Requires admin or above. Audit event dns.zone.create.

operationId createZone

Request body: application/json · object

StatusDescriptionResponse body
200The zone that was created, or the one that already existedZoneDetail
400
403
404
409The DNS zone is already in use by another organization (zone_taken)Error
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

GET /v1/orgs/{orgSlug}/dns/zones/{zone}

Requires viewer or above.

operationId getZone

StatusDescriptionResponse body
200The DNS zone and its RRsetsZoneDetail
403
404
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

DELETE /v1/orgs/{orgSlug}/dns/zones/{zone}

It deletes every record together with the DNS zone file. If delegation still points at runlot nameservers, that domain will not resolve. Change NS at the registrar before deleting. Requires admin or above. Audit event dns.zone.delete.

operationId deleteZone

StatusDescriptionResponse body
204Deleted
403
404
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

PUT /v1/orgs/{orgSlug}/dns/zones/{zone}/rrsets/{name}/{type}

It replaces one rrset (name + type) wholesale — it does not add a single value; records is the entire new contents of that rrset.

Validation happens at save time (§4.3): CNAME cannot sit at the apex and cannot coexist with another type at the same name, and A/AAAA·MX·SRV·CAA are checked for shape. A TXT longer than 255 bytes is split into chunks in the zone file. A record that has managed_by (project links, ACME, the DNS zone's NS) returns 409 managed_rrset.

Requires member or above. Audit event dns.rrset.set.

operationId putRRset

Request body: application/json · object

StatusDescriptionResponse body
200The stored rrsetRRset
400
403
404
409The record is managed by a project (managed_rrset), or it violates the CNAME coexistence rule (cname_conflict)Error
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

DELETE /v1/orgs/{orgSlug}/dns/zones/{zone}/rrsets/{name}/{type}

A managed record returns 409 managed_rrset. To break a project link, do not delete the record — disconnect it from the project's domain screen (§7). Requires member or above. Audit event dns.rrset.delete.

operationId deleteRRset

StatusDescriptionResponse body
204Deleted
403
404
409This row is managed by the app (managed_rrset)Error
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

POST /v1/orgs/{orgSlug}/dns/zones/{zone}/dnssec

off → signing. The nameserver (Knot) does the signing, and no key material is stored on CP (§4.5). Turning the feature off also deletes the recorded DS. If you register an old key's DS with the parent zone, the domain will not resolve correctly. Requires admin or above.

operationId setZoneDNSSEC

Request body: application/json · object

StatusDescriptionResponse body
200The updated zoneZone
403
404
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

PUT /v1/orgs/{orgSlug}/dns/zones/{zone}/dnssec/ds

CP does not query the parent zone. This value is a fact reported by an operator (or by D3's registrar sync) about the DS the nameserver produced, and the state moves signing → ds_pending. An empty list means "not yet", so it does not push the state forward. Requires admin or above.

operationId setZoneDS

Request body: application/json · object

StatusDescriptionResponse body
200The updated zoneZone
400
403
404
409DNSSEC is off for the zone (dnssec_off)Error
503This is a deployment with its own DNS turned off (dns_not_configured), or a cp-public started without a cp-core address (no_core).Error

On this page