dns.basaltic.sh, no region segment.
The public namespace is not regional.
Create and delegate
Records
Health checks
served tells you.Geo routing
DNSSEC
Creating a zone
nameservers array — that is what you copy into your registrar to delegate the
domain.
Proving ownership
The proof exists so nobody can create a zone for a subdomain of a domain they do not own and sit inside your subtree. Which method you use depends on where the domain points right now.- Domain still at your old provider
- Domain already delegated to us
- Subdomain of a zone you own
ownership block names a TXT record. Publish it at your current
provider — before you delegate anything — then call verify:When re-confirmation starts failing
A zone whose periodic re-proof is failing grows anownership.recheck_deadline — the instant it stops answering unless the check
passes again. Absent means healthy.
Reaching that date takes sustained failure, not one bad afternoon: every pass
re-checks a failing zone, so a transient resolver problem clears itself. Your
organization’s owner is emailed when the deadline is set, and again if the zone
does stop resolving — a zone is never taken off the air before that message has
gone out.
To clear it deliberately, republish the challenge (or point the delegation back
at our nameservers) and call verify-ownership again. That is the one case
where an already-verified zone can answer 400, because there the call runs
the check for real.
Records
A record is an RRset: one name, one type, and avalues array. Updating a
record replaces the value list wholesale.
disabled: true — retained but not served, which is useful for
staging a change before it goes live.
Platform-managed records
Records withmanaged: true are read-only: the SOA, the apex NS set, and the
whole DNSSEC family. They appear in reads so you can see the zone as it really
is, but they cannot be created, updated or deleted through the API.
Importing a zone file
POST /v1/zones/{zone_id}/import takes an RFC 1035 master file — the BIND
format every provider exports. Send it as JSON in zone_file, or as the raw
body under any other content type, so this works directly:
It merges, it never replaces
It merges, it never replaces
It is all or nothing
It is all or nothing
Some records are skipped by design
Some records are skipped by design
RRSIG, DNSKEY, DS, NSEC, NSEC3, NSEC3PARAM, CDS,
CDNSKEY) are generated by our signer from keys your file cannot know.
Records placed outside the zone are skipped too.Every one comes back in skipped with a reason. A file exported from a
signed zone carries all of them, so refusing the file over them would make
export/import unusable.Health-checked failover
Attach a check to anA or AAAA record and the nameservers stop answering
with targets that are down.
0 and 1 is a failover pair while 0 and 0 is
active/active. The nameservers answer with the healthy targets at the
most-preferred tier, fall through to the next tier when those go unhealthy,
and — if nothing is healthy anywhere — answer with every configured value
rather than nothing.
GET on the health check returns a served array: the values the
nameservers are answering with right now. The record’s own values stay
whatever you configured. The difference between the two is the failover,
so it is reported rather than left for you to infer.Why there is no UDP probe
Why there is no UDP probe
http,
https and tcp are offered.https does not verify the certificate
https does not verify the certificate
Private addresses are refused
Private addresses are refused
A new target is answered before its first probe
A new target is answered before its first probe
initial, and initial is
answered. A freshly created record resolves immediately instead of
being dark until the first probe lands.Thresholds are damping, not decoration
Thresholds are damping, not decoration
healthy_threshold and
unhealthy_threshold (both default 3) decide how many consecutive
results it takes to move, and timeout_sec must stay below
interval_sec or a slow target’s probes overlap each other.Geo routing
A record can carry named answer variants, each scoped to a set of client prefixes, so a query is answered with the values closest to whoever asked.values stay the default — what a query matching no
prefix is answered with, which is most of the internet. So answers describes
overrides, never the fallback; the fallback cannot be deleted, and default is
a reserved label. PUT replaces the whole configuration, and GET reports the
default alongside the variants rather than leaving it implicit.
A, AAAA and CNAME records can carry variants — those are what
“send this client somewhere closer” means. A variant only changes rdata, so
nothing structural stops MX or SRV, but each brings its own question and
none is what this is for.How a client is matched
Selection is longest-prefix match, so overlapping prefixes of different lengths are meaningful rather than a conflict — a/8 and a /16 inside it do
what you would expect. The same prefix on two variants is rejected, because
that would make the answer depend on row order and let two nameservers disagree
about one query.
Matching uses the EDNS Client Subnet prefix when the resolver sends one, and
the query’s source address otherwise. A rule more specific than what the
resolver actually asserted is skipped, not matched: beyond the ECS source
netmask the address is zeros the resolver never claimed, and matching them would
route a whole /8 to whichever /24 happens to sit at its base.
Write prefixes as the network address — 185.0.0.0/8, not 185.1.2.3/8.
Why the limits are what they are
8 variants per record
8 variants per record
64 prefixes per record
64 prefixes per record
A variant with no prefixes is refused
A variant with no prefixes is refused
A CNAME variant takes exactly one value
A CNAME variant takes exactly one value
Private zones
A zone ispublic or private, fixed at creation.
vpc-associations endpoints.
private
zone with no vpc_ids, and a public zone that carries them, both answer
400.DNSSEC
DNSSEC is on for every zone created through this API — there is no switch, and no unsigned mode. The signer bootstraps the zone and thednssec block
appears on it, carrying the key tags, the algorithm (13, ECDSA P-256
SHA-256), and the DS records.
To complete the chain of trust, paste the DS record at your parent
registrar:
Read the DS records off the zone
dnssec.ds_records holds them. Each also carries rdata — the zone-file
form of the same record, for registrars that want a single string.Publish it at the registrar
Validate
Limits and behaviour
0.Troubleshooting
The zone does not resolve at all
The zone does not resolve at all
ownership.verified. A zone with no zone above it on the platform
does not answer until ownership is proved — creating it is not claiming
it. See proving ownership for which of the two
methods applies to you.A name resolves for some people and SERVFAILs for others
A name resolves for some people and SERVFAILs for others
DNSSEC validation fails everywhere
DNSSEC validation fails everywhere
dnssec.ds_records on the zone — a DS
left over from a previous provider breaks validation exactly as
thoroughly as none at all.Failover is not switching
Failover is not switching
GET the health check and read served against the targets’ status.
A target still in initial has no verdict yet and is answered on purpose.
Remember thresholds default to three consecutive results, so a flapping
target takes three intervals to move in either direction.Everyone gets the same geo answer
Everyone gets the same geo answer
GET on the geo routing: default is the answer the bulk of the
internet receives, and it is the one to get right.Also confirm the prefix is written as a network address: 185.1.2.3/8 is
not the same rule as 185.0.0.0/8.An import did not remove the records I deleted
An import did not remove the records I deleted