API Documentation
Direct API for an individual ENS indexer node. These are the internal endpoints that each indexer exposes. For the public API with load balancing and retry logic, use https://docs.enswhois.com/api.
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
}