# State Proof API
> Fetch verifiable Merkle-Patricia proofs of EVM account and storage state, live, via the chain's public JSON-RPC (eth_getProof, no key). For any address it returns the account's nonce, balance, code hash and storage hash together with the Merkle account proof; for any storage slot it returns the value and its storage proof; and it exposes the block's state, transactions and receipts roots — the roots those proofs verify against. This is the light-client and cross-chain-verification primitive: prove that an account existed or that a storage value was exactly what you claim at a given block, without trusting an indexer. Used by bridges, rollup verifiers, light clients and audit tooling, across Ethereum, Base, Arbitrum, Optimism, BNB, Polygon and more. Reads straight from the chain; live, short cache only.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/stateproof-api/..."
```

## Pricing
- **Free** (Free) — 5,100 calls/Mo, 3 req/s
- **Starter** ($12/Mo) — 102,000 calls/Mo, 8 req/s
- **Pro** ($42/Mo) — 680,000 calls/Mo, 20 req/s
- **Business** ($123/Mo) — 4,350,000 calls/Mo, 50 req/s

## Endpoints

### Proofs

#### `GET /v1/account` — Account state + Merkle account proof

**Parameters:**
- `address` (query, required, string) — Account/contract address (0x + 40 hex) Example: `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`
- `chain` (query, optional, string) — Chain name or id (ethereum, base, arbitrum, optimism, bsc, polygon...) Example: `ethereum`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/stateproof-api/v1/account?address=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&chain=ethereum"
```

**Response:**
```json
{
    "data": {
        "note": "The account's state (nonce, balance, codeHash, storageHash) plus its Merkle-Patricia account proof, verifiable against the block stateRoot (see /v1/roots). balance_wei is the raw integer.",
        "block": "latest",
        "chain": "ethereum",
        "nonce": 1,
        "source": "public JSON-RPC (publicnode) eth_getProof",
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "code_hash": "0xd80d4b7c890cb9d6a4893e6b52bc34b56b25335cb13716e0d1d31383e6b41505",
        "balance_wei": "0",
        "is_contract": true,
        "storage_hash": "0x93ebca03322e801b7d1646d101d2793cd8ed2ccd6c63fb4a7d3e85b4aa9d29d0",
        "account_proof": [
            "0xf90211a0e706920cd6eb1a6f1aa5bf591d44f6ce1e1d6e5d35affc92503b9ef4238921f6a01a8a87d8085dd61d0d0716c0b0365b6371c6e740ebe5623e3e351279aeff124ba0329c7e4bf3dca3a110e6a9b892c18614f499bd0bec63e79f25f2313db3ff07f3a089d6376fc06e6da0e90a1396d5acac9fc53b1140b05b664fecc93b91c5475f8ba00ef270caf706fd77e4d75358edfc000c6de00ded9573dfeb2d327cf0c1c607afa0280023ffa8a6c06acf1df25e77d183084bd5fbc857e7f2c4eff8e6c10408a012a0cb340a4cf2ad6b753f0d9e68833de43a704b2958b70a4ccc60b3285b346d6ba9a033f18a5f4462c9a1b6b4337e86b6ee7b67062595862d62795ff5808104ae0ecfa089188e9f0dccb025c57bb482a8c9c81cdc342862b2298a1e7e38153020c9713ba0a616544f2c40358236a1d37d0a3283f03bba431bf8974a04b1d96a653afeb860a050eb95523788d62822987dca16a96109e4b27f412be1f674934873d29a83030da066181915ee0c5cd47cbe1580abbecf98e68463f61350ee38462316e
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/roots` — Block state/transactions/receipts roots to verify proofs against

