Skip to content

DNS

Managed DNS zones and records with domain-ownership verification across Cloudflare / Route53 / AliDNS. (Not domain registration.)

Overview

Base path: https://api.infrai.cc/v1/dns
Auth header: Authorization: Bearer $INFRAI_API_KEY
bash
# Call any /v1/dns capability over raw HTTP — no SDK to install.
# curl:
curl https://api.infrai.cc/v1/dns/... \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json"

Methods

dns.domain.add

POST /v1/dns/domain/add

Bind a custom domain by creating a managed DNS zone at the vendor (Cloudflare / Route53 / AliDNS); returns zone_id + name servers. Not domain registration.

Parameters

NameTypeRequiredDescription
domainstring
Required
Apex domain, e.g. example.com.
vendorstringOptionalPin to a DNS vendor (BYOK / explicit).
account_idstringOptionalVendor account id / caller reference.
metadataRecord<string, unknown>OptionalArbitrary key/value metadata.

Returns

Zone { zone_id, domain, nameservers, status }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X POST https://api.infrai.cc/v1/dns/domain/add \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "..."}'

dns.domain.get

GET /v1/dns/domain/get

Fetch a bound domain (zone) by zone_id or name, returning its state and name servers.

Parameters

NameTypeRequiredDescription
domainstring
Required
Apex domain, e.g. example.com.
zone_idstringOptionalVendor zone id (preferred for get/verify/delete).
vendorstringOptionalPin to a DNS vendor (BYOK / explicit).

Returns

Zone

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X GET https://api.infrai.cc/v1/dns/domain/get \
  -H "Authorization: Bearer $INFRAI_API_KEY"

dns.domain.list

GET /v1/dns/domain/list

List the bound custom domains (managed zones) for the account at the configured DNS vendor.

Parameters

NameTypeRequiredDescription
cursorstringOptionalOpaque pagination cursor.
limitnumberOptionalMaximum number of items to return.

Returns

{ items: Zone[], next_cursor?: string }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X GET https://api.infrai.cc/v1/dns/domain/list \
  -H "Authorization: Bearer $INFRAI_API_KEY"

dns.domain.verify

POST /v1/dns/domain/verify

Verify a bound domain's activation/delegation against the same vendor zone it was created on (sticky_resource); read-only lookup of zone state.

Parameters

NameTypeRequiredDescription
domainstring
Required
Apex domain, e.g. example.com.
zone_idstringOptionalVendor zone id (preferred for get/verify/delete).
vendorstringOptionalPin to a DNS vendor (BYOK / explicit).

Returns

{ verified: boolean, status }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X POST https://api.infrai.cc/v1/dns/domain/verify \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "..."}'

dns.domain.delete

DELETE /v1/dns/domain/delete

Delete a bound domain's managed zone at the vendor (requires zone_id).

Parameters

NameTypeRequiredDescription
domainstring
Required
Apex domain, e.g. example.com.
zone_idstringOptionalVendor zone id (preferred for get/verify/delete).
vendorstringOptionalPin to a DNS vendor (BYOK / explicit).

Returns

{ ok: boolean }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X DELETE https://api.infrai.cc/v1/dns/domain/delete \
  -H "Authorization: Bearer $INFRAI_API_KEY"

dns.record.create

POST /v1/dns/record/create

Create a DNS record (A/AAAA/CNAME/TXT/MX) in a bound zone with TTL and optional MX priority / Cloudflare proxying.

Parameters

NameTypeRequiredDescription
zone_idstring
Required
Vendor zone id (preferred for get/verify/delete).
record_type"A" | "AAAA" | "CNAME" | "MX" | "TXT" | "NS" | "SRV"
Required
Record type — A, AAAA, CNAME, MX, TXT, NS, SRV.
namestring
Required
Record name, e.g. www or www.example.com.
contentstring
Required
IP / target / text value.
ttlnumberOptionalRecord TTL in seconds.
prioritynumberOptionalMX preference (MX only).
proxiedbooleanOptionalCloudflare orange-cloud (A/AAAA/CNAME only).
metadataRecord<string, unknown>OptionalArbitrary key/value metadata.

Returns

Record { record_id, type, name, content, ttl }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X POST https://api.infrai.cc/v1/dns/record/create \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"zone_id": "...", "record_type": "A", "name": "...", "content": "..."}'

dns.record.list

GET /v1/dns/record/list

List DNS records in a bound zone.

Parameters

NameTypeRequiredDescription
zone_idstring
Required
Vendor zone id (preferred for get/verify/delete).
record_typestringOptionalRecord type — A, AAAA, CNAME, MX, TXT, NS, SRV.
namestringOptionalRecord name, e.g. www or www.example.com.

Returns

{ items: Record[] }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X GET https://api.infrai.cc/v1/dns/record/list \
  -H "Authorization: Bearer $INFRAI_API_KEY"

dns.record.update

PATCH /v1/dns/record/update

Update an existing DNS record (by record_id; Route53 uses UPSERT).

Parameters

NameTypeRequiredDescription
zone_idstring
Required
Vendor zone id (preferred for get/verify/delete).
record_idstringOptionalThe record id (for update/delete).
record_typestring
Required
Record type — A, AAAA, CNAME, MX, TXT, NS, SRV.
namestring
Required
Record name, e.g. www or www.example.com.
contentstring
Required
IP / target / text value.
ttlnumberOptionalRecord TTL in seconds.
prioritynumberOptionalMX preference (MX only).
proxiedbooleanOptionalCloudflare orange-cloud (A/AAAA/CNAME only).

Returns

