Skip to Content
API ReferenceExplorer API

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 groupPathAuth
Blocks/blocks, /blocks/latest, /blocks/:heightPublic
Transactions/txs, /txs/:hash, /txs/broadcastPublic
Addresses/addresses, /addresses/:address, /addresses/:address/txsPublic
DIDs/dids/:did, /dids/:did/credentialsPublic
Credentials/credentials, /credentials/issuers, /credentials/:idPublic
Validators/validators, /validators/:addressPublic
Search/searchPublic
Stats/stats/network, /stats/chartsPublic
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/82071

Same 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/3GfjBM7v6LZ1N5zp1b12gfpwCN8j

Indexed 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:7Hk3mRtQZvXp2nBw9Lj4K

Indexed 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/3GfjBM7v6LZ1N5zp1b12gfpwCN8j

Same row shape as one data entry above, plus recent blocks proposed by this validator.


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/health

Note 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/ws

Also 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.

Last updated on