Skip to content

OpenAPI reference

Source bitcoinuniverseio/docs-core
Path public/openapi/core-public-read.json
Chain bitcoin
Network mainnet
Verified 2026-09-01

Everything below is rendered at build time from the OpenAPI document this repository publishes. Continuous integration validates that the document parses as OpenAPI 3.1 and that it contains no operation other than GET, because a mutation route appearing in a public read document would be a mistake with consequences.

The document is served from this site and can be fed straight to a client generator.

Documentcore-public-read.json· OpenAPI 3.1.0 · version 2026-09-01

Server https://api.bitcoinuniverse.io · Production. The only public origin.

GET/health

Application health, release identity, and marketplace profile

The readiness contract. It reports the exact release commit, whether read traffic is ready, whether mutation traffic is open, and the reasons it is not. Read availability and transaction availability are reported separately on purpose: a healthy page is not evidence that trading is open.

StatusMedia typeSchemaMeaning
200application/jsonobjectHealth report. A 200 does not by itself mean the service is ready: read `readTraffic.ready` and `mutationTraffic.ready`.

GET/indexer-health

Per-protocol index identity, tip, lag, and freshness

One entry per marketplace protocol. This is the answer to "where did that number come from, and how old is it", for every protocol at once.

Read `tip` against `nodeTip` rather than trusting `lag` alone: a protocol that has never been read successfully reports zeroes and a null `lastSuccess`, which is not a chain at height zero.

StatusMedia typeSchemaMeaning
200application/jsonobjectFreshness report for every protocol the deployment serves.

GET/ordinals/status

The Ordinals index status page

The status page of the Ordinals index that Core reads, served through the public facade. It answers with HTML, not JSON: it is the index's own page rather than a Core-shaped response. It reports the chain, the indexed height, inscription counts, and index uptime.

Use `/indexer-health` instead when you want a machine-readable answer about Ordinals freshness.

StatusMedia typeSchemaMeaning
200text/htmlstringThe index status page.

GET/mempool/api/blocks/tip/height

Current Bitcoin chain tip height

StatusMedia typeSchemaMeaning
200text/plainstringThe tip height as a bare decimal integer in the body.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/blocks/tip/hash

Current Bitcoin chain tip block hash

StatusMedia typeSchemaMeaning
200text/plainstringThe tip block hash as a bare hex string in the body.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/block-height/{height}

Block hash at a height

ParameterInTypeDescription
heightpathintegerA block height.
StatusMedia typeSchemaMeaning
200text/plainstringThe block hash at that height, as a bare hex string.
404application/jsonobjectNo such record, or the path is not a registered public reader route. A 404 on an unregistered path is intentional and does not imply that an internal service exists there.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/blocks

Recent blocks

A compact summary of the most recent blocks. Each entry carries the block id, height, timestamp in seconds, transaction count, and median fee rate.

StatusMedia typeSchemaMeaning
200application/jsonarray of BlockSummaryRecent block summaries, newest first.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/mempool

Mempool transaction count and total virtual size

StatusMedia typeSchemaMeaning
200application/jsonobjectMempool summary.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/v1/fees/recommended

Recommended fee rates in satoshis per virtual byte

Fee estimates read from Universe-operated infrastructure. There is no public-provider fallback: when the service is unavailable the API answers with an explicit failure rather than a stale or invented rate.

StatusMedia typeSchemaMeaning
200application/jsonobjectFee rates in satoshis per virtual byte.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/address/{address}

Funded and spent output totals for an address

Confirmed chain totals and mempool totals are reported separately, so an unconfirmed change is never folded into a confirmed balance.

ParameterInTypeDescription
addresspathstringA Bitcoin address.
StatusMedia typeSchemaMeaning
200application/jsonobjectAddress statistics.
400application/jsonobjectThe request did not validate. The facade rejects a malformed identifier rather than passing it upstream.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/address/{address}/utxo

Unspent outputs held by an address

