ENS Indexer API

API Documentation

ENSWhois Docs Agents Status API

Public API for querying ENS domain data. All endpoints return JSON.

https://api.enswhois.com

Authentication

API Key

Pass your key via the X-API-Key header. Sign up to get a key with 1,000 free credits.

Micropayments (MPP)

Pay per request using the MPP protocol. No account needed — pay directly from your wallet.

No authentication is needed to try the API - unauthenticated requests are limited to 5 per minute. Sign up for unlimited access.

CORS is enabled for all /api endpoints. You can call these from any origin.
GET /address/:address/domains Paginated

List all domains associated with an address.

Parameters

NameTypeDescription
addressstringEthereum address (42-char hex)

Query Parameters

NameTypeDescription
sort_bystringfull_name (default) or expiry_timestamp
include_expiredbooleanInclude expired domains beyond the 90-day grace period (premium + available). Default false. Names still in their grace period are always included.
address_typestringeffective_owner (default), registry_owner, registrar_owner, wrapper_owner, resolver

Example Response

{
  "address": "0xd8da6bf2...",
  "address_type": "effective_owner",
  "results": [
    {
      "name": "vitalik.eth",
      "display": "Vitalik.eth",
      "label": "vitalik",
      "expiry_timestamp": "1754000000",
      "ownership": {
        "owner": "0xd8dA6BF2...",
        "registry": "0xd8dA6BF2...",
        "is_wrapped": false
      },
      "resolver": {
        "address": "0x231b0Ee1..."
      }
    }
  ],
  "total": 42,
  "page": 1,
  "page_size": 25
}
GET /address/:address/domain-count

Lightweight count-only endpoint. Returns domain counts for an address by type. active_count covers names still recoverable by the owner (registered + 90-day grace); expired_count covers names past grace (premium + available).

Parameters

NameTypeDescription
addressstringEthereum address (42-char hex)

Query Parameters

NameTypeDescription
address_typestringeffective_owner (default), registry_owner, registrar_owner, wrapper_owner, resolver

Example Response

{
  "address": "0xd8da6bf2...",
  "address_type": "effective_owner",
  "count": 42,
  "active_count": 40,
  "expired_count": 2
}
GET /address/:address/primary-name

Reverse resolve an address to its primary ENS name. Optionally returns full history of reverse name changes.

Parameters

NameTypeDescription
addressstringEthereum address (42-char hex)

Query Parameters

NameTypeDescription
historybooleanInclude full reverse name history (default false)

Example Response (default)

{
  "address": "0xd8da6bf2...",
  "primary_name": "vitalik.eth",
  "display": "Vitalik.eth",
  "registrar": "addr.reverse"
}

Example Response (history=true)

{
  "address": "0xd8da6bf2...",
  "current": {
    "primary_name": "vitalik.eth",
    "display": "Vitalik.eth",
    "registrar": "addr.reverse"
  },
  "history": [
    {
      "name": "vitalik.eth",
      "registrar": "addr.reverse",
      "block_number": 9412610,
      "transaction_hash": "0xabc..."
    }
  ]
}
POST /address/primary-names/bulk

Bulk reverse resolution for multiple addresses. Maximum 200 per request.

Request Body

{
  "addresses": ["0xd8da6bf2...", "0x225f137..."]
}

Example Response

{
  "results": {
    "0xd8da6bf2...": {
      "primary_name": "vitalik.eth",
      "registrar": "addr.reverse",
      "display": "Vitalik.eth"
    },
    "0x225f137...": {
      "primary_name": null,
      "registrar": null
    }
  }
}
GET /address/:address/summary

Combined address summary: active domain count (effective owner, includes grace), primary name, domains expiring soon, and previously-owned count.

Parameters

NameTypeDescription
addressstringEthereum address (42-char hex)

Example Response

{
  "address": "0xd8da6bf2...",
  "domain_count": 42,
  "primary_name": "vitalik.eth",
  "primary_name_source": "addr.reverse",
  "domains_expiring_30d": 1,
  "previously_owned_count": 12
}
GET /address/:address/previous-domains Paginated

List domains the address used to control. A domain qualifies if the address ever appeared as to_address, new_owner_address, or owner_address on an event for that domain, and is no longer in control (current effective owner differs, or the name has lapsed past the 90-day grace period). Sorted by most-recently-touched first.

Parameters

NameTypeDescription
addressstringEthereum address (42-char hex)

Query Parameters

NameTypeDescription
pageintegerPage number, 25 per page (default 1)
sort_dirstringdesc (default, most recent first) or asc

Example Response

{
  "address": "0xd8da6bf2...",
  "results": [
    {
      "name": "old-name.eth",
      "label": "old-name",
      "expiry_timestamp": "1700000000",
      "ownership": {
        "owner": "0xabc...",
        "is_wrapped": false
      },
      "last_owned_block_number": 19500000,
      "last_owned_block_timestamp": 1710000000
    }
  ],
  "total": 12,
  "page": 1,
  "page_size": 25
}