Explorer API
The explorer API is a public, read-only view of the NULL chain at https://explorer.nullnet.sh/v1. NULL is shielded-only, so the chain reveals blocks, transaction ids, action counts, nullifiers, note commitments, fees and sizes, but never addresses, amounts or memos. There is no address search, balance or "related transactions" endpoint because the chain has no such data.
No authentication is needed. The machine-readable contract is the OpenAPI document at /v1/openapi.json, generated from the handlers.
Conventions
- Ids, hashes, nullifiers and note commitments are 64 lowercase hex characters.
- Amounts are decimal strings in smallest units: 1 NULL = 100,000,000 units.
- Heights, counts, sizes (bytes) and timestamps (Unix seconds) are JSON numbers.
- Lists are newest first. When more results exist, the response carries
next; pass it back asbefore(blocks) orcursor(transactions).nextis absent on the last page. limitdefaults to 20 and is clamped to 1–100.- Successful
GETresponses carryCache-Control: public, max-age=5. Disclosure verification responses carryCache-Control: no-store. - The explorer does not log request paths, query strings or client addresses.
Rate limits
Limits are per client IP and kept in memory only.
- Name
/v1/*- Type
- 600 per minute
- Description
Every
/v1route, with a burst of 60 requests.
- Name
/v1/disclosures/verify- Type
- 10 per minute
- Description
An additional, separate limit on disclosure verification.
Over the limit, the API returns 429 with error code rate_limited. /healthz and /readyz are not rate limited.
Errors
Every error has the same JSON body.
- Name
error- Type
- string
- Description
Stable machine-readable code (see below).
- Name
message- Type
- string
- Description
Human-readable detail, for example
q: expected a block height or a 64-character hex id.
| Status | error | Meaning |
|---|---|---|
| 400 | bad_request | A parameter or body is malformed. The message names the field. |
| 404 | not_found | Nothing on the indexed chain matches. |
| 429 | rate_limited | Too many requests from this client. |
| 500 | internal | Database failure. No detail is returned. |
| 503 | not_ready | The explorer has not indexed any block yet. |
| 503 | node_unavailable | The node could not answer (disclosure verification only). |
Error
{
"error": "not_found",
"message": "block not found"
}
Status
Indexer and node health: the highest indexed block and the node's state at the last indexer pass. Returns 503 not_ready before the first block is indexed. The node_* and last_pass_at fields are null until the indexer has recorded node status.
Response
- Name
network- Type
- string
- Description
mainortest.
- Name
indexed_height- Type
- integer
- Description
Highest indexed block.
- Name
indexed_hash- Type
- string
- Description
Its hash.
- Name
node_height- Type
- integer | null
- Description
The node's tip at the last indexer pass.
- Name
node_syncing- Type
- boolean | null
- Description
Whether the node was still syncing with its peers.
- Name
node_connections- Type
- integer | null
- Description
Ready peer connections of the node.
- Name
last_pass_at- Type
- integer | null
- Description
Unix seconds of the last completed indexer pass.
Request
curl https://explorer.nullnet.sh/v1/status
Response
{
"network": "main",
"indexed_height": 6206,
"indexed_hash": "00000fc8d37f816b43e79acbaba7d736adbbcbfdca48182361e0dd943a456273",
"node_height": 6206,
"node_syncing": false,
"node_connections": 42,
"last_pass_at": 1793000908
}
Stats
Network-wide figures at the indexed tip. Supply is computed exactly from the emission schedule. Returns 503 not_ready before the first block is indexed.
Response
- Name
network- Type
- string
- Description
mainortest.
- Name
height- Type
- integer
- Description
Indexed tip.
- Name
supply.emitted- Type
- string
- Description
Units in existence at the indexed tip: premine plus subsidies.
- Name
supply.premine- Type
- string
- Description
The development fund paid by genesis.
- Name
supply.max- Type
- string
- Description
The supply cap.
- Name
supply.next_subsidy- Type
- string
- Description
Subsidy of the next block.
- Name
transactions- Type
- integer
- Description
Transactions ever mined, coinbases included.
- Name
actions- Type
- integer
- Description
Actions ever mined.
- Name
fees- Type
- string
- Description
Fees ever paid.
- Name
difficulty- Type
- number | null
- Description
Difficulty of the next block relative to the easiest target.
- Name
work_per_second- Type
- string | null
- Description
Estimated network Equihash solutions per second.
- Name
block_interval_secs- Type
- integer | null
- Description
Target seconds per block.
- Name
mean_block_time_secs- Type
- number | null
- Description
Mean seconds per block over the last 60 blocks.
- Name
mempool_size- Type
- integer
- Description
Pooled transactions.
Request
curl https://explorer.nullnet.sh/v1/stats
Response
{
"network": "main",
"height": 6206,
"supply": {
"emitted": "69019820000000",
"premine": "63000000000000",
"max": "2100000000000000",
"next_subsidy": "970000000"
},
"transactions": 6920,
"actions": 18832,
"fees": "64180000",
"difficulty": 59327.30547090157,
"work_per_second": "7158",
"block_interval_secs": 120,
"mean_block_time_secs": 132.13333333333333,
"mempool_size": 0
}
List blocks
Blocks, newest first. To page, pass the response's next as before.
Optional query parameters
- Name
before- Type
- integer
- Description
Return blocks with a height strictly below this one.
- Name
limit- Type
- integer
- Description
Page size, 1–100. Default 20.
Block summary
- Name
height- Type
- integer
- Description
Height.
- Name
hash- Type
- string
- Description
Block id.
- Name
time- Type
- integer
- Description
Block time, Unix seconds.
- Name
size- Type
- integer
- Description
Bytes.
- Name
tx_count- Type
- integer
- Description
Transactions, coinbase included.
- Name
action_count- Type
- integer
- Description
Actions across all transactions.
- Name
fees- Type
- string
- Description
Fees paid by the block's transactions.
- Name
subsidy- Type
- string
- Description
Subsidy the coinbase created.
Request
curl "https://explorer.nullnet.sh/v1/blocks?limit=2"
Response
{
"items": [
{
"height": 6206,
"hash": "00000fc8d37f816b43e79acbaba7d736adbbcbfdca48182361e0dd943a456273",
"time": 1793000789,
"size": 10851,
"tx_count": 1,
"action_count": 2,
"fees": "0",
"subsidy": "970000000"
},
{
"height": 6205,
"hash": "00000b187671645a900f8b4f66bf63932bcebbd92982e86934f26db2de718567",
"time": 1793000715,
"size": 10851,
"tx_count": 1,
"action_count": 2,
"fees": "0",
"subsidy": "970000000"
}
],
"next": "6205"
}
Get a block
One block by height (decimal) or by hash (64 hex characters), with its header and transactions. Returns 400 for anything else and 404 when no such block is indexed.
The response has every block summary field plus the fields below.
Response
- Name
prev_hash- Type
- string
- Description
Parent block id.
- Name
next_hash- Type
- string | null
- Description
Next block's id, if indexed.
- Name
confirmations- Type
- integer
- Description
Confirmations at the indexed tip. The tip itself has 1.
- Name
version- Type
- integer
- Description
Header version.
- Name
target- Type
- string
- Description
Target, compact hex.
- Name
difficulty- Type
- number | null
- Description
Difficulty relative to the easiest target.
- Name
commitment_root- Type
- string
- Description
Note commitment tree root after this block.
- Name
tx_root- Type
- string
- Description
Root over the block's txids.
- Name
nonce- Type
- string
- Description
Proof-of-work nonce.
- Name
reward- Type
- string
- Description
Subsidy plus fees: what the miner received.
- Name
transactions- Type
- array
- Description
Transaction summaries, coinbase first. See list transactions.
Request
curl https://explorer.nullnet.sh/v1/blocks/6201
Response
{
"height": 6201,
"hash": "0000034c502b7b5a47d3641de7729e242c3beb8f785b2dc9eb2d5c56476df4f0",
"time": 1793000233,
"size": 28981,
"tx_count": 2,
"action_count": 6,
"fees": "40000",
"subsidy": "970000000",
"prev_hash": "0000041e3f6c9e069db217c9e40e047f0ef33e9113bb066fb106c1c83a7414f6",
"next_hash": "00000acc98ef0c9f87cba0b398ddfb39b6fccf86de8f95b73a1cb18ba6077be2",
"confirmations": 6,
"version": 1,
"target": "1e11b71c",
"difficulty": 59190.45778250938,
"commitment_root": "f2bfefc5a6dfe7825bedfb23c561a2b192b402e3beec23a0f504ebe570ff6639",
"tx_root": "1437d04451f1ff75c57504b1c5031161d6a46a0255241b80f24536e4ff2f7581",
"nonce": "0b4680cb94370000000000000000000000000000000000000000000000000000",
"reward": "970040000",
"transactions": [
{
"txid": "4db07ba5ab3cc93a9794501d9a7c39c09c12967bdf87a1be3926b51a58142fba",
"height": 6201,
"position": 0,
"time": 1793000233,
"coinbase": true,
"action_count": 2,
"fee": "0",
"size": 10602
},
{
"txid": "0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc",
// ...
}
]
}
List transactions
Mined transactions, newest first (by height, then position in the block). Coinbases are left out unless coinbase=true. To page, pass the response's next as cursor.
Optional query parameters
- Name
cursor- Type
- string
- Description
The
nextof a previous page, in the form<height>.<position>. Anything else returns400.
- Name
limit- Type
- integer
- Description
Page size, 1–100. Default 20.
- Name
coinbase- Type
- boolean
- Description
Include coinbase transactions. Default
false.
Transaction summary
- Name
txid- Type
- string
- Description
Transaction id.
- Name
height- Type
- integer
- Description
Block height.
- Name
position- Type
- integer
- Description
Position in the block; 0 is the coinbase.
- Name
time- Type
- integer
- Description
Block time, Unix seconds.
- Name
coinbase- Type
- boolean
- Description
Whether this is the block's coinbase.
- Name
action_count- Type
- integer
- Description
2, 4, 8 or 16.
- Name
fee- Type
- string
- Description
Fee;
"0"for a coinbase.
- Name
size- Type
- integer
- Description
Bytes.
Request
curl "https://explorer.nullnet.sh/v1/transactions?limit=2"
Response
{
"items": [
{
"txid": "0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc",
"height": 6201,
"position": 1,
"time": 1793000233,
"coinbase": false,
"action_count": 4,
"fee": "40000",
"size": 18130
},
{
"txid": "e92f8ef17c2ca01b7ec024db56631d48d1984165a1012c5eee3f31a01e041bf2",
"height": 6199,
"position": 1,
"time": 1792999989,
"coinbase": false,
"action_count": 8,
"fee": "80000",
"size": 33186
}
],
"next": "6199.1"
}
Get a transaction
One transaction with its actions. The explorer looks on the indexed chain first, then in the mempool as of the last indexer pass. Returns 404 when neither has it.
Response
- Name
status- Type
- string
- Description
confirmed(mined) orpooled(waiting in the mempool).
- Name
txid- Type
- string
- Description
Transaction id.
- Name
height- Type
- integer | null
- Description
Block height, when confirmed.
- Name
position- Type
- integer | null
- Description
Position in the block, when confirmed.
- Name
time- Type
- integer
- Description
Block time (confirmed) or when the explorer first saw it in the mempool (pooled), Unix seconds.
- Name
confirmations- Type
- integer
- Description
Confirmations at the indexed tip; 0 while pooled.
- Name
coinbase- Type
- boolean
- Description
Whether this is a coinbase.
- Name
version- Type
- integer
- Description
Transaction format version.
- Name
anchor- Type
- string
- Description
Commitment tree root the proof is against.
- Name
anchor_height- Type
- integer | null
- Description
Height of the block that produced the anchor, if indexed.
- Name
action_count- Type
- integer
- Description
2, 4, 8 or 16.
- Name
fee- Type
- string
- Description
Fee;
"0"for a coinbase.
- Name
size- Type
- integer
- Description
Bytes.
- Name
proof_size- Type
- integer
- Description
Proof bytes.
- Name
actions- Type
- array
- Description
Actions in order. Each has
position,nullifier(revealed),rk(randomized spend validating key),cmx(note commitment created) andcv_net(net value commitment).
Request
curl https://explorer.nullnet.sh/v1/transactions/0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc
Response
{
"status": "confirmed",
"txid": "0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc",
"height": 6201,
"position": 1,
"time": 1793000233,
"confirmations": 6,
"coinbase": false,
"version": 1,
"anchor": "78fd364601e2bad0a815d1e0d92eee5befe521c3f39d680c84b59c1446ca2f2d",
"anchor_height": 6200,
"action_count": 4,
"fee": "40000",
"size": 18130,
"proof_size": 14496,
"actions": [
{
"position": 0,
"nullifier": "1843dfa29b3e64d891b7f5fbd2e338febd6fc7af3a95c0e4f97d108258bbe82f",
"rk": "9376de40d472535231b06cecf7677e1ba42cbefe092260e695ed16a60c50bf8b",
"cmx": "96a0a7ea0eee3a816b399e7559e8f3641c3cfa144c238385b89273b858929f10",
"cv_net": "d03269672c0bc6ef96731de9c867deac836619d8c4b7329f022dfea82aff0110"
},
{
"position": 1,
// ...
}
]
}
Look up a nullifier
Where a nullifier was revealed on the indexed chain. A 404 means the note it belongs to has not been spent on the indexed chain.
Response
- Name
txid- Type
- string
- Description
Transaction id.
- Name
height- Type
- integer
- Description
Block height.
- Name
tx_position- Type
- integer
- Description
Transaction position in the block.
- Name
action_position- Type
- integer
- Description
Action position in the transaction.
Request
curl https://explorer.nullnet.sh/v1/nullifiers/1843dfa29b3e64d891b7f5fbd2e338febd6fc7af3a95c0e4f97d108258bbe82f
Response
{
"txid": "0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc",
"height": 6201,
"tx_position": 1,
"action_position": 0
}
Look up a note commitment
Where a note was created: the action whose cmx matches. Same response shape as the nullifier lookup. Returns 404 when no indexed action created it.
Request
curl https://explorer.nullnet.sh/v1/commitments/96a0a7ea0eee3a816b399e7559e8f3641c3cfa144c238385b89273b858929f10
Response
{
"txid": "0b5e040a9059651f593d1a9da9f4a4283c421bca037ccb2bf6a1337b36a232bc",
"height": 6201,
"tx_position": 1,
"action_position": 0
}
Search
Resolves a search string to the thing to open. Surrounding whitespace is ignored. A decimal number is treated as a block height. A 64-character hex string is matched, in order, against block hashes, mined transactions, pooled transactions, nullifiers and note commitments; the first match wins. Anything else, including addresses, returns 400. No match returns 404.
Query parameters
- Name
q- Type
- string
- Description
Required. A block height or a 64-character hex id.
Response
- Name
kind- Type
- string
- Description
block,transaction,nullifierorcommitment.
- Name
id- Type
- string
- Description
The id to open: block hash, txid, nullifier or commitment.
- Name
height- Type
- integer | null
- Description
Block height, for blocks and mined matches;
nullfor a pooled transaction.
Request
curl "https://explorer.nullnet.sh/v1/search?q=1"
Response
{
"kind": "block",
"id": "0003dc7ed8900ed308ecf55e40a0e09aadbc8074dfd7f81a76cc9cc6ab30b05a",
"height": 1
}
Mempool
Pooled transactions as of the last indexer pass, most recently seen first.
Optional query parameters
- Name
limit- Type
- integer
- Description
Number of items, 1–100. Default 20.
Response
- Name
size- Type
- integer
- Description
Pooled transactions in total.
- Name
items- Type
- array
- Description
Up to
limitpooled transactions, each withtxid,action_count,fee,sizeandfirst_seen(Unix seconds the explorer first saw it).
Request
curl "https://explorer.nullnet.sh/v1/mempool?limit=20"
Response
{
"size": 0,
"items": []
}
Verify a payment disclosure
Checks a payment disclosure produced by the sender's wallet with getpaymentdisclosure (see selective disclosure). The explorer passes it to its node's verifypaymentdisclosure and returns the verdict.
The body is JSON, at most 4096 bytes. disclosure must be non-empty, even-length hex of at most 1024 characters; otherwise the API returns 400. If the node cannot answer, it returns 503 node_unavailable. This route has its own limit of 10 requests per minute per client, and responses are Cache-Control: no-store.
Request body
- Name
disclosure- Type
- string
- Description
Hex from the sender wallet's
getpaymentdisclosure.
Response
- Name
valid- Type
- boolean
- Description
Whether the disclosure opens the output it names.
- Name
reason- Type
- string
- Description
Why it proves nothing. Present only when
validis false.
- Name
txid- Type
- string
- Description
Transaction. Present only when valid.
- Name
index- Type
- integer
- Description
Action index of the output. Present only when valid.
- Name
address- Type
- string
- Description
Recipient address. Present only when valid.
- Name
amount- Type
- string
- Description
Amount paid, in smallest units. Present only when valid.
- Name
memo- Type
- string
- Description
Memo text. Present only when valid and the note has a memo.
- Name
height- Type
- integer
- Description
Height, once mined.
- Name
confirmations- Type
- integer
- Description
Confirmations. Present only when valid.
Request
curl https://explorer.nullnet.sh/v1/disclosures/verify \
-H "Content-Type: application/json" \
-d '{"disclosure": "<hex from getpaymentdisclosure>"}'
Response (invalid)
{
"valid": false,
"reason": "no such action"
}
Health
Health checks live outside /v1, at https://explorer.nullnet.sh/healthz and https://explorer.nullnet.sh/readyz.
/healthzreturns200with the bodyokwhile the process is up./readyzreturns200when the indexer completed a pass within the last 120 seconds, and503with an empty body otherwise.
Request
curl https://explorer.nullnet.sh/healthz
curl -o /dev/null -w "%{http_code}\n" https://explorer.nullnet.sh/readyz
Response
ok