API reference

Zones

GET/zonesList zones

Returns all DNS zones accessible to the authenticated identity.

Parameters

NameTypeRequiredDescription
zoneNamequerystring-Exact zone-name filter. Returns { zones: [...] } with just that zone (or an empty list). Single-label-safe, unlike suffix_of. "name" is an accepted alias.
namequerystring-Alias for zoneName.
suffix_ofquerystring-Longest enclosing-zone match for a FQDN (cert / delegation-parent lookup). Returns a single Zone object, or 404 if none. Requires >= 2 labels, so it does NOT match single-label names - use zoneName for those.
curl -X GET https://api.yeil.app/v1/dns/zones \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200Default and with zoneName/name: { zones: [...] }. With suffix_of: a single Zone object.
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
POST/zonesCreate a zone

Registers a new DNS zone. Returns the zone and a status indicating whether DNSSEC DS delegation or a Handshake claim is required.

Request body

NameTypeRequiredDescription
zoneNamestringrequiredThe zone apex domain name (e.g. example.com).
ownerstring-Zone owner. Use "org:<teamId>" to create in a team, or "personal" (the default when omitted) for a personal zone. App-account keys (yk_) MUST set this to "org:<their own teamId>" and that team must match the key's team - app keys cannot create personal zones, and a missing or bare-id owner is rejected with 403 "app can only create zones in its own team". The key also needs manage-zones = write.
curl -X POST https://api.yeil.app/v1/dns/zones \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200On status=done the response carries id + nameservers + ds so a client can wire records/DS in one call (no follow-up GET to recover the id).
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
GET/zones/{id}Get a zone

Single-zone detail plus delegation info (nameservers + DS).

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X GET https://api.yeil.app/v1/dns/zones/$ZONE_ID \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 404Zone not found.
DELETE/zones/{id}Delete a zone

Permanently deletes a DNS zone and all its records.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X DELETE https://api.yeil.app/v1/dns/zones/$ZONE_ID \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 204No content
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
POST/zones/{id}/parkPark a zone

Marks a zone as parked, suspending record resolution.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X POST https://api.yeil.app/v1/dns/zones/$ZONE_ID/park \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
POST/zones/{id}/unparkUnpark a zone

Restores a parked zone to active resolution.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X POST https://api.yeil.app/v1/dns/zones/$ZONE_ID/unpark \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
GET/zones/{id}/dsGet DNSSEC DS record

Returns the DS record for the zone's DNSSEC key, for submission to the parent zone.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X GET https://api.yeil.app/v1/dns/zones/$ZONE_ID/ds \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }

Records

GET/zones/{id}/recordsList records

Returns all DNS records in a zone.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
curl -X GET https://api.yeil.app/v1/dns/zones/$ZONE_ID/records \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
POST/zones/{id}/recordsCreate a record

Adds a new DNS record to a zone.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.

Request body

NameTypeRequiredDescription
namestringrequiredRelative to the zone; @ = apex.
typeA | AAAA | ALIAS | CAA | CNAME | DS | HTTPS | MX | NS | PTR | SRV | TLSA | TXTrequiredDNS record type.
contentstringrequiredRecord value. A, AAAA: an address. CNAME, ALIAS, NS, PTR, MX: a hostname. SRV: "priority weight port target", e.g. "10 5 443 sip.example.com" (target "." means not offered). HTTPS: "priority target params" (RFC 9460), e.g. "1 . alpn=h3,h2" (priority 0 points to another name, target "." means this name). CAA, DS, TLSA, TXT: their usual zone file form.
ttlinteger-Seconds; defaults to the zone default.30–86400
priorityinteger-Mail exchange priority.0–65535, MX only
curl -X POST https://api.yeil.app/v1/dns/zones/$ZONE_ID/records \
  -H "Authorization: Bearer $YEIL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "_acme-challenge",
  "type": "TXT",
  "content": "u8fGnBm9KvJdLp2eYhRzxQkWAoT7sE0cNiO4M5jHFw",
  "ttl": 120
}'

