{
  "service": "cellula.id resolver",
  "what": "Resolve .cell names on the Nervos blockchain over HTTP. A cache in front of chain; the chain is the source of truth.",
  "network": "pudge (testnet)",
  "routes": {
    "GET /resolve/:name": "everything about a name, decoded: addresses per chain, lightning, fiber endpoint, expiry, owner, plus a `proof` naming the cell it came from so you can check this answer against any CKB node rather than trusting this one",
    "GET /resolve/:name?coinType=309": "one address by SLIP-44 coin type (0 btc, 60 eth, 309 ckb, 501 sol)",
    "GET /meals/:name": "who fed the being of a name, newest first: payments into the lock of its deed that carry a meal naming it (decision 0037), with each payer's own name when they have one",
    "GET /dob/:sporeId": "a Spore's DOB/0 or DOB/1 drawn as one self-contained SVG: a DOB/1 as its decoder composites it, a DOB/0 as a card of its traits, every image inlined (testnet, where a decoder is configured)",
    "GET /token/:typeHash": "what an xUDT or sUDT token is called, by its type script hash: symbol, name, decimals, tags (rgb++ among them) and picture (a data URI, or null), as the issuer published them to the Nervos explorer, or on chain for a token the explorer has no record of (?type=code_hash:hash_type:args); null for a token nobody named",
    "GET /stealth": "every private payment to a name since ?from= (a block), oldest first: its one-time point, view tag and plain outputs (decision 0051). It names nobody: a keeper's app finds its own with its scan key",
    "GET /primary/:address": "the address's own canonical name (its reverse record, forward-verified), or null, with when it runs out; a CKB address or an Ethereum 0x one",
    "POST /primary": "the same answer for up to fifty addresses at once, as JSON {addresses}, results in the same order",
    "GET /reverse/:address?coinType=309": "names that publish this address as a payout",
    "GET /avatar/:name": "the name's picture, as an ordinary image; falls back to the mark drawn from its id (?fallback=none to 404 instead)",
    "GET /cover/:name": "the wide band across the top of its page, as an ordinary image; falls back to the band drawn from its id (?fallback=none to 404 instead)",
    "GET /profile/:name": "what a name publishes about itself: display name, bio, location, colour, links, and where its picture lives",
    "GET /name/:name": "the raw on-chain record set",
    "GET /card/:name": "the link-preview document for a name, which is what a crawler is served when it asks for the name's page",
    "GET /archive/:name": "the record set we kept a copy of, so anyone holding it can publish it again; checked against the chain's own commitment, never trusted",
    "GET /latest?limit=20": "the most recently registered names, newest first, with when each one was registered",
    "GET /names": "every registered name",
    "GET /directory?q=&sale=&pay=&page=1&size=10": "the names a page at a time, searched and filtered here, in label order, with what a list shows of each. Withdrawn names are left out",
    "GET /expiring?days=30&state=all&format=json": "names running out: expiring, in grace (lapsed, but for thirty days more nobody else may take them), and free to register now. state filters to one of those; format=rss gives a feed",
    "GET /health": "snapshot freshness",
    "GET /market": "every name its owner has listed for sale, cheapest first, with the split of each price the contract enforces. Withdrawn names are left out",
    "GET /recheck/:name": "ask for that name's website and account proofs to be looked at again, at most once a minute; it queues the check rather than running one, and the answer turns up on /resolve within about a minute",
    "GET /disputes": "the disputes log: every name under a notice or withdrawn from this service, and why (docs/DISPUTES.md)",
    "GET /quantum": "the owners proven to be post-quantum keys (decision 0016), and under `lock`, whether the code those names obey is still the code we recorded. A name missing from the owners list is not shown to be, never shown not to be",
    "GET /deed/:name": "whether the name is held as a deed (decision 0036): the Spore that stands for it, the cell under the proxy lock, and who holds it now",
    "GET /deeds/lease": "one of the deeds key's plain cells for a new deed to spend in place of the cluster cell, handed to one caller at a time for three minutes so deeds made side by side do not collide",
    "POST /deed/cosign": "the cluster key's signature on a transaction that makes a deed, as JSON {name, tx}; refused unless the transaction is exactly that, checked by the SDK's checkDeedTx",
    "POST /account": "retired 2026-10-08: a wallet's own account costs nothing to make since lock v6 (its starter address is the passkey alone), so this service pays for none; it answers 503. It made accounts on testnet for a passkey, as JSON {pub}",
    "POST /report": "report a name under the disputes policy, as JSON {name, claim, statement, evidence, contact}; acknowledged within five working days",
    "POST /login": "check a \"sign in with .cell\" signature, as JSON {signed, domain, nonce, allowManager?}; the site issues and spends its own nonce, this service keeps none, and the same check runs locally from the SDK against your own node",
    "POST /statement": "check a statement signed by a name (decision 0039), as JSON {signed} or {block} (the pasted text with its markers) or {token}; says who signed it: the owner today, a former owner with the block it let go, the manager, or nobody. Holds nothing, and the same check runs locally from the SDK",
    "POST /r": "hold a sealed payment request so its link can be short, as JSON {id, blob, days}; the id is a hash of a key this service never sees and the blob is ciphertext under it, so nothing here is readable to us",
    "GET /r/:id": "a sealed payment request, for whoever holds the key that names it",
    "POST /statement/keep": "hold a statement so its link can be short (decision 0039), as JSON {token}; filed under twelve characters derived from the statement itself and kept ten years; the long link works without it",
    "GET /statement/:id": "a statement held under that short name, as {token, expires}",
    "GET /verify": "is the running contract the published, reproducible-build source? (yes/no, live)",
    "GET /price": "what a coin is worth, cached here so a browser need not ask the rate service itself",
    "GET /openapi.json": "this same list as an OpenAPI document, for a generator, a typed client or an agent",
    "GET /.well-known/lnurlp/:name": "the Lightning Address lookup (LUD-16), forwarded unchanged to the wallet the name publishes",
    "GET /.well-known/lnurlp/:name/invoice?amount=<msat>&comment=": "an invoice for that amount from the wallet the name publishes, for a web page that cannot call the wallet itself",
    "GET /.well-known/nostr.json?name=": "NIP-05: the Nostr key a name publishes, so name@ this host checks out in a Nostr client",
    "GET /.well-known/atproto-did": "on a name's own host, the Bluesky DID the name publishes, as plain text, so the name can be a Bluesky handle",
    "GET /counts": "how many people reached each step of claiming a name, per day, and how many wallets were made or given guardians: totals only, nothing about anybody",
    "POST /step": "count one step, as ?s=<step>, from a fixed list; anything else is dropped and nothing about the caller is kept"
  },
  "example": "curl https://testnet.cellula.id/api/resolve/maria.cell"
}