API reference
Zones
/zonesList zonesReturns all DNS zones accessible to the authenticated identity.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
zoneName | string | - | 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. |
name | string | - | Alias for zoneName. |
suffix_of | string | - | 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." }
/zonesCreate a zoneRegisters a new DNS zone. Returns the zone and a status indicating whether DNSSEC DS delegation or a Handshake claim is required.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
zoneName | string | required | The zone apex domain name (e.g. example.com). |
owner | string | - | 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." }
/zones/{id}Get a zoneSingle-zone detail plus delegation info (nameservers + DS).
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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.
/zones/{id}Delete a zonePermanently deletes a DNS zone and all its records.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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." }
/zones/{id}/parkPark a zoneMarks a zone as parked, suspending record resolution.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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." }
/zones/{id}/unparkUnpark a zoneRestores a parked zone to active resolution.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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." }
/zones/{id}/dsGet DNSSEC DS recordReturns the DS record for the zone's DNSSEC key, for submission to the parent zone.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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
/zones/{id}/recordsList recordsReturns all DNS records in a zone.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone 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." }
/zones/{id}/recordsCreate a recordAdds a new DNS record to a zone.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone ID. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
name | string | required | Relative to the zone; @ = apex. |
type | A | AAAA | ALIAS | CAA | CNAME | DS | MX | NS | TLSA | TXT | required | DNS record type. |
content | string | required | Record value (IP, hostname, or raw string depending on type). |
ttl | integer | - | Seconds; defaults to the zone default.30–86400 |
priority | integer | - | 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." }
/zones/{id}/records/{recordId}Update a recordReplaces a DNS record's content, TTL, or priority.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone ID. |
recordId | string | required | Record ID. |
Request body
| Name | Type | Required | Description |
|---|---|---|---|
name | string | required | Relative to the zone; @ = apex. |
type | A | AAAA | ALIAS | CAA | CNAME | DS | MX | NS | TLSA | TXT | required | DNS record type. |
content | string | required | Record value. |
ttl | integer | - | Seconds; defaults to the zone default.30–86400 |
priority | integer | - | 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." }
/zones/{id}/records/{recordId}Delete a recordPermanently removes a DNS record from a zone.
Path & query parameters
| Name | Type | Required | Description |
|---|---|---|---|
id | string | required | Zone ID. |
recordId | string | required | Record 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
| Type | Meaning |
|---|---|
A | Maps a hostname to an IPv4 address. |
AAAA | Maps a hostname to an IPv6 address. |
ALIAS | Apex CNAME-like flattening - resolves the target and returns its IPs. |
CAA | Specifies which certificate authorities may issue TLS certificates. |
CNAME | Aliases one name to another; not valid at the zone apex. |
DS | DNSSEC delegation signer record linking a child zone's key. |
MX | Designates a mail exchanger; uses a priority field (lower = preferred). |
NS | Delegates a subdomain to a set of authoritative nameservers. |
TLSA | DANE certificate association; binds a TLS cert to a DNS name. |
TXT | Free-form text; used for SPF, DKIM, domain verification, and more. |
Error codes
| Code | When it occurs |
|---|---|
unauthorized | Missing or invalid API key. |
bad_request | Malformed or unparseable request input. |
forbidden | API key lacks the required permission for this operation. |
no_zone | Zone not found or does not belong to your account. |
rate_limited | Too many write requests in a short window. |
conflict | Duplicate or competing change would violate a constraint. |
dns_server | Upstream DNS error while applying the change. |
not_found | Record or other resource does not exist. |
internal | Unexpected server error; try again or contact support. |
Rate limits
| Bucket | Limit | Window |
|---|---|---|
Zone writes | 10 | 60 seconds |
Record writes | 60 | 60 seconds |
When a limit is exceeded, the API returns 429 with a Retry-After header indicating how many seconds to wait before retrying.