SVM Scan API (1.0)

Download OpenAPI specification:

SVM Scan is a read-only REST API that serves indexed data for the Steem Virtual Machine chain — a Cosmos SDK chain with an integrated EVM. It's the backend for svmscan.blazeapps.org, but is itself a public, unauthenticated API that anyone can call directly.

A background indexer walks the chain block-by-block into MongoDB (backfill from genesis, then a live tail of new blocks), and this API serves that indexed data. A few endpoints are deliberate exceptions that proxy the chain (or an external LCD/EVM RPC) live instead of reading from the index — each one says so explicitly in its description below.

Conventions

  • Pagination: every list endpoint returns the same envelope — { "data": [...], "pagination": { "page": 0, "perPage": 50, "total": 123 } }. page is 0-indexed. Pass ?page= and ?perPage= as query strings; omitting them uses the endpoint's own default page size.
  • Errors: non-2xx responses are { "error": "human-readable message" }.
  • Timestamps: always ISO-8601 UTC strings (e.g. 2026-08-12T00:32:29.334Z).
  • Big numbers as strings: coin amounts, block heights used as ids, registration/deposit/withdrawal ids, and anything else that can exceed JavaScript's safe integer range is serialized as a string, not a JSON number. Only genuinely small integers (page numbers, counts, block heights used as heights) are real numbers.
  • Denoms: the chain's native token is asteem (18 decimals, symbol STEEM) — the EVM-side equivalent of the same token is also called STEEM. IBC denoms arrive as ibc/<hash>; use GET /denoms/{denom} or an account response's resolvedDenoms map to get the real symbol.

Health

API and indexer health

Checks MongoDB and chain-RPC connectivity directly (not just "is the process up") and reports current indexer progress. This is what the frontend polls every 10s to decide whether to show the app or an "unreachable" screen — always returns HTTP 200, check status in the body, not the status code.

Responses

Response samples

Content type
application/json
{
  • "status": "ok",
  • "mongo": true,
  • "chain": true,
  • "indexerMode": "live",
  • "lastIndexedHeight": 382210
}

Network

Live network status

Proxies the chain's current sync status directly (not indexed) — chain id, head height, peer count, catching-up flag, average block interval.

Responses

Response samples

Content type
application/json
{
  • "chainId": "steemvm",
  • "blockHeight": 382211,
  • "catchingUp": false,
  • "peered": 3,
  • "blockInterval": 6.7
}

Blocks

List blocks

Newest first. Default page size 50.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Get a block by height

path Parameters
height
required
integer
Example: 353345

Responses

Response samples

Content type
application/json
{
  • "height": 353345,
  • "hash": "9588C1B80D7866742A563495D9791737C683B676B64EC79BAAAFA41A02913951",
  • "time": "2026-08-12T00:32:29.334Z",
  • "proposerAddress": "64837863184C5B2C462593FCD5C366B0558C4EF4",
  • "appHash": "34C979A8E10126D208206FA3A69613D69967752B52DE00622EDA0458C5507FFE",
  • "txCount": 3,
  • "txHashes": [
    ]
}

List transactions in a block

Unpaginated — returns every transaction in the block (block tx counts are always small).

path Parameters
height
required
integer
Example: 353345

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Transactions

List transactions

Newest first. Default page size 50.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Get a transaction by hash

