Try it right now, with no key
One domain, no account, a real slice of the signed record. Keyless calls are throttled to 1 request every 15 seconds per IP - useful for "does this work?", useless for real work. An API key removes the throttle.
The response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Go too fast and you get a 429 with Retry-After - a boundary, not a bug. Lists, history, and exports need a key.
curl https://domaindrift.io/v1/domains/netflix.com
Retry-After - the boundary is in the headers, never a surprise.What is public, what is metered
DomainDrift states its price at the door. Every metered response carries its own meter in the headers, so you never have to guess where you stand.
The public web surface, no account. Rate-limited per IP so the wire stays up.
How the meter works
Not metered. Rate limited per IP only, to keep the wire up.
/health/t/:domain (the time machine)/changes/today, /changes/:date/changes.rss, /changes.json/v1/tapeTry it with no account. One call every 15s per IP; a 429 with Retry-After marks the edge.
How the meter works
Not metered against an account, because there is no account. It is THROTTLED instead: 1 request every 15 seconds per IP, under a shared daily ceiling across all keyless callers. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a throttled call gets a 429 with Retry-After and a link back here. If the shared daily ceiling is spent, the lane closes to a plain "sign in" - never an error.
GET /v1/domains/:domain (one domain, latest, signed)Included with any account. One call = one unit against a daily budget; past it, DRM3 credits. Never a surprise bill.
How the meter works
ONE request = ONE unit, counted against your account - all of your keys share one allowance. Your included allowance is a DAILY budget that resets at 00:00 UTC, and every metered response carries its own meter in the headers (listed below), so you never have to guess where you stand. Past the included allowance, each request draws DRM3 credits from your account's shared balance (the same credits every DRM3 app uses); when that balance is empty you get an HTTP 402 naming the exhausted axis and where to top up. It never silently drops your data, and there is no surprise overage bill.
/v1/domains/v1/domains/:domain/v1/changes/v1/stream/v1/domains/:domain/provenancePay per call in USDC on Base, no account. No payment header answers a 402 that lists the price.
How the meter works
Priced per call in USDC on Base. No key and no account: present an X-PAYMENT header, we verify it, settle it on Base, and serve the call only once the payment has actually moved. If settlement does not go through you are not charged and the call is not served. A keyless call with no payment gets a 402 that IS the price menu.
Any /v1/* read except the signed export bundle (exports need a keyed account)Operators only. Not for sale; a non-admin key gets a 403.
How the meter works
Not metered, because it is not for sale. Non-admin keys get a 403.
/v1/bq/*/v1/enrich-batch/v1/opt-out/v1/domains (POST)/v1/queue/*A metered call answers with these headers so a client can pace itself without a second round trip. Which subset ships depends on your plan: the daily credit plan carries the credit + daily headers, the legacy plan carries the monthly + daily headers. Reset values are Unix seconds.
X-DomainDrift-Usage | Requests counted this month (UTC). |
X-DomainDrift-Usage-Day | Requests counted today (UTC). |
X-DomainDrift-Usage-Period | The month bucket, YYYY-MM (UTC). |
X-DomainDrift-Daily-Allowance | Included requests for today. |
X-DomainDrift-Daily-Remaining | Requests left today. |
X-DomainDrift-Daily-Reset | Unix seconds at the next 00:00 UTC, when the daily allowance resets. |
X-DomainDrift-Credits-Allowance | Daily credit plan: included DomainDrift credits for today. |
X-DomainDrift-Credits-Used | Daily credit plan: DomainDrift credits used today (0.05 per request). |
X-DomainDrift-Credits-Remaining | Daily credit plan: DomainDrift credits left today. |
X-DomainDrift-Credits-Reset | Daily credit plan: Unix seconds until credits reset (next 00:00 UTC). |
X-DomainDrift-Allowance | Legacy monthly plan: included requests this month. |
X-DomainDrift-Remaining | Legacy monthly plan: requests left this month. |
X-DomainDrift-Reset | Legacy monthly plan: Unix seconds until the month resets. |
X-DomainDrift-Burst | Daily burst multiple in force (1 = your day is your share, no batching). |
- Service + scanner keys (they run the pipeline, they are not a customer).
- The public web surfaces above (they carry no key at all).
- Keyless single-domain lookups, which are throttled per IP instead of metered.
- x402 payers, who already paid for the call at the door.
The web, without an account
The public web surface is a real slice of the product, not a screenshot. Where a list is truncated, DomainDrift shows you the true size of what it is holding back - never a silent cut.
- The landing page, the daily change feed (+ RSS/JSON), and the public analytics pages.
- The Time Machine for any domain at /t/<domain>: the LATEST signed observation.
- The embeddable signed badge, universal search, the verifier, and these docs.
- The TOP 3 of every list - with the true, live total shown next to it.
- Every list in full: the catalog, the change wire, services, certificate issuers.
- Domain detail pages, and ALL point-in-time history / time-series.
- Exports: CSV, signed evidence bundles, and change alerts.
- Bring your own: put one of your own domains under watch in a group (paid plans raise the caps).
Agents can also connect over MCP: https://domaindrift.io/mcp (streamable HTTP, stateless). Five read-only tools, the same keys, the same pay gate as this API. Connect snippets on the agents page.
Weighing this against another data provider? How DomainDrift compares puts the record side by side on the two questions an API reference cannot answer: what each observation is signed with, and whether you can re-check it yourself years later.