Explorer API
The Explorer API indexes the Solidus chain into Postgres and serves it back as a searchable REST surface, plus a WebSocket feed for new blocks, transactions, DIDs, and credentials as they land. It is the backend behind explorer.solidus.network .
Base URL: https://explorer.solidus.network/api/v1
Every route below is read-only against the indexer’s own Postgres, except POST /txs/broadcast,
which relays to the live JSON-RPC node. There is no smart-contract layer in the protocol today, so
this API does not — and will not — expose a contract verifier or a transaction decoder for contract
calls; some older product notes claimed otherwise. See JSON-RPC for the underlying chain
methods this indexer reads from.
Authentication
None. Every route on this page is public and unauthenticated. There is no API key, no rate-limit tier, and no write access beyond the single transaction-relay route.
Route index
| Route group | Path | Auth |
|---|---|---|
| Blocks | /blocks, /blocks/latest, /blocks/:height | Public |
| Transactions | /txs, /txs/:hash, /txs/broadcast | Public |
| Addresses | /addresses, /addresses/:address, /addresses/:address/txs | Public |
| DIDs | /dids/:did, /dids/:did/credentials | Public |
| Credentials | /credentials, /credentials/issuers, /credentials/:id | Public |
| Validators | /validators, /validators/:address | Public |
| Search | /search | Public |
| Stats | /stats/network, /stats/charts | Public |
| Health | /health (not under /api/v1 — served at the root) | Public |
| WebSocket | /ws (not under /api/v1 — served at the root) | Public |
Blocks
List blocks
curl "https://explorer.solidus.network/api/v1/blocks?page=1&limit=20"Query params: page (default 1), limit (default 20, max 100).
// Response 200
{
"data": [
{
"height": "82071",
"hash": "1e6be00359dffd3e6a4924b4446deee37f29220c260a76fba53f5a988116c01d",
"parent_hash": "954f2d291a277b88ddc04bec0438339ea575462bf2b50711d164c20e81ef1ad1",
"proposer": "28gvczeVVVQjy6MpP4yexmd3xEsm",
"timestamp_ms": "1785323253741",
"tx_count": 0,
"round": "6512",
"state_root": "c2a009a8fc5f869aee238febb2e362694bd3828748158d758e52420f5a15c89d",
"created_at": "2026-07-29T11:17:36.014Z"
}
],
"total": 63172,
"page": 1,
"limit": 20
}Latest block
curl https://explorer.solidus.network/api/v1/blocks/latest// Response 200 — measured live
{
"height": "82071",
"hash": "1e6be00359dffd3e6a4924b4446deee37f29220c260a76fba53f5a988116c01d",
"parent_hash": "954f2d291a277b88ddc04bec0438339ea575462bf2b50711d164c20e81ef1ad1",
"proposer": "28gvczeVVVQjy6MpP4yexmd3xEsm",
"timestamp_ms": "1785323253741",
"tx_count": 0,
"round": "6512",
"state_root": "c2a009a8fc5f869aee238febb2e362694bd3828748158d758e52420f5a15c89d",
"created_at": "2026-07-29T11:17:36.014Z"
}Block by height
curl https://explorer.solidus.network/api/v1/blocks/82071Same shape as above, plus an embedded transactions array (each entry: hash, tx_index,
sender, type, recipient, amount, fee, status, timestamp_ms).
Transactions
List transactions
curl "https://explorer.solidus.network/api/v1/txs?page=1&limit=20&type=Transfer&address=3GfjBM7v6LZ1N5zp1b12gfpwCN8j"Query params: page, limit, type (transaction type filter), address (sender or recipient),
from_time / to_time (Unix ms window).
// Response 200 — shape
{
"data": [
{
"hash": "<hex>",
"block_height": 82071,
"tx_index": 0,
"sender": "3GfjBM7v6LZ1N5zp1b12gfpwCN8j",
"type": "Transfer",
"recipient": "28gvczeVVVQjy6MpP4yexmd3xEsm",
"amount": "500",
"fee": "10000",
"status": "success",
"timestamp_ms": "1785323253741",
"raw_payload": { "Transfer": { "amount": 500 } }
}
],
"total": 1814,
"page": 1,
"limit": 20
}Transaction by hash
curl https://explorer.solidus.network/api/v1/txs/<hash>Same row shape, plus error_reason (populated only when status is a failure) and created_at.
Broadcast a transaction
curl -X POST https://explorer.solidus.network/api/v1/txs/broadcast \
-H "content-type: application/json" \
-d '{"tx": "<JSON-stringified signed transaction>"}'Relays the signed transaction straight to solidus_sendTransaction on the JSON-RPC node — this
route does no signing and never touches a private key.
// Response 200
{ "tx_hash": "<hex tx hash>" }Addresses
Richlist
curl "https://explorer.solidus.network/api/v1/addresses?page=1&limit=20&sort=tx_count"Query params: page, limit, sort (tx_count default, or first_seen).
// Response 200 — shape
{
"data": [
{ "address": "3GfjBM7v6LZ1N5zp1b12gfpwCN8j", "first_seen": "...", "last_seen": "...", "tx_count": 412, "is_validator": true, "did": null }
],
"total": 480,
"page": 1,
"limit": 20
}Address detail
curl https://explorer.solidus.network/api/v1/addresses/3GfjBM7v6LZ1N5zp1b12gfpwCN8jIndexed row (address, first_seen, last_seen, tx_count, is_validator, did, created_at,
updated_at) enriched with a live RPC read of balance and nonce (solidus_getBalance /
solidus_getNonce — falls back to 0 if the RPC call errors).
Address transactions
curl "https://explorer.solidus.network/api/v1/addresses/3GfjBM7v6LZ1N5zp1b12gfpwCN8j/txs?page=1&limit=20"Same list shape as GET /txs, filtered to transactions where the address is sender or recipient.
DIDs
DID detail
curl https://explorer.solidus.network/api/v1/dids/did:solidus:testnet:7Hk3mRtQZvXp2nBw9Lj4KIndexed row (did, controller, public_key, active, created_ms, updated_ms, tx_hash,
created_at) plus credentials_count and a live_document field — a live
solidus_didResolve call against the chain (null if the RPC read fails). See
DIDs for the DID Document shape.
Credentials for a DID
curl "https://explorer.solidus.network/api/v1/dids/did:solidus:testnet:.../credentials?page=1&limit=20"Returns credentials where the DID is either subject or issuer, in the same shape as GET /credentials below.
Credentials
List credentials
curl "https://explorer.solidus.network/api/v1/credentials?page=1&limit=20&type=KycLevel1Credential"Query params: page, limit, type, issuer (issuer DID), subject (subject DID).
// Response 200 — shape
{
"data": [
{
"credential_id": "urn:solidus:credential:...",
"issuer_did": "did:solidus:testnet:...",
"subject_did": "did:solidus:testnet:...",
"credential_type": "KycLevel1Credential",
"hash": "<hex>",
"issued_ms": "1785200000000",
"revoked": false,
"revoked_ms": null,
"tx_hash": "<hex>"
}
],
"total": 390,
"page": 1,
"limit": 20
}Issuer stats
curl "https://explorer.solidus.network/api/v1/credentials/issuers?page=1&limit=20"Aggregated per-issuer counts: issuer_did, credentials_issued, active_credentials,
revoked_credentials, first_issued, last_issued. This route must be registered before
/credentials/:id in the route table — issuers would otherwise be swallowed as a credential ID.
Credential detail
curl https://explorer.solidus.network/api/v1/credentials/urn:solidus:credential:...The indexed row plus a verification field — a live solidus_credentialVerify RPC call
(null if the RPC read fails).
Validators
List validators
curl "https://explorer.solidus.network/api/v1/validators?limit=2"// Response 200 — measured live
{
"data": [
{ "address": "3GfjBM7v6LZ1N5zp1b12gfpwCN8j", "staked": "1000000000000", "unbonding": "0", "reputation": 1000, "active": true, "blocks_proposed": 0, "updated_at": "2026-07-29T11:23:00.044Z" },
{ "address": "28gvczeVVVQjy6MpP4yexmd3xEsm", "staked": "0", "unbonding": "0", "reputation": 0, "active": true, "blocks_proposed": 15788, "updated_at": "2026-07-29T11:23:00.063Z" }
],
"summary": { "total_validators": 5, "active_validators": 5, "total_staked": "1000000000000", "total_blocks_proposed": 63172 },
"total": 5,
"page": 1,
"limit": 2
}Query params: page, limit, sort (staked default, blocks_proposed, or reputation).
Validator detail
curl https://explorer.solidus.network/api/v1/validators/3GfjBM7v6LZ1N5zp1b12gfpwCN8jSame row shape as one data entry above, plus recent blocks proposed by this validator.
Search
curl "https://explorer.solidus.network/api/v1/search?q=a"Query params: q (required), type (optional filter — block, transaction, validator, did,
or credential).
// Response 200 — measured live
{ "data": [], "total": 0 }Stats
Network stats
Cached 30 seconds server-side.
curl https://explorer.solidus.network/api/v1/stats/network// Response 200 — measured live
{
"blocks": { "total_blocks": 63172, "latest_height": "82071", "latest_timestamp": "1785323253741" },
"transactions": { "total_transactions": 1814, "unique_senders": 1 },
"addresses": { "total_addresses": 480 },
"dids": { "total_dids": 1, "active_dids": 1 },
"credentials": { "total_credentials": 390, "active_credentials": 390 },
"validators": { "total_validators": 5, "active_validators": 5, "total_staked": "1000000000000" },
"cached_at": 1785324212542
}Chart data
curl "https://explorer.solidus.network/api/v1/stats/charts?metric=blocks&range=24h"Query params: metric (blocks default, transactions/txs, or dids), range (1h, 24h
default, 7d, 30d).
// Response 200 — shape
{
"metric": "blocks",
"range": "24h",
"bucket_ms": 864000,
"data": [{ "bucket": "1785237600000", "count": 42 }]
}Health
curl https://explorer.solidus.network/healthNote the path — /health is registered at the root, not under /api/v1.
// Response 200
{ "status": "ok", "ts": "2026-07-29T11:17:36.014Z" }WebSocket feed
wss://explorer.solidus.network/wsAlso a root-level path, not under /api/v1. Send a JSON message to subscribe to one or more
topics:
{ "subscribe": ["blocks", "transactions", "dids", "credentials"] }Each new indexed event arrives as:
{ "type": "block", "data": { "...": "the same block row shape as GET /blocks/latest" } }type is one of block, transaction, did, credential. The server also sends
{"type":"ping"} every 30 seconds as a heartbeat. Send {"unsubscribe": ["blocks"]} to stop a
topic.
Error format
{
"type": "https://solidus.network/errors/404",
"title": "Not Found",
"status": 404,
"detail": "Block not found",
"instance": "/api/v1/blocks/999999999"
}RFC 7807 Problem Details, the same shape used across every Solidus backend.