ENS Indexer API

API Documentation

Home

Public API for querying ENS domain data from the distributed ENSIndexer network. All endpoints return JSON. No authentication required.

https://ensindexer.com/api
CORS is enabled for all /api endpoints. You can call these from any origin.

Lookup

GET /api/whois/:name

Look up a domain.

Returns domain data with ownership, expiry, resolver, wrapped status, and availability information.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)

Example Response

{
  "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"
}
POST /api/whois/bulk

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.

Request Body

{
  "names": ["vitalik.eth", "nick.eth"]
}

Example Response

{
  "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": []
}
GET /api/search-domains

Search domains with filters. Supports text search, availability filtering, length filtering, and pagination.

Query Parameters

NameTypeDescription
qstringSearch query (matches label by default)
search_full_namestringSet to true to search full_name instead of label
statusstringFilter by availability status:
  • registered — Active domains with expiry in the future, or no expiry (e.g. subdomains)
  • grace — Expired within the last 90 days; renewable
  • premium — Expired 90–111 days ago; anyone can re-register at a declining premium price
  • expired — Expired beyond the premium period; re-registerable at base price
min_lengthintegerMinimum label length
max_lengthintegerMaximum label length
registrar_ownerstringFilter by registrar owner address (exact, case-insensitive)
wrapper_ownerstringFilter by wrapper owner address (exact, case-insensitive)
registry_ownerstringFilter by registry owner address (exact, case-insensitive)
resolverstringFilter by resolver address (exact, case-insensitive)
expiry_fromintegerMinimum expiry (unix timestamp)
expiry_tointegerMaximum expiry (unix timestamp)
is_wrappedstringtrue or false
pageintegerPage number (default 1, 50 results per page)
sort_bystringfull_name (default), label, expiry_timestamp, effective_owner_address
sort_dirstringasc (default) or desc

Example Response

{
  "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
  }
}

Events & Sub-Resources

GET /api/domain/:name/events

Get all on-chain events for a domain. Only non-null fields are included in each event object.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)

Example Response

{
  "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..."
    }
  ]
}
GET /api/domain/:name/subdomains

List direct subdomains of a domain, with pagination.

Parameters

NameTypeDescription
namestringParent domain name (e.g. vitalik.eth)

Query Parameters

NameTypeDescription
pageintegerPage number (default 1)
sort_bystringfull_name (default full_name)
sort_dirstringasc or desc (default asc)

Example Response

{
  "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
}
GET /api/domain/:name/registration-history

Registration and renewal history for a domain.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)
mergedstringtrue (default) merges events from the same transaction; false returns individual events with a contract field

Example Response

{
  "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"
}
GET /api/domain/:name/records

Returns current resolver records for a domain: text records, multi-chain addresses, and contenthash.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)

Query Parameters

NameTypeDescription
typesstringComma-separated: text, addr, contenthash (default: all)

Example Response

{
  "domain": "vitalik.eth",
  "resolver_address": "0x231b0Ee1...",
  "records": {
    "texts": {
      "com.twitter": "VitalikButerin",
      "avatar": "eip155:1/..."
    },
    "addresses": {
      "60": "0xd8dA6BF2..."
    },
    "contenthash": null
  }
}
GET /api/domain/:name/records/text/:key

Look up a single text record for a domain.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)
keystringText record key (e.g. com.x, avatar)

Example Response

{
  "domain": "vitalik.eth",
  "key": "com.x",
  "value": "VitalikButerin",
  "block_number": 18500000,
  "transaction_hash": "0xabc..."
}

Derived History

GET /api/domain/:name/ownership-history

Effective ownership history for a domain, derived from on-chain events.

Returns ownership periods with the resolved effective owner at each point in time.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)
auditstringtrue to include per-contract breakdown (registry, registrar, wrapper arrays). Default false

Example Response

{
  "history": [
    {
      "address": "0xd8dA6BF2...",
      "reason": "registrar",
      "from_block": 9500000,
      "from_tx": "0xdef456...",
      "to_block": null,
      "to_tx": null
    }
  ]
}
GET /api/domain/:name/resolver-history

Resolver change history derived from stored on-chain events. Each entry represents a period where a specific resolver contract was active for the domain.

Parameters

NameTypeDescription
namestringFull ENS name (e.g. vitalik.eth)

Example Response

{
  "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
    }
  ]
}

Hash Lookups

GET /api/lookup-hash/:hash

Look up a domain by any hash. Tries namehash first (unique match), then falls back to labelhash (may match multiple domains).

Parameters

NameTypeDescription
hashstringA 66-character hex string (0x + 64 hex chars)

Example Response (namehash match)

{
  "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..."
  }
}

Example Response (labelhash match)

{
  "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..."
    }
  ]
}

Example Response (no match)

{
  "type": "none"
}
GET /api/lookup-namehash/:hash

Look up a single domain by its namehash. Returns full domain details including ownership, resolver, and wrapped status.

Parameters

NameTypeDescription
hashstringNamehash — a 66-character hex string (0x + 64 hex chars)

Example Response

{
  "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
  }
}
GET /api/lookup-labelhash/:hash

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.

Parameters

NameTypeDescription
hashstringLabelhash — a 66-character hex string (0x + 64 hex chars)

Example Response

{
  "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
}