A failure to read is reported as unavailable. It is never presented as a confirmed empty wallet. An empty array means the address was read and holds nothing.

This response says nothing about whether an output carries an inscription, a rune balance, or any other protocol asset. Treat every output as potentially asset-bearing until an index says otherwise.

ParameterInTypeDescription
addresspathstringA Bitcoin address.
StatusMedia typeSchemaMeaning
200application/jsonarray of UtxoUnspent outputs. An empty array is a confirmed empty result.
400application/jsonobjectThe request did not validate. The facade rejects a malformed identifier rather than passing it upstream.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/address/{address}/txs

Transactions involving an address

ParameterInTypeDescription
addresspathstringA Bitcoin address.
StatusMedia typeSchemaMeaning
200application/jsonarray of TransactionTransactions, most recent first.
400application/jsonobjectThe request did not validate. The facade rejects a malformed identifier rather than passing it upstream.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

GET/mempool/api/tx/{txid}

One transaction, with its inputs and outputs

ParameterInTypeDescription
txidpathstringA transaction id, 64 lowercase hexadecimal characters.
StatusMedia typeSchemaMeaning
200application/jsonobjectThe transaction.
404application/jsonobjectNo such record, or the path is not a registered public reader route. A 404 on an unregistered path is intentional and does not imply that an internal service exists there.
429application/jsonobjectThe caller exceeded its rate budget. Wait for the interval the rate-limit headers indicate before retrying.
503application/jsonobjectThe Universe-operated service behind this reader could not answer. There is no public-provider fallback, so this is an explicit unavailable answer rather than a zero or a stale value. Treat the quantity as unknown.

Schemas

Error

The error envelope every public route uses.

FieldTypeRequiredNotes
messagestringyesPlain-language description.
errorstringyesStable error code, for example NOT_FOUND.
statusCodeintegeryes
requestIdstring

Health

FieldTypeRequiredNotes
okbooleanyes
timestampstringyes
releasestringyesThe commit this deployment was built from.
marketplaceProfilestringyesWhich profile the deployment is running. `read-only` keeps browsing open while every trading action stays closed.
serviceobject
readTrafficobjectWhether reads are ready. Reported separately from mutation readiness on purpose.
mutationTrafficobjectWhether trading actions are open. A read-only deployment reports `ready: false` here while read traffic stays available.
dependenciesobjectNamed dependencies and their state, for example database and bitcoinNetwork.
networksobjectKeyed by `chain:network`.
indexersarray of objectA compact per-protocol summary. `/indexer-health` carries the full form.

MutationTraffic

Whether trading actions are open. A read-only deployment reports `ready: false` here while read traffic stays available.

FieldTypeRequiredNotes
enabledboolean
preflightReadyboolean
readyboolean
statusstring
reasonsarray of stringStable reason codes naming every gate that is closed.
authorityCyclesobjectThe mutation gate. Every protocol authority must report current, agreeing evidence for `requiredHealthyCycles` consecutive refresh cycles before trading can open. Any missing, stale, conflicting, or failed authority resets the count.
authoritiesReadyboolean

AuthorityCycles

The mutation gate. Every protocol authority must report current, agreeing evidence for `requiredHealthyCycles` consecutive refresh cycles before trading can open. Any missing, stale, conflicting, or failed authority resets the count.

FieldTypeRequiredNotes
completedCyclesinteger
consecutiveHealthyCyclesinteger
requiredHealthyCyclesinteger
lastCycleAtstring or null
lastCycleHealthyboolean
readyboolean
totalintegerProtocol authorities in the cycle.
currentinteger
staleinteger
unknowninteger
errorinteger

NetworkState

FieldTypeRequiredNotes
chainTipintegerThe verified chain head.
indexedHeightinteger
laginteger
readyboolean
synchronizedboolean
lastSuccessfulUpdatestring or null
indexersarray of string

IndexerHealth

