# Storage Slot API
> Read any smart contract's raw EVM storage live via the chain's public JSON-RPC, decode each 32-byte word as an address, uint or bool, and resolve proxy implementation pointers across every common proxy standard — EIP-1967, EIP-1822/UUPS and the legacy OpenZeppelin/zeppelinos slot, plus beacon proxies. This is how you find out what a proxy actually points to, who its admin is, or what a contract is storing — even for unverified contracts where source and ABI are unavailable. Give it a chain and an address: read one slot, scan the first N slots to peek at the state layout, or auto-resolve the proxy implementation. The on-chain state-inspection layer for auditors, upgrade monitors and security tooling, across Ethereum, Base, Arbitrum, Optimism, BNB, Polygon and more. 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/storageslot-api/..."
```

## Pricing
- **Free** (Free) — 4,600 calls/Mo, 3 req/s
- **Starter** ($11/Mo) — 92,000 calls/Mo, 8 req/s
- **Pro** ($39/Mo) — 610,000 calls/Mo, 20 req/s
- **Business** ($112/Mo) — 4,100,000 calls/Mo, 50 req/s

## Endpoints

### Storage

#### `GET /v1/proxy` — Resolve proxy implementation/admin/beacon across all standards

**Parameters:**
- `address` (query, required, string) — 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/storageslot-api/v1/proxy?address=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&chain=ethereum"
```

**Response:**
```json
{
    "data": {
        "note": "Resolves the proxy implementation/admin/beacon by reading the standard proxy storage slots (EIP-1967, EIP-1822/UUPS, legacy OpenZeppelin/zeppelinos). is_proxy is false when none are set.",
        "admin": null,
        "chain": "ethereum",
        "slots": {
            "eip1967_admin": null,
            "eip1967_beacon": null,
            "zeppelinos_impl": {
                "raw": "0x00000000000000000000000043506849d7c04f9138d1a2050bbf3a0c054402dd",
                "role": "implementation",
                "address": "0x43506849d7c04f9138d1a2050bbf3a0c054402dd",
                "standard": "OpenZeppelin/zeppelinos (legacy)"
            },
            "eip1822_proxiable": null,
            "eip1967_implementation": null
        },
        "beacon": null,
        "source": "public JSON-RPC (publicnode)",
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
        "is_proxy": true,
        "implementation": "0x43506849d7c04f9138d1a2050bbf3a0c054402dd",
        "implementation_standard": "OpenZeppelin/zeppelinos (legacy)"
    },
    "meta": {
        "timestamp": "2026-06-14T08:04:11.710Z",
        "request_id": "f491eac2-364c-4725-8ce8-525a30bc599d"
    },
    "status": "ok",
    "message": "Proxy storage resolved successfully",
    "success": true
}
```

#### `GET /v1/scan` — Read sequential storage slots, decoded

**Parameters:**
- `address` (query, required, string) — Contract address (0x + 40 hex) Example: `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48`
- `from` (query, optional, string) — First slot index (default 0) Example: `0`
- `count` (query, optional, string) — How many slots (1-64, default 10) Example: `8`
- `chain` (query, optional, string) — Chain name or id Example: `ethereum`

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

**Response:**
```json
{
    "data": {
        "from": 0,
        "note": "Reads sequential storage slots from..from+count and decodes each. Good for peeking at a contract's state layout (slot 0, 1, 2 ...).",
        "chain": "ethereum",
        "count": 8,
        "slots": [
            {
                "slot": 0,
                "value": {
                    "raw": "0x000000000000000000000000fcb19e6a322b27c06842a71e8c725399f049ae3a",
                    "as_bool": null,
                    "as_uint": "1442626706025541066953462928744535818996053290554",
                    "is_zero": false,
                    "as_address": "0xfcb19e6a322b27c06842a71e8c725399f049ae3a"
                },
                "slot_hex": "0x0"
            },
            {
                "slot": 1,
                "value": {
                    "raw": "0x0000000000000000000000004914f61d25e5c567143774b76edbf4d5109a8566",
                    "as_bool": null,
                    "as_uint": "417223780715013227085836490829281552150151464294",
                    "is_zero": false,
                    "as_address": "0x4914f61d25e5c567143774b76edbf4d5109a8566"
                },
                "slot_hex": "0x1"
            },
            {
                "slot": 2,
                "value": {
                    "raw": "0x0000000000000000000000000a06be16275b95a7d2567fbdae118b36c7da78f9",
                    "as_bool": null,
                    "as_uint": "57240271052284111913658603083735073530102577401",
                    "
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/slot` — Read & decode one storage slot

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

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

**Response:**
```json
{
    "data": {
        "note": "The 32-byte word stored at this slot, decoded as address (if top 12 bytes are zero), uint and bool. Reads live via eth_getStorageAt.",
        "slot": "0x0",
        "chain": "ethereum",
        "value": {
            "raw": "0x000000000000000000000000fcb19e6a322b27c06842a71e8c725399f049ae3a",
            "as_bool": null,
            "as_uint": "1442626706025541066953462928744535818996053290554",
            "is_zero": false,
            "as_address": "0xfcb19e6a322b27c06842a71e8c725399f049ae3a"
        },
        "source": "public JSON-RPC (publicnode)",
        "address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"
    },
    "meta": {
        "timestamp": "2026-06-14T08:04:11.932Z",
        "request_id": "69d72e7c-4231-4f16-9983-8a707c14660b"
    },
    "status": "ok",
    "message": "Storage slot retrieved successfully",
    "success": true
}
```

### Meta

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

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

**Response:**
```json
{
    "data": {
        "chains": [
            "ethereum",
            "base",
            "arbitrum",
            "optimism",
            "bsc",
            "polygon",
            "avalanche",
            "gnosis",
            "fantom",
            "linea",
            "scroll",
            "blast"
        ],
        "sample": {
            "chain": "ethereum",
            "is_proxy": true,
            "implementation": "0x43506849d7c04f9138d1a2050bbf3a0c054402dd"
        },
        "source": "public JSON-RPC nodes (publicnode.com) via eth_getStorageAt; decoding computed locally",
        "service": "storageslot-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/scan": "Read sequential slots from..from+count, decoded (chain, address, from, count).",
            "GET /v1/slot": "Read & decode one storage slot (chain, address, slot — hex or integer).",
            "GET /v1/proxy": "Resolve proxy implementation/admin/beacon across all standards (chain, address)."
        },
        "description": "Read any contract's raw EVM storage live via eth_getStorageAt, decode each word as address/uint/bool, and resolve proxy implementation pointers across EIP-1967, EIP-1822/UUPS and legacy OpenZeppelin proxy standards. Works on unverified contracts. The on-chain state-inspection layer for auditors and upgrade monitors. Live, short cache only.",
        "upstream_status": "ok"
    },
    "meta": {
        "timestamp": "2026-06-14T08:04:12.01
…(truncated, see openapi.json for full schema)
```


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