CONTINUOUS INTERNET TELEMETRY24H DRIFT3,805 material changesacross 3,357 domains · last 24h · -6,610 vs yesterdayDNS DRIFT207 domains changed DNS providertop destination cloudflare.com · -452 vs yesterdayEMAIL DRIFT33 domains switched email providertop destination google.com · -134 vs yesterdayCERT DRIFT43 domains switched issuing CA24h · -176 vs yesterdayNOW506 curated domains not reachable-197 vs yesterdaySITE ERRORS17,350 sites serving errorslast probe · 5xx / 404 / TLSBOT DEFENSEbot defense observed on 98,679 sites429 rate-limit / 403 bot-block, a posture signal
Docs / The API

The API

One metered door, the same for everyone: /v1. It starts keyless, a free account raises it, and every response is built to be verified, not just believed. The interactive reference with your own key and live meter is the API console; the OpenAPI 3.1 spec is at /v1/openapi.json.

Keyless: the first look

curl https://domaindrift.io/v1/domains/example.com

No key, no signup: one domain at a time, the latest observation, as a reduced preview - the derived facts (who runs the nameservers, mail, and CDN; certificate issuer and expiry; reachability; scan time; snapshot id) plus per-type record counts. One request every 15 seconds per IP, under a shared daily ceiling.

The preview deliberately carries no signature. A signature commits to the exact bytes of the full record, so one attached to a reduced subset could never verify - shipping it would hand you a check guaranteed to fail. Instead the preview carries the receipt pointer: the receipt id, the full record's output hash, the signing key, and a public /receipts/<id> URL you can resolve right now, keyless.

Authentication

# either header works
curl -H "X-DomainDrift-Key: dd_..." https://domaindrift.io/v1/domains/example.com
curl -H "Authorization: Bearer dd_..." https://domaindrift.io/v1/domains/example.com

Mint a key from the API console with a free account. A keyed call returns the complete record and opens every read endpoint below.

The read surface

EndpointWhat it returns
GET /v1/domainsThe list, with filters (category, tag, search); ?format=csv for a download.
GET /v1/domains/:domainThe latest signed record (keyless: reduced preview; keyed: full).
GET /v1/domains/:domain/historyThe snapshot time series for one domain.
GET /v1/domains/:domain/provenanceThe Ed25519 receipt chain for one domain.
GET /v1/domains/:domain/planesThe latest observation per data plane, with completeness.
GET /v1/changesThe global change feed as structured deltas, with sync cursors.
GET /v1/streamLive Server-Sent Events: scans, changes, receipts.
GET /v1/stream/jsonThe polling fallback when you cannot hold an SSE open.
GET /v1/groupsYour bring-your-own-domain monitoring groups.
GET /v1/alertsYour alert subscriptions (POST to create, DELETE to remove).
GET /v1/usageYour metered usage for the period.
GET /v1/evidence/:domainA printable, signed evidence report for auditors.
GET /v1/domains/:domain/bundleA signed, offline-verifiable export bundle (paid, rate-capped).

Discovery, for humans and agents

EndpointWhat it is
GET /v1/openapi.jsonOpenAPI 3.1 - every endpoint and schema.
GET /.well-known/domaindrift-keys.jsonThe Ed25519 public keys that sign every observation.
GET /receipts/:idResolve any receipt by id - public, keyless.
GET /llms.txtThe plain-text site and API map for language models (/llms-full.txt for the long form).
GET /badge/:domain.svgAn embeddable signed status badge for any domain.
GET /v1/tapeThe 24-hour rollup as JSON. CORS-open, safe to embed.
POST /mcpA read-only MCP server (streamable HTTP, stateless): lookup_domain, whats_changed_today, resolve_receipt, internet_tape, signing_keys. Descriptor at /.well-known/mcp.json.

The MCP tools are names for the same HTTP routes and pass through the same access lanes: keyless calls get the reduced preview under the same throttle; send your key as Authorization: Bearer to open the complete record. If you are pointing an AI agent at DomainDrift, start at the machine front door - it is the same surface, arranged for agents.

The meter, in the open

Every metered response tells you where you stand: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset ride on the response, and a 429 carries Retry-After plus a body that names the limit and where to raise it. API use is metered in DomainDrift credits - an API request is 0.05 credits against your daily allowance, and past it, requests meter from your DRM3 credit balance. The full model: Plans & limits.

Try it without writing code

The playground runs real read-only calls from the browser, and the API console is the full interactive reference with your key, your usage, and copyable requests for every endpoint.