Universe ARC-20 API
The complete ARC-20 read contract, with its guarantees, its declared coverage limit, and the OpenAPI document behind it.
Universe implementation Verified 2026-08-31
Describes what a Bitcoin Universe service actually does today. It is not a statement about the protocol in general.
- Page ID
-
reference/api/arc20 - Normative authority
- Universe implementation documentation
- Networks
- mainnet
- Documentation version
- 2026.08
- Audience
- developer, integrator
- Owner
- bitcoin-universe-docs
- Sources
-
- Universe ARC-20 index and Marketplace v1 authority
at
670030e50071private repository - Universe ARC-20 index and Marketplace v1 authority
at
670030e50071private repository
- Universe ARC-20 index and Marketplace v1 authority
at
- Known limitations
-
- Declared coverage is partial. The limitation applies to pending activity only, not to the confirmed scan or the holder proof requirements.
Ce contenu n’est pas encore disponible dans votre langue.
What this service guarantees
Section titled “What this service guarantees”Verified winners only. Every ticker candidate is discovered without an upstream verified-only filter, then resolved through the provider. Only the verified winning Atomical ID is published. The reference exposed to products is the lower-case ticker, and the winning compact Atomical ID is retained in protocol details.
All or nothing scans. Holder rows are aggregated by address and must sum exactly to circulating supply. A mismatch, a null address, a truncated page sequence, a changing declared total, or a changing chain tip aborts the entire poll. No partial authoritative snapshot is committed.
No double application. Supply and holder snapshots are the authoritative state, so activity events publish empty wallet and supply deltas. A consumer that also applied event deltas would count everything twice.
Routes
Section titled “Routes”
Generated from electrumx/token_explorer/server.py in
Universe ARC-20 index and Marketplace v1 authority at
670030e50071. 5 routes. CI fails when this inventory and the
OpenAPI document disagree in either direction.
| Method | Path | Auth | Summary |
|---|---|---|---|
GET | /live | none | Process liveness |
GET | /ready | none | Migrations and initial snapshot readiness |
GET | /token-explorer/status | none | Source status and counts |
GET | /token-explorer/arc20 | bearer | Immutable feed page with a signed cursor |
POST | /indexer/atomicals/poll | operator token | Operator triggered scan |
Cursors
Section titled “Cursors”Cursors are opaque and signed with a secret separate from the feed bearer token. They refer to a position inside an immutable generation and preserve the page and holder chunk sizes they were created with.
A cursor-free request may need to build a generation first. In that case the service copies a bounded number of rows and returns a retryable unavailable response until the generation is ready. Retries resume and reuse the same source fingerprint, and source movement abandons an unfinished generation.
Treat that retryable response as normal during cold bootstrap, with backoff. At most 64 unexpired generations are retained.
Reorg handling
Section titled “Reorg handling”Each changed tip is rescanned under identical before and after Bitcoin and Atomicals tips. Missing unfinalised events produce explicit invalidations. Changes to finalised blocks, events, or ticker identity fail closed. Historical headers outside the configured reorg window are reused from a durable journal.
Amount encoding
Section titled “Amount encoding”Every satoshi and protocol quantity is a decimal string. JSON numbers are rejected, so no precision is lost in transit. Never parse one into a floating point number.
Reading the figures correctly
Section titled “Reading the figures correctly”| Figure | What it is |
|---|---|
| Maximum issuance | mint_amount * max_mints. A ceiling, not a supply |
| Claims made | Valid claims counted from records |
| Circulating supply | Coloured value actually held after burns |
| Global maximum | Null for a perpetual deployment with no configured maximum. Do not compute one |