Esplora
Esplora is Blockstream's open source block explorer and API for Bitcoin and Liquid. For your exchange integration, it serves two roles: it's the backend that LWK uses for chain scanning, and it's a REST API you can call directly for transaction lookups, broadcasts, fee estimates, and asset metadata.
Public endpoints
| Network | Base URL |
|---|---|
| Liquid mainnet | https://blockstream.info/liquid/api/ |
| Liquid testnet | https://blockstream.info/liquidtestnet/api/ |
These are free to use and don't require authentication. For high volume production use, consider self hosting.
Mainnet vs testnet URLsEvery example below shows the mainnet base URL (
.../liquid/api/...). To hit the same endpoint on testnet, swap the network segment:
- Mainnet →
https://blockstream.info/liquid/api/...- Testnet →
https://blockstream.info/liquidtestnet/api/...Many of the endpoints will 404 or return empty data if you query mainnet from testnet environments (or vice versa), so make sure your configuration can switch between them.
Most useful endpoints for exchanges
Look up a transaction
# mainnet
curl https://blockstream.info/liquid/api/tx/<txid>
# testnet
curl https://blockstream.info/liquidtestnet/api/tx/<txid>Returns full transaction details including inputs, outputs, confirmation status, fee, and block info.
curl https://blockstream.info/liquid/api/tx/<txid>/statusReturns just the confirmation status: confirmed (boolean), block_height, and block_hash.
Get address UTXOs
curl https://blockstream.info/liquid/api/address/<address>/utxoReturns all unspent outputs for an address. Each UTXO includes txid, vout, value (or valuecommitment for confidential), and asset (or assetcommitment).
Note: For confidential outputs, the value and asset fields are replaced with their blinded commitments. You need blinding keys to unblind them, which is why LWK handles this for you during wallet sync.
Get address transaction history
# Most recent transactions (up to 50 mempool + 25 confirmed)
curl https://blockstream.info/liquid/api/address/<address>/txs
# Paginated confirmed transactions
curl https://blockstream.info/liquid/api/address/<address>/txs/chain/<last_seen_txid>Returns 25 confirmed transactions per page. Pass the last txid from the previous page to get the next batch.
Broadcast a transaction
# mainnet
curl -X POST https://blockstream.info/liquid/api/tx \
-H "Content-Type: text/plain" \
-d "<raw_hex>"
# testnet
curl -X POST https://blockstream.info/liquidtestnet/api/tx \
-H "Content-Type: text/plain" \
-d "<raw_hex>"Send a raw, finalized transaction hex. Returns the txid on success.
Fee estimates
curl https://blockstream.info/liquid/api/fee-estimates
# testnet: .../liquidtestnet/api/fee-estimatesReturns an object mapping confirmation targets (in blocks) to estimated fee rates (sat/vB):
{
"1": 0.1,
"2": 0.1,
"3": 0.1,
"144": 0.1,
"504": 0.1,
"1008": 0.1
}Liquid fees are consistently low. In most cases, you can use a fixed fee rate.
Asset information
Liquid exposes asset data through two different services and it's important not to confuse them:
| Service | URL | Returns |
|---|---|---|
Esplora /asset/<id> | https://blockstream.info/liquid/api/asset/<asset_id> | On-chain statistics: issued / reissued / burned amounts |
| Liquid Asset Registry | https://assets.blockstream.info/ (mainnet) https://assets-testnet.blockstream.info/ (testnet) | Registered metadata: name, ticker, precision, issuer domain |
Esplora asset endpoint (chain stats)
curl https://blockstream.info/liquid/api/asset/<asset_id>Returns the on-chain asset record. It does not return name, ticker, or precision — those live in the Registry.
{
"asset_id": "6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d",
"chain_stats": {
"tx_count": 0,
"issuance_count": 1,
"issued_amount": 0,
"burned_amount": 0,
"has_blinded_issuances": true,
"reissuance_tokens": null,
"burned_reissuance_tokens": 0
},
"mempool_stats": { "...": "..." }
}Use this endpoint to audit supply and burn history on-chain.
Liquid Asset Registry (metadata)
To map an asset ID to a human-readable name, ticker, and precision, query the Registry:
# mainnet
curl https://assets.blockstream.info/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d.json
# testnet
curl https://assets-testnet.blockstream.info/<asset_id>.json{
"asset_id": "6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d",
"name": "Liquid Bitcoin",
"ticker": "LBTC",
"precision": 8,
"entity": { "domain": "blockstream.com" }
}Registry entries exist only for assets whose issuer has published metadata and passed a domain ownership challenge. Unregistered assets have no Registry record — your UI should fall back to the raw asset ID for them.
Cache Registry responses locally; metadata is immutable after issuance.
For more context (schema, v2.0 admin fields, registration flow) see Assets and Asset Types → Asset Registry.
Current chain tip
# Current block height (mainnet)
curl https://blockstream.info/liquid/api/blocks/tip/height
# testnet
curl https://blockstream.info/liquidtestnet/api/blocks/tip/height
# Current block hash
curl https://blockstream.info/liquid/api/blocks/tip/hash
curl https://blockstream.info/liquidtestnet/api/blocks/tip/hashUseful for monitoring chain progress and detecting if your node/API is behind.
Using Esplora from code
Rust (via LWK)
LWK uses Esplora's Electrum interface for wallet sync. You don't call the REST API directly, LWK handles it:
use lwk_wollet::{ElectrumClient, ElectrumUrl};
let url = ElectrumUrl::new("blockstream.info:465", true, true).unwrap(); // testnet
let client = ElectrumClient::new(&url).unwrap();
wollet.full_scan(&client).unwrap();JavaScript
// Pick the base URL for the network you're on
const ESPLORA = network.isMainnet()
? "https://blockstream.info/liquid/api"
: "https://blockstream.info/liquidtestnet/api";
// Get address UTXOs
const utxos = await fetch(`${ESPLORA}/address/${address}/utxo`).then(r => r.json());
// Broadcast a transaction — response body is the plain-text txid
const txid = await fetch(`${ESPLORA}/tx`, {
method: "POST",
body: rawHex,
}).then(r => r.text());If you already created an EsploraClient via LWK, prefer client.broadcastTx(tx) which handles hex encoding and error reporting for you.
Self hosting
For production workloads, self hosting Esplora eliminates rate limits and dependency on third party infrastructure. The Esplora project is open source:
A self hosted Esplora instance requires a synced Liquid/Elements node and the Esplora indexer. Plan for significant disk space (Liquid mainnet blocks are ~38 GB, plus the index).
Rate limits
The public Blockstream endpoints enforce rate limits. If you're making many requests in a short window (e.g., scanning hundreds of addresses), you may get throttled. Solutions:
- Use Waterfalls for wallet sync (single request instead of hundreds)
- Self host Esplora for unlimited queries
- Cache responses for asset metadata and confirmed transactions (they don't change)
Next steps
- Waterfalls: faster wallet sync with a single request