X1ID is live on X1 mainnet
X1ID / Universal resolver

Universal resolver

Mainnet

The universal resolver resolves names across naming systems through one call: X1ID @handles and X1NS domains natively, Solana .sol names (SNS), and Ethereum .eth names (ENS). Each foreign namespace reads its own chain through an adapter, so a .sol or .eth result is real on-chain data — never a guess.

Resolve any name

GET/v1/resolve-universal/:name

Keyed or x402-metered, priced like a resolve. The optional ?chain= picks which chain's address you want (X1 default, or SOL / ETH / BTC).

GET /v1/resolve-universal/:name
curl "https://api.x1id.io/v1/resolve-universal/jack.sol?chain=SOL" \
  -H "X-API-Key: $X1ID_API_KEY"
{
  "input": "jack.sol",
  "name": "jack.sol",
  "namespace": "sol",
  "address": "7Np1jK…pQ4mZ",
  "chain": "SOL",
  "source": "sns",
  "verified": true
}
fieldmeaning
namespacewhich naming system the name belongs to: handle, x1 / xnt / xen, sol, or eth.
sourcethe system that answered: x1id, sns, or ens.
verifiedwhether ownership of address was proved on-chain.

An unknown name is 400; a name with no address for the requested chain is 404 NO_RECORD_FOR_CHAIN; an RPC failure is 502. A name in a namespace that isn't enabled on this deployment is 501 NOT_CONFIGURED — see below.

Which namespaces are live

GET/v1/namespaces

Ungated. Lists each namespace and whether its adapter is configured on this deployment — check it before you rely on .sol or .eth.

curl https://api.x1id.io/v1/namespaces
{
  "namespaces": [
    { "namespace": "handle", "source": "x1id", "configured": true },
    { "namespace": "x1",     "source": "x1id", "configured": true },
    { "namespace": "xnt",    "source": "x1id", "configured": true },
    { "namespace": "xen",    "source": "x1id", "configured": true },
    { "namespace": "sol",    "source": "sns",  "configured": true },
    { "namespace": "eth",    "source": "ens",  "configured": true }
  ]
}

.sol and .eth are config-gated, by design. The native X1ID / X1NS path is always on. SNS (.sol) reads a Solana RPC and ENS (.eth) reads an Ethereum RPC — each is enabled only when that deployment has the corresponding RPC configured. ENS in particular needs an Ethereum RPC configured to answer at all. When an adapter is off it returns a typed NOT_CONFIGURED and never fabricates an address or fails the whole resolver. Always consult GET /v1/namespaces rather than assuming.

When to use it

Use the universal resolver when your app accepts names from more than one ecosystem in one field — a cross-chain wallet, a payments box, a directory. If you only need X1ID @handles and X1NS, the public Resolve API (keyless) or the SDK (reads chain directly, no hosted dependency) are simpler.

Never conflate the namespaces. @jack, jack.x1, jack.sol, and jack.eth can belong to different people. The resolver classifies strictly by shape and tells you which namespace/source answered — render that before letting a user send, and never fall back from one namespace to another.

Next

Browse the docs

Universal resolver