Messages are decoded server-side (see @dexplorer/shared's message registry) — a type this API doesn't have a named decoder for still decodes, just with generic field_1/field_2/... keys instead of real names. Two message types get extra enrichment merged into data: MsgSubmitSteemDeposit/MsgSubmitNameRegistration get an oracleMoniker (the attesting validator's moniker), and MsgConfirmName gets a linkedSteemAccount.

path Parameters
hash
required
string
Example: C05E4276B2B53C907E600335B67C3AD7F6A5BA028B87F841D7D65AB542DB5A0F

Cosmos transaction hash, case-insensitive.

Responses

Response samples

Content type
application/json
{
  • "hash": "C05E4276B2B53C907E600335B67C3AD7F6A5BA028B87F841D7D65AB542DB5A0F",
  • "height": 353345,
  • "timestamp": "2026-08-12T00:32:29.334Z",
  • "code": 0,
  • "success": true,
  • "messageTypes": [
    ],
  • "fee": [ ],
  • "gasUsed": "92488",
  • "gasWanted": "600000",
  • "log": "",
  • "memo": "",
  • "chainId": "steemvm",
  • "messages": [
    ],
  • "events": [
    ],
  • "senders": [
    ],
  • "ibcTransfer": null
}

Validators

List validators

Sorted by voting power (tokens) descending. Default page size 100.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

status
string
Value: "active"

Pass active to only return bonded validators; omit for all (including jailed/unbonding).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Validator set summary

Responses

Response samples

Content type
application/json
{
  • "activeCount": 11,
  • "totalCount": 13,
  • "avgCommission": 10
}

Get a validator

The identity path segment matches against identity (Keybase), moniker, or operatorAddress — whichever hits first.

path Parameters
identity
required
string
Example: blaze.apps

Responses

Response samples

Content type
application/json
{
  • "operatorAddress": "steemvaloper107662cdhfe760n2lk9yhsv8fdve3pkzh4gyrhl",
  • "moniker": "blaze.apps",
  • "identity": "",
  • "status": "BOND_STATUS_UNBONDING",
  • "jailed": true,
  • "tokens": "159885000000000000000000",
  • "bondDenom": "asteem",
  • "commissionRate": "100000000000000000",
  • "votingPowerPercent": 19.78739517908017,
  • "website": "",
  • "details": "owner=STM59ytBUdJ1DaSeFoz4GP5nBFiVBF2dpEDN4cHcR4wYFxWvE2ctR;active=STM5fvPvqwkwDTKXW1wsr7wPdeVXjetjvg1Wer8Zs7P24KFHht2Be;posting=STM5nr8yJLekbns9BNtx8FUxZTvphtfuNKVkTqCXswAjM6GTrQtdX",
  • "delegatorShares": "161500000000000000000000000000000000000000",
  • "minSelfDelegation": "1",
  • "unbondingHeight": "381834",
  • "consensusPubkey": "{\"typeUrl\":\"/cosmos.crypto.ed25519.PubKey\",\"value\":\"CiDYdgQY7WlOsllEhbN8WL25EgFCf2uTCZVI9GbEgUmvVw==\"}",
  • "uptime": {
    }
}

Proposals

List governance proposals

Newest first. Default page size 10.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Proposal counts

Responses

Response samples

Content type
application/json
{
  • "total": 7,
  • "activeVoting": 0,
  • "passed": 3
}

Get a proposal

path Parameters
id
required
integer
Example: 1

Responses

Response samples

Content type
application/json
{
  • "id": 1,
  • "title": "Activate gov precompile (0x...0805)",
  • "status": "PROPOSAL_STATUS_PASSED",
  • "votingStartTime": null,
  • "votingEndTime": null,
  • "submitTime": null,
  • "summary": "Add the already-registered gov precompile to active_static_precompiles so gov is callable from EVM/MetaMask.",
  • "proposer": "steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "depositEndTime": null,
  • "totalDeposit": [
    ],
  • "finalTallyResult": {
    },
  • "messages": [
    ]
}

Accounts

Recently active accounts

Derived from the last 200 indexed transactions' senders, not a dedicated collection.

query Parameters
limit
integer <= 50
Default: 10

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Get account balances and info

Deliberate exception to the rest of this API: balances and sequence are fetched live from the chain (not pre-indexed), since indexing balances for every address ever seen is out of scope. Cached server-side for 15s per address. ibc/<hash> balances are resolved to their real symbol/decimals in resolvedDenoms.

path Parameters
address
required
string
Example: steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu

bech32 account address.

Responses

Response samples

Content type
application/json
{
  • "address": "steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "accountNumber": "0",
  • "sequence": "0",
  • "balances": [
    ],
  • "stakedBalance": {
    },
  • "validator": {
    },
  • "resolvedDenoms": {
    }
}

List an account's transactions

Served from the transactions collection's indexed senders field. Default page size 10.

path Parameters
address
required
string
Example: steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu

bech32 account address.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

IBC Transfers

List IBC transfers

Every indexed transaction whose events matched an IBC packet-transfer pattern. Newest first. Default page size 100.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Params

Chain module parameters

Aggregate of staking/mint/distribution/slashing/gov params, refreshed periodically (not per-block — these barely change).

Responses

Response samples

Content type
application/json
{
  • "staking": {
    },
  • "mint": {
    },
  • "distribution": {
    },
  • "slashing": {
    },
  • "gov": {
    }
}

Denoms

List known denom metadata

Responses

Response samples

Content type
application/json
[
  • {
    },
  • {
    }
]

Get denom metadata

Falls back to a heuristic guess (source: "fallback") for an unrecognized denom instead of 404ing.

path Parameters
denom
required
string
Example: asteem

Responses

Response samples

Content type
application/json
{
  • "denom": "asteem",
  • "displayName": "Steem",
  • "symbol": "STEEM",
  • "decimals": 18,
  • "source": "seed"
}

EVM

Get EVM transaction execution details

Proxies the chain's own EVM JSON-RPC live (10 min server-side cache) — decoded ERC-20/NFT Transfer/Deposit log events plus the raw native-value transfer amount.

path Parameters
hash
required
string
Example: 0xe5ca13579c3cf49d5d4fd99573fd69a92f03e008d6333589fde5ce559a0bc335

0x-prefixed EVM transaction hash (not the Cosmos tx hash).

Responses

Response samples

Content type
application/json
{}

List ERC-20/NFT tokens held by an address

Proxies the chain's Blockscout instance (1 min server-side cache) — there's no way to enumerate "every token an address holds" via JSON-RPC alone. Fails soft to [] if Blockscout is unreachable, since this is supplementary to the account page, not load-bearing.

path Parameters
address
required
string
Example: steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu

bech32 account address.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Liquidity Pools

List EVM liquidity pools

Every Uniswap-V3-style PoolCreated event seen while indexing MsgEthereumTx transactions. Newest first. Default page size 25.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Bridge Deposits

The steembridge module's Steem → SVM deposit direction. A user sends STEEM to a gateway account on Steem with a memo tagging their SVM address; bonded validators (oracles) attest to the deposit, and once enough attestations land it's minted on-chain.

List bridge deposits

Sorted by internal id descending (newest first). Default page size 25.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

status
string
Enum: "pending" "minted" "unclaimable"

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Deposit counts by status

Responses

Response samples

Content type
application/json
{
  • "pending": 2,
  • "minted": 1743,
  • "unclaimable": 113,
  • "total": 1861
}

Get a deposit by internal id or Steem txid

path Parameters
idOrTxid
required
string
Example: 8

Responses

Response samples

Content type
application/json
{
  • "id": "8",
  • "txid": "9be06037c04bcdfa61de6a701dbe2220e2f1ec1a",
  • "opIndex": 0,
  • "steemBlock": "107853469",
  • "steemTimestamp": "2026-07-16T14:05:06Z",
  • "steemSender": "blaze.apps",
  • "gatewayAccount": "blaze.apps",
  • "amountMillisteem": "318971",
  • "memo": "svm-deposit steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "derivedDestination": "steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "destinationType": "DESTINATION_TYPE_COSMOS",
  • "status": "DEPOSIT_STATUS_MINTED",
  • "minted": true,
  • "mintedAt": "12693",
  • "mintTxHash": "1b901c472e1faa79393e826fc16ce3ccdcb07c14489e57beef797d5e6d93be16",
  • "createdAtHeight": "12646",
  • "validatorConfirmations": [
    ]
}

Bridge Withdrawals

The steembridge module's SVM → Steem direction ("bridge-out"). A user burns asteem via MsgBridgeOut, creating an immutable withdrawal record. There is currently no automated Steem-side payout — this is a queue for validators to relay manually.

List bridge withdrawals

Sorted by internal id descending. Default page size 25.

query Parameters
page
integer >= 0
Default: 0

0-indexed page number.

perPage
integer [ 1 .. 200 ]

Items per page (endpoint-specific default and max).

status
string
Value: "requested"

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "pagination": {
    }
}

Withdrawal counts and chain-wide bridge totals

The total*Asteem/netOutstandingAsteem fields come from a live bridge_statistics LCD call, not local counts.

Responses

Response samples

Content type
application/json
{
  • "total": 3,
  • "requested": 3,
  • "totalMintedAsteem": "1018234490000000000000000",
  • "totalBurnedAsteem": "3000000000000000000000",
  • "netOutstandingAsteem": "1015234490000000000000000"
}

Get a withdrawal by internal id or burn transaction hash

path Parameters
idOrBurnTxHash
required
string
Example: 2

Responses

Response samples

Content type
application/json
{
  • "id": "2",
  • "sender": "steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "destinationSteemAccount": "blaze.apps",
  • "amountAsteem": "1000000000000000000000",
  • "amountMillisteem": "1000000",
  • "memo": "Bridge out to Steem",
  • "burnTxHash": "2bedd554ae62c4c8c21d5530f006f28f6703581afe33f5d2f5f0607398c4c003",
  • "status": "WITHDRAWAL_STATUS_REQUESTED",
  • "createdAtHeight": "173386"
}

Name Service (SVMNS)

Steem Virtual Machine Name Service — links a Steem username to an SVM address through a registration lifecycle (pending → awaiting → active/superseded/expired). Not backed by MongoDB — every endpoint in this group proxies the chain's LCD REST API live (with a short server-side cache), because the underlying query surface has no way to enumerate "every name ever registered," only targeted lookups plus two status-filtered queues.

Resolve a Steem username to its currently linked address

path Parameters
steemAccount
required
string
Example: blaze.apps

Responses

Response samples

Content type
application/json
{
  • "steemAccount": "blaze.apps",
  • "address": "steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu",
  • "registrationId": "7",
  • "linkedAt": "23907"
}

Reverse lookup — every active name an address owns

path Parameters
address
required
string
Example: steem107662cdhfe760n2lk9yhsv8fdve3pkzhlmtsvu

bech32 account address.

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Full registration history for a Steem username

Every registration attempt ever submitted for this account — pending, awaiting, active, superseded, and expired. The only way to enumerate a name's history, since there's no generic "list all registrations" query.

path Parameters
steemAccount
required
string
Example: blaze.apps

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Registrations still accumulating validator attestations

Responses

Response samples

Content type
application/json
[ ]

Registrations awaiting the destination's confirm-name transaction

Reached the attestation threshold but not yet confirmed by the destination address.

Responses

Response samples

Content type
application/json
[ ]

Get a registration by id

path Parameters
id
required
string
Example: 26

Responses

Response samples

Content type
application/json
{
  • "id": "26",
  • "txid": "13e5acea13fd674e3f4ed6f2819d8c423d7a6107",
  • "opIndex": 0,
  • "steemBlock": "108627196",
  • "steemTimestamp": "2026-08-12T13:53:33Z",
  • "steemAccount": "steem-agora",
  • "gatewayAccount": "svm.bank",
  • "amountMillisteem": "1",
  • "memo": "svm-register steem1p58n3cf3jjhsx2q5hy0n5t6ygulwg6x7ewqfjk",
  • "derivedDestination": "steem1p58n3cf3jjhsx2q5hy0n5t6ygulwg6x7ewqfjk",
  • "destinationType": "DESTINATION_TYPE_COSMOS",
  • "status": "NAME_REGISTRATION_STATUS_ACTIVE",
  • "createdAtHeight": "360730",
  • "awaitingSinceHeight": "360738",
  • "confirmedAtHeight": "360769",
  • "confirmTxHash": "ad399b7828dcfb8e4734af7a79523b879f9e25c008f3614ee335936ef1159da7",
  • "validatorConfirmations": [
    ]
}