Record

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X PATCH https://api.infrai.cc/v1/dns/record/update \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"zone_id": "...", "record_type": "A", "name": "...", "content": "..."}'

dns.record.delete

DELETE /v1/dns/record/delete

Delete a DNS record from a bound zone (requires record_id).

Parameters

NameTypeRequiredDescription
zone_idstring
Required
Vendor zone id (preferred for get/verify/delete).
record_idstringOptionalThe record id (for update/delete).
record_typestringOptionalRecord type — A, AAAA, CNAME, MX, TXT, NS, SRV.
namestringOptionalRecord name, e.g. www or www.example.com.

Returns

{ ok: boolean }

Example

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at the console: Google/GitHub gives you
# $2 free credit (email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT,
# POST /v1/account/topup and open the returned checkout_url.
export INFRAI_API_KEY="ifr_pk_proj_..."
bash
curl -X DELETE https://api.infrai.cc/v1/dns/record/delete \
  -H "Authorization: Bearer $INFRAI_API_KEY"
Advanced: pin a vendor

By default infrai routes each call to the best available provider — you do not pick a vendor. As an escape hatch, this capability accepts an optional vendor parameter to pin one specific provider. Every live vendor for this capability is available in real time from the discovery endpoint for the capability id — see the discovery API.

GET /v1/discovery/{capability}

dns.domain.add

dns.domain.get

dns.domain.verify

dns.domain.delete

All capabilities

Every routed capability in this module — the complete public REST contract. The methods above are the guided walkthrough; this index is the full reference.

CapabilityEndpointDescription
dns.domain.addPOST /v1/dns/domain/addBind a custom domain by creating a managed DNS zone at the vendor (Cloudflare / Route53 / AliDNS); returns zone_id + name servers. Not domain registration.
dns.domain.deleteDELETE /v1/dns/domain/deleteDelete a bound domain's managed zone at the vendor (requires zone_id).
dns.domain.getGET /v1/dns/domain/getFetch a bound domain (zone) by zone_id or name, returning its state and name servers.
dns.domain.listGET /v1/dns/domain/listList the bound custom domains (managed zones) for the account at the configured DNS vendor.
dns.domain.verifyPOST /v1/dns/domain/verifyVerify a bound domain's activation/delegation against the same vendor zone it was created on (sticky_resource); read-only lookup of zone state.
dns.record.createPOST /v1/dns/record/createCreate a DNS record (A/AAAA/CNAME/TXT/MX) in a bound zone with TTL and optional MX priority / Cloudflare proxying.
dns.record.deleteDELETE /v1/dns/record/deleteDelete a DNS record from a bound zone (requires record_id).
dns.record.listGET /v1/dns/record/listList DNS records in a bound zone.
dns.record.updatePATCH /v1/dns/record/updateUpdate an existing DNS record (by record_id; Route53 uses UPSERT).

End-to-end example

A production-style walkthrough of this module: configure once, then run the flow. It exercises most of the module's APIs.

A copy-paste-runnable single-file Python program (stdlib only, no SDK): set your INFRAI_API_KEY, run it, and walk this module's core flow with REAL billed calls — later steps reuse real fields returned by earlier ones. The 12-line helper is the entire integration.

python
#!/usr/bin/env python3
"""Infrai · dns — runnable real-app example (single file, zero deps).

Copy this file, set your key, run it: every step is a REAL call to
api.infrai.cc, billed at the real (tiny) per-call price, printing the
live JSON response. Get a key at https://console.infrai.cc (Google/
GitHub sign-in grants $2 free credit). No SDK — the 12-line helper
below is the entire integration."""
import json
import os
from urllib import error, request

KEY = os.environ.get("INFRAI_API_KEY") or "ifr_pk_proj_..."  # <- your key
BASE = "https://api.infrai.cc"


# Same raw HTTPS POST/GET as every per-method example on this page —
# wrapped once for reuse. There is nothing else to it: no SDK.
def infrai(method, path, body=None):
    req = request.Request(
        BASE + path, method=method,
        data=json.dumps(body).encode() if body is not None else None,
        headers={"Authorization": f"Bearer {KEY}",
                 "Content-Type": "application/json"})
    try:
        with request.urlopen(req, timeout=60) as r:
            return json.loads(r.read())
    except error.HTTPError as e:
        return json.loads(e.read())


def show(label, resp):
    print(f"\n== {label} ==")
    print(json.dumps(resp, indent=2, ensure_ascii=False))
    return resp


# 1) dns.domain.add — POST /v1/dns/domain/add · Bind a custom domain by creating a managed DNS zone at the vendor (Cloudflare / Route53 / AliDNS); returns zone_id + name servers. Not domain registration.
r1 = show("dns.domain.add", infrai("POST", "/v1/dns/domain/add", {"domain":"..."}))

# 2) dns.domain.verify — POST /v1/dns/domain/verify · Verify a bound domain's activation/delegation against the same vendor zone it was created on (sticky_resource); read-only lookup of zone state.
r2 = show("dns.domain.verify", infrai("POST", "/v1/dns/domain/verify", {"domain":"..."}))

# 3) dns.record.create — POST /v1/dns/record/create · Create a DNS record (A/AAAA/CNAME/TXT/MX) in a bound zone with TTL and optional MX priority / Cloudflare proxying.
r3 = show("dns.record.create", infrai("POST", "/v1/dns/record/create", {"zone_id":"...","record_type":"A","name":"...","content":"..."}))

# 4) dns.domain.get — GET /v1/dns/domain/get · Fetch a bound domain (zone) by zone_id or name, returning its state and name servers.
r4 = show("dns.domain.get", infrai("GET", "/v1/dns/domain/get"))