API Documentation
Public API for querying ENS domain data from the distributed ENSIndexer network. All endpoints return JSON. No authentication required.
/api endpoints. You can call these from any origin.Look up a domain.
Returns domain data with ownership, expiry, resolver, wrapped status, and availability information.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
{
"domain": {
"full_name": "vitalik.eth",
"label": "vitalik",
"namehash": "0xee6c4522...",
"labelhash": "0xaf2caa1c...",
"token_id": "7960091...",
"parent_node": "0x93cdeb7...",
"parent_node_string": "eth",
"expiry_timestamp": "1754000000",
"registry_owner_address": "0xd8dA6BF2...",
"registrar_owner_address": "0xd8dA6BF2...",
"resolver_address": "0x231b0Ee1...",
"effective_owner_address": "0xd8dA6BF2...",
"is_wrapped": false
},
"available": false,
"availabilityStatus": null,
"query": "vitalik.eth"
}
Bulk lookup for multiple domain names. Maximum 500 names per request. Each domain object uses the same field conventions as the single whois endpoint above.
{
"names": ["vitalik.eth", "nick.eth"]
}
{
"results": [
{
"query": "vitalik.eth",
"found": true,
"domain": {
"full_name": "vitalik.eth",
"namehash": "0xee6c4522...",
"label": "vitalik",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2...",
"registry_owner_address": "0xd8dA6BF2...",
"resolver_address": "0x231b0Ee1...",
"is_wrapped": false
}
},
{
"query": "nonexistent.eth",
"found": false,
"domain": null
}
],
"summary": {
"total": 2,
"found": 1,
"not_found": 1,
"expired": 0,
"expiring_30d": 0,
"wrapped": 0
},
"invalidNames": []
}
Search domains with filters. Supports text search, availability filtering, length filtering, and pagination.
| Name | Type | Description |
|---|---|---|
| q | string | Search query (matches label by default) |
| search_full_name | string | Set to true to search full_name instead of label |
| status | string | Filter by availability status:
|
| min_length | integer | Minimum label length |
| max_length | integer | Maximum label length |
| registrar_owner | string | Filter by registrar owner address (exact, case-insensitive) |
| wrapper_owner | string | Filter by wrapper owner address (exact, case-insensitive) |
| registry_owner | string | Filter by registry owner address (exact, case-insensitive) |
| resolver | string | Filter by resolver address (exact, case-insensitive) |
| expiry_from | integer | Minimum expiry (unix timestamp) |
| expiry_to | integer | Maximum expiry (unix timestamp) |
| is_wrapped | string | true or false |
| page | integer | Page number (default 1, 50 results per page) |
| sort_by | string | full_name (default), label, expiry_timestamp, effective_owner_address |
| sort_dir | string | asc (default) or desc |
{
"results": [
{
"full_name": "vitalik.eth",
"label": "vitalik",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2...",
"is_wrapped": false
}
],
"total": 532,
"page": 1,
"pageSize": 50,
"stats": {
"expired": 12,
"expiring_30d": 3,
"expiring_90d": 8,
"wrapped": 210,
"wrapped_pct": 39.5
}
}
Get all on-chain events for a domain. Only non-null fields are included in each event object.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
{
"events": [
{
"contract": "CONTROLLER_9380470",
"event_type": "NameRegistered",
"block_number": 9380471,
"transaction_hash": "0xabc...",
"owner_address": "0xd8dA6BF2...",
"cost_wei": "3200000000000000",
"expiry_timestamp": "1754000000"
},
{
"contract": "REGISTRY",
"event_type": "NewOwner",
"block_number": 9380471,
"transaction_hash": "0xabc...",
"owner_address": "0xd8dA6BF2..."
}
]
}
List direct subdomains of a domain, with pagination.
| Name | Type | Description |
|---|---|---|
| name | string | Parent domain name (e.g. vitalik.eth) |
| Name | Type | Description |
|---|---|---|
| page | integer | Page number (default 1) |
| sort_by | string | full_name (default full_name) |
| sort_dir | string | asc or desc (default asc) |
{
"domain": "vitalik.eth",
"results": [
{
"full_name": "sub.vitalik.eth",
"label": "sub",
"expiry_timestamp": null,
"effective_owner_address": "0xd8dA6BF2...",
"resolver_address": "0x231b0Ee1...",
"is_wrapped": false
}
],
"total": 3,
"page": 1,
"pageSize": 50
}
Registration and renewal history for a domain.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
| merged | string | true (default) merges events from the same transaction; false returns individual events with a contract field |
{
"domain": "vitalik.eth",
"registrations": [
{
"event_type": "NameRegistered",
"block_number": 9380471,
"transaction_hash": "0xabc...",
"cost_wei": "3200000000000000",
"cost_eth": "0.003200",
"expiry_timestamp": "1754000000",
"owner_address": "0xd8dA..."
}
],
"renewals": [],
"total_cost_eth": "0.003200"
}
Returns current resolver records for a domain: text records, multi-chain addresses, and contenthash.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
| Name | Type | Description |
|---|---|---|
| types | string | Comma-separated: text, addr, contenthash (default: all) |
{
"domain": "vitalik.eth",
"resolver_address": "0x231b0Ee1...",
"records": {
"texts": {
"com.twitter": "VitalikButerin",
"avatar": "eip155:1/..."
},
"addresses": {
"60": "0xd8dA6BF2..."
},
"contenthash": null
}
}
Look up a single text record for a domain.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
| key | string | Text record key (e.g. com.x, avatar) |
{
"domain": "vitalik.eth",
"key": "com.x",
"value": "VitalikButerin",
"block_number": 18500000,
"transaction_hash": "0xabc..."
}
Effective ownership history for a domain, derived from on-chain events.
Returns ownership periods with the resolved effective owner at each point in time.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
| audit | string | true to include per-contract breakdown (registry, registrar, wrapper arrays). Default false |
{
"history": [
{
"address": "0xd8dA6BF2...",
"reason": "registrar",
"from_block": 9500000,
"from_tx": "0xdef456...",
"to_block": null,
"to_tx": null
}
]
}
Resolver change history derived from stored on-chain events. Each entry represents a period where a specific resolver contract was active for the domain.
| Name | Type | Description |
|---|---|---|
| name | string | Full ENS name (e.g. vitalik.eth) |
{
"history": [
{
"address": "0x4976fb03...",
"from_block": 9412610,
"from_tx": "0xdef456...",
"to_block": 16773775,
"to_tx": "0x789abc..."
},
{
"address": "0x231b0Ee1...",
"from_block": 16773775,
"from_tx": "0x789abc...",
"to_block": null,
"to_tx": null
}
]
}
Look up a domain by any hash. Tries namehash first (unique match), then falls back to labelhash (may match multiple domains).
| Name | Type | Description |
|---|---|---|
| hash | string | A 66-character hex string (0x + 64 hex chars) |
{
"type": "namehash",
"domain": {
"full_name": "vitalik.eth",
"label": "vitalik",
"token_id": "7960091...",
"namehash": "0xee6c4522...",
"labelhash": "0xaf2caa1c...",
"parent_node_string": "eth",
"parent_node": "0x93cdeb7...",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2..."
}
}
{
"type": "labelhash",
"domains": [
{
"full_name": "vitalik.eth",
"label": "vitalik",
"token_id": "7960091...",
"namehash": "0xee6c4522...",
"labelhash": "0xaf2caa1c...",
"parent_node_string": "eth",
"parent_node": "0x93cdeb7...",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2..."
}
]
}
{
"type": "none"
}
Look up a single domain by its namehash. Returns full domain details including ownership, resolver, and wrapped status.
| Name | Type | Description |
|---|---|---|
| hash | string | Namehash — a 66-character hex string (0x + 64 hex chars) |
{
"found": true,
"domain": {
"full_name": "vitalik.eth",
"label": "vitalik",
"token_id": "7960091...",
"namehash": "0xee6c4522...",
"labelhash": "0xaf2caa1c...",
"parent_node_string": "eth",
"parent_node": "0x93cdeb7...",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2...",
"resolver_address": "0x231b0Ee1...",
"registry_owner_address": "0xd8dA6BF2...",
"registrar_owner_address": "0xd8dA6BF2...",
"is_wrapped": false
}
}
Look up domains by labelhash. A labelhash can match multiple domains across different parent names (e.g. vitalik.eth and vitalik.xyz share the same labelhash). Returns up to 100 results.
| Name | Type | Description |
|---|---|---|
| hash | string | Labelhash — a 66-character hex string (0x + 64 hex chars) |
{
"domains": [
{
"full_name": "vitalik.eth",
"label": "vitalik",
"token_id": "7960091...",
"namehash": "0xee6c4522...",
"labelhash": "0xaf2caa1c...",
"parent_node_string": "eth",
"parent_node": "0x93cdeb7...",
"expiry_timestamp": "1754000000",
"effective_owner_address": "0xd8dA6BF2..."
}
],
"total": 1
}