FieldTypeRequiredNotes
statusstringyes
totalintegeryesNumber of protocol entries in `data`.
authorityCyclesobjectThe mutation gate. Every protocol authority must report current, agreeing evidence for `requiredHealthyCycles` consecutive refresh cycles before trading can open. Any missing, stale, conflicting, or failed authority resets the count.
dataarray of IndexerEntryyes

IndexerEntry

FieldTypeRequiredNotes
protocolIdstringyesThe registry protocol id.
indexerIdentitystring or nullWhich index actually answered.
networkstring or null
sourcestring or null
configuredIndexersobject
observedAtstring or null
ageMsinteger or nullNull when there is no successful observation to age.
freshnessLimitMsinteger or null
lastRefreshAttemptAtstring or null
lastSuccessstring or nullNull means this index has never been read successfully in the current process. It does not mean the protocol is empty.
lastErrorstring or null
lastTimeoutstring or null
errorRatenumber or null
schemaobject
tipintegerThe index's own height. Zero with a null `lastSuccess` means unread, not height zero.
nodeTipintegerThe node height the index is compared against.
lagintegerBlocks between `nodeTip` and `tip`.
capabilitiesarray of stringActions this authority is currently able to execute.
declaredCapabilitiesarray of stringActions the registry declares for this protocol. Compare with `capabilities`: declared is not live.
authorityobject
freshnessobjectStale and disagreeing are separate booleans because an old observation and two authorities that disagree are different problems.
statusstringyes
mutationReadyboolean
reasonCodestring or nullA stable code naming the dominant reason for the current status.
reasonsarray of string

BlockSummary

FieldTypeRequiredNotes
idstringyes
heightintegeryes
timestampintegerUnix seconds.
tx_countinteger
medianFeenumberSatoshis per virtual byte.

MempoolSummary

FieldTypeRequiredNotes
countintegerTransactions in the mempool.
vsizeintegerTotal virtual size in virtual bytes.

RecommendedFees

Satoshis per virtual byte.

FieldTypeRequiredNotes
fastestFeenumber
halfHourFeenumber
hourFeenumber
economyFeenumber
minimumFeenumber

AddressStats

FieldTypeRequiredNotes
addressstring
chain_statsobjectSums are in satoshis. Subtract `spent_txo_sum` from `funded_txo_sum` for a balance, and keep confirmed and mempool figures apart.
mempool_statsobjectSums are in satoshis. Subtract `spent_txo_sum` from `funded_txo_sum` for a balance, and keep confirmed and mempool figures apart.

TxoStats

Sums are in satoshis. Subtract `spent_txo_sum` from `funded_txo_sum` for a balance, and keep confirmed and mempool figures apart.

FieldTypeRequiredNotes
funded_txo_countinteger
funded_txo_suminteger
spent_txo_countinteger
spent_txo_suminteger
tx_countinteger

Utxo

FieldTypeRequiredNotes
txidstringyes
voutintegeryes
valueintegeryesSatoshis.
statusobject

TxStatus

FieldTypeRequiredNotes
confirmedboolean
block_heightinteger
block_hashstring
block_timeintegerUnix seconds.

Transaction

FieldTypeRequiredNotes
txidstringyes
versioninteger
locktimeinteger
sizeinteger
weightinteger
feeintegerSatoshis.
vinarray of Vin
voutarray of Vout
statusobject

Vin

FieldTypeRequiredNotes
txidstring
voutinteger
is_coinbaseboolean
scriptsigstring
scriptsig_asmstring
witnessarray of string
sequenceinteger
prevoutobjectAn output. Nothing here says whether the output carries a protocol asset; an output holding an inscription or a rune balance looks exactly like one that does not.

Vout

An output. Nothing here says whether the output carries a protocol asset; an output holding an inscription or a rune balance looks exactly like one that does not.

FieldTypeRequiredNotes
valueintegerSatoshis.
scriptpubkeystring
scriptpubkey_asmstring
scriptpubkey_typestring
scriptpubkey_addressstring