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

NetworkBase URL
Liquid mainnethttps://blockstream.info/liquid/api/
Liquid testnethttps://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 URLs

Every 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>/status

Returns just the confirmation status: confirmed (boolean), block_height, and block_hash.

Get address UTXOs

curl https://blockstream.info/liquid/api/address/<address>/utxo

Returns 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-estimates

Returns 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:

ServiceURLReturns
Esplora /asset/<id>https://blockstream.info/liquid/api/asset/<asset_id>On-chain statistics: issued / reissued / burned amounts
Liquid Asset Registryhttps://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/hash

Useful 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:

  1. Use Waterfalls for wallet sync (single request instead of hundreds)
  2. Self host Esplora for unlimited queries
  3. Cache responses for asset metadata and confirmed transactions (they don't change)

Next steps

  • Waterfalls: faster wallet sync with a single request

The Liquid Network is a Bitcoin layer-2 enabling the issuance of security tokens and other digital assets.

© 2023 Liquid Network
All rights reserved.

Feedback and Content Requests

We'd be happy to hear your suggestions on how we can improve this site.

BuildOnL2 Community

The official BuildOnL2 community lives
at community.liquid.net. Join us and build the future of Bitcoin on Liquid.

Telegram

Community-driven telegram group where
most of the Liquid developers hang out.
Go to t.me/liquid_devel to join.