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,
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
},
"query": "vitalik.eth"
}
{
"domain": null,
"available": true,
"query": "unregistered12345.eth",
"resolution": { "status": "unregistered" }
}
{
"domain": null,
"query": "sub.vitalik.eth",
"resolution": {
"status": "ensip10_possible",
"parent_name": "vitalik.eth",
"parent_found": true,
"parent_resolver_indexed": true
}
}
| Status | Meaning | Fields |
|---|---|---|
| indexed_resolver | Resolver is one we index — records are authoritative | indexed=true, chain, address |
| unindexed_resolver | Resolver is not indexed — records may be stale | indexed=false, address |
| no_resolver | Resolver is null/zero — resolves via ENSIP-10 on parent | indexed=false |
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. Found domains include a resolver object; not-found names include a resolution object.
{
"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
},
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
}
},
{
"query": "nonexistent.eth",
"found": false,
"domain": null,
"resolution": { "status": "unregistered" }
}
],
"summary": {
"total": 2,
"found": 1,
"not_found": 1,
"expired": 0,
"expiring_30d": 0,
"wrapped": 0,
"indexed_resolver": 1,
"unindexed_resolver": 0,
"no_resolver": 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. The resolver object indicates whether the records are authoritative (indexed resolver) or potentially stale (unindexed resolver).
| 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": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
},
"records": {
"texts": {
"com.twitter": "VitalikButerin",
"avatar": "eip155:1/..."
},
"addresses": {
"60": "0xd8dA6BF2..."
},
"contenthash": null
}
}
Look up a single text record for a domain. Includes resolver metadata indicating whether the record is authoritative.
| 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",
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
},
"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...",
"resolver_address": "0x231b0Ee1..."
},
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
}
}
{
"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...",
"resolver_address": "0x231b0Ee1...",
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
}
}
]
}
{
"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
},
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
}
}
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...",
"resolver_address": "0x231b0Ee1...",
"resolver": {
"status": "indexed_resolver",
"indexed": true,
"chain": "mainnet",
"address": "0x231b0ee1..."
}
}
],
"total": 1
}