Responses

  • 201Created
    {
      "id": "rec_01HZ7XMGP2Q4V8BNWRKE3DYFT",
      "name": "_acme-challenge",
      "type": "TXT",
      "content": "u8fGnBm9KvJdLp2eYhRzxQkWAoT7sE0cNiO4M5jHFw",
      "ttl": 120,
      "priority": null
    }
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
  • 503The zone is busy with another change. Nothing was written, so the same request can be sent again after Retry-After.
    {
      "error": "busy",
      "message": "This zone is busy with another change. Try again in a moment."
    }
PUT/zones/{id}/records/{recordId}Update a record

Replaces a DNS record's content, TTL, or priority.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
recordIdpathstringrequiredRecord ID.

Request body

NameTypeRequiredDescription
namestringrequiredRelative to the zone; @ = apex.
typeA | AAAA | ALIAS | CAA | CNAME | DS | HTTPS | MX | NS | PTR | SRV | TLSA | TXTrequiredDNS record type.
contentstringrequiredRecord value. A, AAAA: an address. CNAME, ALIAS, NS, PTR, MX: a hostname. SRV: "priority weight port target", e.g. "10 5 443 sip.example.com" (target "." means not offered). HTTPS: "priority target params" (RFC 9460), e.g. "1 . alpn=h3,h2" (priority 0 points to another name, target "." means this name). CAA, DS, TLSA, TXT: their usual zone file form.
ttlinteger-Seconds; defaults to the zone default.30–86400
priorityinteger-Mail exchange priority.0–65535, MX only
curl -X PUT https://api.yeil.app/v1/dns/zones/$ZONE_ID/records/$RECORD_ID \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 200OK
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }
  • 503The zone is busy with another change. Nothing was written, so the same request can be sent again after Retry-After.
    {
      "error": "busy",
      "message": "This zone is busy with another change. Try again in a moment."
    }
DELETE/zones/{id}/records/{recordId}Delete a record

Permanently removes a DNS record from a zone.

Parameters

NameTypeRequiredDescription
idpathstringrequiredZone ID.
recordIdpathstringrequiredRecord ID.
curl -X DELETE https://api.yeil.app/v1/dns/zones/$ZONE_ID/records/$RECORD_ID \
  -H "Authorization: Bearer $YEIL_API_KEY"

Responses

  • 204No content
  • 401Unauthorized
    {
      "error": "unauthorized",
      "message": "Invalid or missing API key."
    }
  • 429Rate limited
    {
      "error": "rate_limited",
      "message": "Too many requests. Please slow down."
    }

Record types

TypeMeaning
AMaps a hostname to an IPv4 address.
AAAAMaps a hostname to an IPv6 address.
ALIASApex CNAME-like flattening - resolves the target and returns its IPs.
CAASpecifies which certificate authorities may issue TLS certificates.
CNAMEAliases one name to another; not valid at the zone apex.
DSDNSSEC delegation signer record linking a child zone's key.
HTTPSDescribes how to reach an HTTPS service: protocols (alpn), port and address hints, or another name to use (RFC 9460).
MXDesignates a mail exchanger; uses a priority field (lower = preferred).
NSDelegates a subdomain to a set of authoritative nameservers.
PTRMaps an IP address back to a hostname (reverse DNS); used in in-addr.arpa and ip6.arpa zones.
SRVLocates a service: priority, weight, port and target host, at a name like _sip._tcp.
TLSADANE certificate association; binds a TLS cert to a DNS name.
TXTFree-form text; used for SPF, DKIM, domain verification, and more.

Error codes

CodeWhen it occurs
unauthorizedMissing or invalid API key.
bad_requestMalformed or unparseable request input.
forbiddenAPI key lacks the required permission for this operation.
no_zoneZone not found or does not belong to your account.
rate_limitedToo many write requests in a short window.
conflictDuplicate or competing change would violate a constraint.
dns_serverUpstream DNS error while applying the change.
not_foundRecord or other resource does not exist.
busyThe zone is busy with another change (503). Nothing was written; retry after Retry-After.
internalUnexpected server error; try again or contact support.

Rate limits

BucketLimitWindow
Zone writes1060 seconds
Record writes6060 seconds

When a limit is exceeded, the API returns 429 with a Retry-After header indicating how many seconds to wait before retrying.