---
updatedAt: 2026-06-01T15:17:07.000Z
agentTools:
  projectIndex: https://docs.liquid.net/llms.txt
---

# 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](#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

```bash
# 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.

```bash
curl https://blockstream.info/liquid/api/tx/<txid>/status
```

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

### Get address UTXOs

```bash
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

```bash
# 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

```bash
# 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

```bash
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):

```json
{
  "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)

```bash
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.

```json
{
  "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:

```bash
# mainnet
curl https://assets.blockstream.info/6f0279e9ed041c3d710a9f57d0c02928416460c4b722ae3457a11eec381c526d.json

# testnet
curl https://assets-testnet.blockstream.info/<asset_id>.json
```

```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](/docs/liquid-assets).

### Current chain tip

```bash
# 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:

```rust
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

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

* [Esplora on GitHub](https://github.com/Blockstream/esplora)
* [Esplora API documentation](https://github.com/Blockstream/esplora/blob/master/API.md)

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](/docs/waterfalls): faster wallet sync with a single request