**Parameters:**
- `chain` (query, optional, string) — Chain name or id Example: `ethereum`
- `block` (query, optional, string) — Block number, hex, or "latest" Example: `latest`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/stateproof-api/v1/roots?chain=ethereum&block=latest"
```

**Response:**
```json
{
    "data": {
        "note": "The block header roots an account/storage proof verifies against. Use state_root with /v1/account and /v1/storage proofs at the same block.",
        "chain": "ethereum",
        "source": "public JSON-RPC (publicnode) eth_getBlockByNumber",
        "timestamp": 1781424239,
        "block_hash": "0xc8790539536808256dcdb2ba6c58d04cc52c87d517ef59063fd9a2981208447e",
        "state_root": "0xd5f5ef019b8538afc4aca209c227fafc9e33981aa8b1c6a597c590cdbb10d8c8",
        "block_number": 25314414,
        "receipts_root": "0xdc56000aa56513d1816d4af7bdb23bfdb4fc57ca7f1d74628aead27bb13b88c1",
        "transactions_root": "0x598bb71ff4981a753176a004e485141cb8ce22959b14910c491bc8e78349ecf5"
    },
    "meta": {
        "timestamp": "2026-06-14T08:04:10.332Z",
        "request_id": "7c167449-253e-43c4-9153-2c38e9c1b84d"
    },
    "status": "ok",
    "message": "Block roots retrieved successfully",
    "success": true
}
```

#### `GET /v1/storage` — Storage value(s) + storage proof(s)

**Parameters:**
- `address` (query, required, string) — Contract address (0x + 40 hex) Example: `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`
- `slots` (query, required, string) — Storage slots, comma-separated: integers or hex (0,1 or 0x360894...) Example: `0,1`
- `chain` (query, optional, string) — Chain name or id Example: `ethereum`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/stateproof-api/v1/storage?address=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&slots=0%2C1&chain=ethereum"
```

**Response:**
```json
{
    "data": {
        "note": "Per-slot storage value and its Merkle-Patricia proof, verifiable against the account storageHash. value_uint is the value as an integer.",
        "block": "latest",
        "chain": "ethereum",
        "count": 2,
        "source": "public JSON-RPC (publicnode) eth_getProof",
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "storage_hash": "0x93ebca03322e801b7d1646d101d2793cd8ed2ccd6c63fb4a7d3e85b4aa9d29d0",
        "storage_proofs": [
            {
                "key": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "proof": [
                    "0xf90211a067bda0cc165343cb95bbd0a673304774720fcb2f74f8e1b205ed81e2b5023019a05e406fe3b4b2d1eaed95337385311378a83cf241be68fd78d40590b238554918a0abfb478095e8dbb13149181ff434d77e8134f88f79afac4c69c2642f5af9fa26a019d330cffee76a3131f156a3bc16be3e9f1288edc01476103b3e86647321e92aa02624238479cf8db328129903f3c930396a08e23fef11ca718a2e53f607a48d9da056de000e5284335ffbac66b78fc99309a15fa19b19c24051b520076aac1424a6a091bba0a5393439987bc1ee28af83fca82ca6e548f28f1484c3b59fa409f6fa6aa0127f1ce11459418765db5b92348591fe5a1be569e7139062bc0ea417df4e58a5a0a52a3e7e436da48ea8d0672e3efad51d111f5e6de6983a596439e3538f8aa5bea0de0969942136e797f8891c4c3e00684556acd7a4fd217c9a1f418a7f79867c82a090347a11077848e6d90e8abf4c16c1b4d852a64788b5c3b160625266715c0f98a0debf4abb703af6387b13f2a0ea15c785ef300d94f91749a2ce248b599bfb83e1a098bbe751efe6597d54b15866444fb95075591c8f2f1e4
…(truncated, see openapi.json for full schema)
```

### Meta

#### `GET /v1/meta` — Service metadata, supported chains & live sample

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/stateproof-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "chains": [
            "ethereum",
            "base",
            "arbitrum",
            "optimism",
            "bsc",
            "polygon",
            "avalanche",
            "gnosis",
            "linea",
            "scroll"
        ],
        "limits": {
            "max_slots": 16
        },
        "sample": {
            "chain": "ethereum",
            "is_contract": true,
            "proof_nodes": 9
        },
        "source": "public JSON-RPC nodes (publicnode.com) via eth_getProof / eth_getBlockByNumber; decoding computed locally",
        "service": "stateproof-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/roots": "Block state/transactions/receipts roots to verify proofs against (chain, block).",
            "GET /v1/account": "Account state + Merkle account proof (chain, address, block).",
            "GET /v1/storage": "Storage value(s) + storage proof(s) (chain, address, slots, block)."
        },
        "description": "Fetch verifiable Merkle-Patricia proofs of EVM account and storage state live via eth_getProof. Returns account nonce/balance/codeHash/storageHash with its account proof, per-slot storage values with their storage proofs, and the block state/tx/receipts roots the proofs verify against. The light-client and cross-chain-verification primitive. Live, short cache only.",
        "upstream_status": "ok"
    },
    "meta": {
        "timestamp": "2026-06-14T08:04:10.56
…(truncated, see openapi.json for full schema)
```


---
Marketplace page: https://www.oanor.com/api/stateproof-api
OpenAPI spec: https://www.oanor.com/api/stateproof-api/openapi.json
