ENS Indexer Monitor

API Documentation

Dashboard

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.

http://<indexer-ip>:<port>/api
These endpoints are used internally by the indexer proxy. You typically won't call these directly unless running your own indexer.

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
}