API reference

Zones

GET/zonesList zones

Returns all DNS zones accessible to the authenticated identity.

Path & query parameters

NameTypeRequiredDescription
zoneNamestring-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.
namestring-Alias for zoneName.
suffix_ofstring-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).

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone 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.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone ID.

Request body

NameTypeRequiredDescription
namestringrequiredRelative to the zone; @ = apex.
typeA | AAAA | ALIAS | CAA | CNAME | DS | MX | NS | TLSA | TXTrequiredDNS record type.
contentstringrequiredRecord value (IP, hostname, or raw string depending on type).
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."
    }
PUT/zones/{id}/records/{recordId}Update a record

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

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone ID.
recordIdstringrequiredRecord ID.

Request body

NameTypeRequiredDescription
namestringrequiredRelative to the zone; @ = apex.
typeA | AAAA | ALIAS | CAA | CNAME | DS | MX | NS | TLSA | TXTrequiredDNS record type.
contentstringrequiredRecord value.
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."
    }
DELETE/zones/{id}/records/{recordId}Delete a record

Permanently removes a DNS record from a zone.

Path & query parameters

NameTypeRequiredDescription
idstringrequiredZone ID.
recordIdstringrequiredRecord 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.
MXDesignates a mail exchanger; uses a priority field (lower = preferred).
NSDelegates a subdomain to a set of authoritative nameservers.
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.
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.