Public API for querying ENS domain data. All endpoints return JSON.
Pass your key via the X-API-Key header. Sign up to get a key with 1,000 free credits.
Pay per request using the MPP protocol. No account needed — pay directly from your wallet.
No authentication is needed to try the API - unauthenticated requests are limited to 5 per minute. Sign up for unlimited access.
/api endpoints. You can call these from any origin.Get indexer statistics including block progress, domain counts, event counts, and sync status.
{
"name": "indexer-1",
"blocks": {
"chainHead": 21500000,
"fetched": 21499950,
"processed": 21499900
},
"services": {
"fetcher": { "running": true, "synced": true },
"processor": { "running": true, "synced": true },
"addressProcessor": { "running": true }
},
"queues": {
"domainsPending": 0,
"domainsReady": 0,
"eventsPending": 12,
"eventsPendingNamehashes": 5,
"eventsDirect": 3,
"cachedMappings": 1500
},
"addressProcessor": {
"addressCount": 245000,
"eventsRemaining": 0,
"lastEventId": 8500000
}
}
Get count of pending (unhashed) domains awaiting label resolution.
{
"pendingCount": 1234
}
Global ENS overview. Public endpoint, no API key required. Cached for 5 minutes.
{
"total_domains": 2145000,
"active_domains": 1890000,
"expired_domains": 255000,
"wrapped_domains": 620000,
"wrapped_percentage": 32.8,
"expiring_30d": 18500,
"expiring_90d": 52000,
"unique_owners": 485000,
"total_events": 8200000,
"registrations_24h": 340,
"registrations_7d": 2800,
"renewals_7d": 4100,
"generated_at": "2026-04-09T12:00:00Z"
}
30-day daily registration and renewal counts. Public, cached for 15 minutes.
{
"daily": [
{ "date": "2026-04-08", "registrations": 340, "renewals": 520 }
],
"generated_at": "2026-04-09T12:00:00Z"
}
Domain label length and TLD distribution. Public, cached for 1 hour.
{
"eth_label_length": [
{ "length": 3, "count": 45000, "percentage": 2.4 }
],
"all_label_length": [
{ "length": 3, "count": 52000, "percentage": 2.1 }
],
"by_tld": [
{ "tld": "eth", "count": 1800000, "note": "active" },
{ "tld": "xyz", "count": 12000, "note": "all_time" }
],
"by_subname_parent": [
{ "parent": "dcl.eth", "count": 95000 }
],
"generated_at": "2026-04-09T12:00:00Z"
}
Primary name (reverse record) adoption statistics. Public, cached for 1 hour.
{
"unique_addresses_with_primary_name": 485000,
"unique_domain_owners": 908000,
"adoption_percentage": 53.4,
"multi_chain_count": 12000,
"by_registrar": [
{ "registrar": "addr.reverse", "chain": "Mainnet (legacy)", "with_name": 420000, "cleared": 15000 },
{ "registrar": "80002105.reverse", "chain": "Base", "with_name": 45000, "cleared": 2000 }
],
"generated_at": "2026-04-09T12:00:00Z"
}
How the ENSv2 .eth registry lines up with v1. Live v1 names (active or within the 90-day grace period) are classified as in_sync (v2 reservation at v1 expiry + 62 days), pending_sync (v1 renewed since the last sync run), migrated, not_resolving (v2 reservation lapsed during the last 28 days of v1 grace) or not_reserved. Also returns ENS Labs' daily pre-migration sync activity (premigration_sync) for the last 14 days and the value of the one-time 62-day bonus at ENSv2 prices. Public; recomputed every 30 minutes.
{
"v1": { "active": 783864, "in_grace": 121655, "total": 905519 },
"coverage": {
"in_sync": 861790, "pending_sync": 193, "migrated": 0,
"not_resolving": 42986, "not_reserved": 550,
"stops_resolving_30d": 40995, "covered": 861983, "covered_pct": 95.19
},
"v2_registry": { "reserved": 917831, "registered": 0, "unregistered": 0 },
"premigration_sync": {
"batch_registrar": "0xf0ccfbf6dba1e01ccb833ced6d551a8f000e9721",
"last_block": 26228414, "last_ts": 1792434467,
"daily": [{ "date": "2026-10-19", "reserved": 380, "renewed": 183, "first_ts": 1792434311, "last_ts": 1792434467, "first_block": 26180210, "last_block": 26180222, "txs": 12, "first_tx": "0x...", "last_tx": "0x..." }]
},
"bonus": { "seconds": 5356800, "reserved_by_length": { "3": 3438, "4": 11388, "5": 847210 }, "total": 1834537, "by_length": { "3": 373753, "4": 309504, "5": 1151280 } },
"generated_at": "2026-10-20T14:32:42.000Z"
}
The names behind the ENSv2 coverage counts, 25 per page. Lists are rebuilt every 30 minutes with the counts in /api/ens-stats/ensv2. Public.
| Name | Type | Description |
|---|---|---|
| state | string | not_resolving (soonest release first), stops_resolving_30d (soonest v2 expiry first), pending_sync or not_reserved |
| page | number | Page number, default 1 |
{
"state": "not_resolving",
"page": 1, "per_page": 25, "total": 43019, "total_pages": 1721,
"computed_at": "2026-10-20T15:30:00.000Z",
"names": [
{ "name": "example.eth", "labelhash": "0x...", "v1_expiry": 1784982000, "v2_expiry": 1790338800, "released_at": 1792758000 }
]
}
v1 .eth names migrated to ENSv2, near real time (cached for 15 seconds): totals, the share of live names from v1, migrations per UTC day (and per UTC hour over the last 7 days) and the latest migrations, 25 per page, newest first. path is unlocked (unwrapped, or wrapped but not locked) or locked (wrapped with CANNOT_UNWRAP burned). Names registered new on ENSv2 aren't migrations. Public.
| Name | Type | Description |
|---|---|---|
| page | number | Page number, default 1 |
{
"generated_at": "2026-10-27T14:00:00.000Z",
"summary": { "total": 39, "last_24h": 39, "today": 39, "by_path": { "unlocked": 37, "locked": 2 }, "live_from_v1": 898453, "pct_of_live": 0.0043 },
"daily": [{ "date": "2026-10-27", "migrations": 39 }],
"hourly": [{ "hour": "2026-10-27T13", "migrations": 21 }],
"page": 1, "per_page": 25, "total_pages": 2,
"migrations": [
{ "name": "hoverfly.eth", "labelhash": "0x...", "owner": "0xd3b2...", "path": "unlocked", "controller": "0xab82...", "block_number": 26282920, "block_timestamp": 1793080000, "transaction_hash": "0x..." }
]
}
The names one day's pre-migration sync reserved or renewed on the v2 .eth registry, 25 per page, in the order the BatchRegistrar wrote them. Covers the 14 days listed in premigration_sync.daily of /api/ens-stats/ensv2. Public.
| Name | Type | Description |
|---|---|---|
| date | string | UTC date, YYYY-MM-DD |
| type | string | reserved (newly reserved) or renewed (v2 expiry moved forward) |
| page | number | Page number, default 1 |
{
"date": "2026-10-19", "type": "renewed",
"page": 1, "per_page": 25, "total": 183, "total_pages": 8,
"first_ts": 1792434300, "last_ts": 1792434420,
"names": [
{ "name": "example.eth", "labelhash": "0x...", "v2_expiry": 1830000000, "block_number": 26180000, "transaction_hash": "0x..." }
]
}
Latest ENS events (registrations, renewals, transfers, wraps, primary name changes), including ENSv2 registrations, renewals, migrations (type: "migration", with owner) and transfers, and renewals of unmigrated v1 names through ETHRenewerV1 (via: "eth_renewer_v1"). Payments made in a stablecoin carry cost_usd and payment_symbol (USDC or DAI). A paid v1 renewal has cost_eth and also cost_usd with payment_symbol: "ETH" and duration; one through the 2023 controller, which logs the amount sent rather than the price, has cost_eth null and sent_eth. Public, cached for 30 seconds.
Events are newest first by block time. block_timestamp is null for a just-indexed event whose block time isn't known yet; its place is estimated from its chain's head block. v1 events carry event_id and ENSv2 events carry ensv2_event_id, registry: "ensv2" and a cost_usd (paid in a stablecoin) instead of cost_eth. To poll for newer events, pass since (the highest event_id seen) and since_ensv2 (the response's latest_ensv2_event_id). A request with since but no since_ensv2 returns no ENSv2 events, so older clients never see them repeated.
{
"events": [
{
"type": "registration",
"name": "example.eth",
"cost_eth": "0.003",
"years": 5,
"block_number": 21500000,
"transaction_hash": "0x..."
},
{
"type": "primary_name",
"address": "0xd8dA...",
"name": "vitalik.eth",
"chain": "Base",
"block_number": 21499990,
"transaction_hash": "0x..."
}
],
"generated_at": "2026-04-09T12:00:00Z"
}