Mercury · Cited Dns
GET /buy/dns
What it does
Domain → a SIGNED, timestamped DNS snapshot (A, AAAA, MX, NS, TXT, CNAME, SOA), normalised + sorted into a byte-stable record set with an offline-verifiable provenance receipt — proving exactly what the zone resolved to at that moment. Keyless, no LLM, no signup. (Normalisation is deterministic; DNS itself is mutable across time/TTL/geo — which is the very reason the snapshot is timestamped + signed.)
The goal it serves: pin a domain's infrastructure records to a timestamped, offline-verifiable receipt — evidence-grade domain facts.
Schemas & output preview
Input schema — the exact request shape the route validates.
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"maxLength": 253,
"description": "the domain to resolve (e.g. example.com). A full URL is also accepted; its hostname is used."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "alternative to ?domain= — any http/https URL; the registrable hostname is resolved."
}
},
"additionalProperties": false
}Output schema — the exact response shape the handler returns.
{
"type": "object",
"properties": {
"ok": {
"type": "boolean",
"description": "true on success; false on an honest failure (never charged for a stub)"
},
"url": {
"type": "string",
"description": "the resolved domain (echoed in the `url` field for gate uniformity)"
},
"domain": {
"type": "string",
"description": "the normalised, lower-cased, trailing-dot-stripped domain that was resolved"
},
"status": {
"type": "integer",
"description": "200 on a successful resolve (HTTP-shaped status for gate uniformity)"
},
"text": {
"type": "string",
"description": "canonical sorted-key JSON of `data` — the exact string the receipt signs over"
},
"resolvedAt": {
"type": "string",
"description": "ISO-8601 resolve time (provenance metadata; binds WHEN the snapshot was taken)"
},
"fetchedAt": {
"type": "string",
"description": "alias of resolvedAt for gate/receipt uniformity"
},
"data": {
"type": "object",
"description": "the deterministic, normalised DNS snapshot",
"properties": {
"domain": {
"type": "string"
},
"resolver": {
"description": "pinned resolver IPs used, or 'system'",
"type": [
"array",
"string"
],
"items": {
"type": "string"
}
},
"records": {
"type": "object",
"description": "normalised record sets keyed by type (A, AAAA, MX, NS, TXT, CNAME, SOA); sorted + de-duplicated",
"properties": {
"A": {
"type": "array",
"items": {
"type": "string"
}
},
"AAAA": {
"type": "array",
"items": {
"type": "string"
}
},
"MX": {
"type": "array",
"items": {
"type": "object",
"properties": {
"priority": {
"type": "integer"
},
"exchange": {
"type": "string"
}
}
}
},
"NS": {
"type": "array",
"items": {
"type": "string"
}
},
"TXT": {
"type": "array",
"items": {
"type": "string"
}
},
"CNAME": {
"type": "array",
"items": {
"type": "string"
}
},
"SOA": {
"type": [
"object",
"null"
],
"properties": {
"nsname": {
"type": "string"
},
"hostmaster": {
"type": "string"
},
"serial": {
"type": "integer"
},
"refresh": {
"type": "integer"
},
"retry": {
"type": "integer"
},
"expire": {
"type": "integer"
},
"minttl": {
"type": "integer"
}
}
}
}
},
"summary": {
"type": "object",
"description": "record counts per type (derived, deterministic)"
},
"flags": {
"type": "object",
"description": "derived convenience flags (hasSpf, hasDmarc) pointing into TXT"
},
"partialErrors": {
"type": "object",
"description": "present only if a record type had a transport error; never fabricated data"
},
"snapshot": {
"type": "string",
"description": "rubric/version tag: mercury-cited-dns-v1"
}
}
},
"error": {
"type": "string",
"description": "present only when ok:false"
}
},
"required": [
"ok",
"url"
],
"additionalProperties": true
}Output preview — a real example response, shown free (you only pay when you call the route).
{
"ok": true,
"url": "iana.org",
"domain": "iana.org",
"status": 200,
"resolvedAt": "2026-06-04T00:00:00.000Z",
"fetchedAt": "2026-06-04T00:00:00.000Z",
"text": "{\"domain\":\"iana.org\",\"flags\":{\"hasDmarc\":false,\"hasSpf\":true},\"records\":{…},\"resolver\":[\"1.1.1.1\",\"8.8.8.8\"],\"snapshot\":\"mercury-cited-dns-v1\",\"summary\":{…}}",
"data": {
"domain": "iana.org",
"resolver": [
"1.1.1.1",
"8.8.8.8"
],
"records": {
"A": [
"192.0.43.8"
],
"AAAA": [
"2001:500:88:200::8"
],
"MX": [
{
"priority": 10,
"exchange": "mail.iana.org"
}
],
"NS": [
"a.iana-servers.net",
"b.iana-servers.net"
],
"TXT": [
"v=spf1 -all"
],
"CNAME": [],
"SOA": {
"nsname": "ns.icann.org",
"hostmaster": "noc.dns.icann.org",
"serial": 2026060400,
"refresh": 7200,
"retry": 3600,
"expire": 1209600,
"minttl": 3600
}
},
"summary": {
"A": 1,
"AAAA": 1,
"MX": 1,
"NS": 2,
"TXT": 1,
"CNAME": 0,
"SOA": 1
},
"flags": {
"hasSpf": true,
"hasDmarc": false
},
"snapshot": "mercury-cited-dns-v1"
}
}Pay & call
Your agent calls the route; the 402 challenge carries the exact price ($0.006, USDC on Base mainnet); the x402 client settles via the CDP facilitator and retries. No key, no signup.
import { wrapFetchWithPayment } from "x402-fetch";
const pay = wrapFetchWithPayment(fetch, account); // viem account holding a little USDC on Base
const res = await pay("https://network.mercury-hq.com/buy/dns?domain=example.com");
const out = await res.json(); // the result + `attestation` (the signed receipt)Prepaid alternative — the same route accepts an API key:
# Same route, prepaid API-key rail (Bearer mk_live_…) — get a key at https://network.mercury-hq.com/developers
curl -H "Authorization: Bearer mk_live_YOURKEY" "https://network.mercury-hq.com/buy/dns?domain=example.com"Verify the receipt
Recover the EIP-191 signature over sha256(content)‖url‖status‖fetchedAt‖nonce and confirm the signer equals the pinned attestation key 0xACB40253BD71Bb9a5d491b2c6EFF755F2A33Fc75 (published at /.well-known/mercury-attestation). No callback to Mercury — the receipt verifies offline, forever. Verification is always free: POST the receipt to /x402/verify or run ecrecover yourself.
| Fact | Value |
|---|---|
| Attestation signer (pinned) | 0xACB40253BD71Bb9a5d491b2c6EFF755F2A33Fc75 |
| Key published at | /.well-known/mercury-attestation |
| Live verifier (free) | /x402/verify |
| Settlement | real USDC on Base mainnet (eip155:8453) via CDP — auditable on BaseScan |
Related
More: all services · /catalog · the headline web-fetch · agent twin of this page: GET /university/docs/cited-dns?format=md