# L2BEAT Rollup Risk & TVS API
> Live Ethereum layer-2 / rollup risk and value-secured data from L2BEAT — no key, nothing stored. L2BEAT's signature is its independent risk framework: every rollup is rated by maturity Stage (Stage 0 / 1 / 2) and assessed across the canonical risk dimensions — sequencer failure, state validation, data availability, exit window and proposer failure — each carrying a good / warning / bad sentiment and a plain-language explanation. This is the rollup-risk and total-value-secured (TVS) view, distinct from the L2 economics/fundamentals and the on-chain per-chain APIs in the catalogue. The projects endpoint lists every tracked L2 with its type (Optimistic Rollup, ZK Rollup, Validium, layer3…), category, host chain, maturity Stage, TVS and 7-day change. The project endpoint returns one rollup in full — the TVS breakdown (native / canonical / external, and ether / stablecoin / btc / other), the Stage, providers, purposes and the complete risk assessment. The risks endpoint returns just the risk rosette for a rollup with a sentiment tally. The summary endpoint aggregates the whole ecosystem — total TVS, project count and the distribution by Stage and by type. More than a hundred rollups tracked, updated live. Project lookup is by slug (arbitrum, base, optimism, zksync-era, scroll, linea, starknet).

## 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/l2beat-api/..."
```

## Pricing
- **Free** (Free) — 13,000 calls/Mo, 3 req/s
- **Builder** ($9/Mo) — 195,000 calls/Mo, 10 req/s
- **Pro** ($27/Mo) — 870,000 calls/Mo, 28 req/s
- **Scale** ($62/Mo) — 3,250,000 calls/Mo, 65 req/s

## Endpoints

### Projects

#### `GET /v1/projects` — All tracked L2s ranked by TVS

**Parameters:**
- `type` (query, optional, string) — Filter by type (layer2, layer3) Example: `layer2`
- `limit` (query, optional, string) — Max rows (default 100, max 400) Example: `100`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/l2beat-api/v1/projects?type=layer2&limit=100"
```

**Response:**
```json
{
    "data": {
        "count": 100,
        "source": "L2BEAT",
        "projects": [
            {
                "id": "arbitrum",
                "name": "Arbitrum One",
                "slug": "arbitrum",
                "type": "layer2",
                "stage": "Stage 1",
                "tvs_usd": 16442469376,
                "archived": false,
                "category": "Optimistic Rollup",
                "purposes": [
                    "Universal"
                ],
                "providers": [
                    "Arbitrum"
                ],
                "host_chain": "Ethereum",
                "under_review": false,
                "tvs_change_7d_pct": -12.1689
            },
            {
                "id": "base",
                "name": "Base Chain",
                "slug": "base",
                "type": "layer2",
                "stage": "Stage 1",
                "tvs_usd": 11167780864,
                "archived": false,
                "category": "Optimistic Rollup",
                "purposes": [
                    "Universal"
                ],
                "providers": [
                    "OP Stack"
                ],
                "host_chain": "Ethereum",
                "under_review": false,
                "tvs_change_7d_pct": -0.963
            },
            {
                "id": "polygon-pos",
                "name": "Polygon PoS",
                "slug": "polygon-pos",
                "type": "layer2",
                "
…(truncated, see openapi.json for full schema)
```

### Project

#### `GET /v1/project` — One rollup in full — TVS, Stage, risks

**Parameters:**
- `project` (query, required, string) — Rollup slug/id Example: `arbitrum`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/l2beat-api/v1/project?project=arbitrum"
```

**Response:**
```json
{
    "data": {
        "id": "arbitrum",
        "tvs": {
            "btc_usd": 543245265.78,
            "ether_usd": 1724807716.23,
            "other_usd": 9699862828.34,
            "total_usd": 16442469376,
            "native_usd": 9084722611.21,
            "external_usd": 4732677168.14,
            "canonical_usd": 2625076754.37,
            "change_7d_pct": -12.1689,
            "stablecoin_usd": 4387955141.48
        },
        "name": "Arbitrum One",
        "slug": "arbitrum",
        "type": "layer2",
        "risks": [
            {
                "name": "Sequencer Failure",
                "value": "Self sequence",
                "sentiment": "good",
                "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There can be up to a 1d delay on this operation."
            },
            {
                "name": "State Validation",
                "value": "Fraud proofs (INT)",
                "sentiment": "good",
                "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve."
            },
            {
                "name": "Data Availability",
                "value": "Onchain",
                "sentiment": "good",
                "description": "All of the data needed for proof construction is published on Ethereum L1."
       
…(truncated, see openapi.json for full schema)
```

### Risks

#### `GET /v1/risks` — The risk rosette for a rollup

**Parameters:**
- `project` (query, required, string) — Rollup slug/id Example: `base`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/l2beat-api/v1/risks?project=base"
```

**Response:**
```json
{
    "data": {
        "id": "base",
        "name": "Base Chain",
        "type": "layer2",
        "risks": [
            {
                "name": "Sequencer Failure",
                "value": "Self sequence",
                "sentiment": "good",
                "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There can be up to a 12h delay on this operation."
            },
            {
                "name": "State Validation",
                "value": "Fraud proofs (1R, ZK)",
                "sentiment": "good",
                "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Single round proofs (1R) prove the validity of a state proposal, only requiring a single transaction to resolve. A fault proof eliminates a state proposal by proving that any intermediate state transition in the proposal results in a different state root. For either, a ZK proof is used."
            },
            {
                "name": "Data Availability",
                "value": "Onchain",
                "sentiment": "good",
                "description": "All of the data needed for proof construction is published on Ethereum L1."
            },
            {
                "name": "Exit Window",
                "value": "None",
                "sentiment": "bad",
                "description": "There is no window for users to exit in case of an 
…(truncated, see openapi.json for full schema)
```

### Summary

#### `GET /v1/summary` — Ecosystem aggregate — TVS, Stage and type distribution

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

**Response:**
```json
{
    "data": {
        "source": "L2BEAT",
        "by_type": {
            "layer2": 100,
            "layer3": 16
        },
        "by_stage": {
            "Stage 0": 84,
            "Stage 1": 7,
            "Stage 2": 4,
            "Not applicable": 21
        },
        "top_by_tvs": [
            {
                "name": "Arbitrum One",
                "slug": "arbitrum",
                "stage": "Stage 1",
                "tvs_usd": 16442469376
            },
            {
                "name": "Base Chain",
                "slug": "base",
                "stage": "Stage 1",
                "tvs_usd": 11167780864
            },
            {
                "name": "Hyperliquid",
                "slug": "hyperliquid",
                "stage": "Not applicable",
                "tvs_usd": 5696788480
            },
            {
                "name": "Polygon PoS",
                "slug": "polygon-pos",
                "stage": "Not applicable",
                "tvs_usd": 4123033600
            },
            {
                "name": "OP Mainnet",
                "slug": "op-mainnet",
                "stage": "Stage 1",
                "tvs_usd": 1410632832
            },
            {
                "name": "Mantle",
                "slug": "mantle",
                "stage": "Stage 0",
                "tvs_usd": 1357096064
            },
            {
                "name": "Lighter",
                "slug": "lighter",
                "stage": "Stage 0",
   
…(truncated, see openapi.json for full schema)
```

### Meta

#### `GET /v1/meta` — Service metadata

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

**Response:**
```json
{
    "data": {
        "note": "project is a slug/id (arbitrum, base, optimism, zksync-era, scroll, linea, starknet…). TVS is total value secured in USD; native/canonical/external split how the value is bridged. Stage reflects rollup maturity per the L2BEAT framework.",
        "source": "L2BEAT public API (l2beat.com/api/scaling/summary, live)",
        "service": "l2beat-api",
        "endpoints": {
            "GET /v1/meta": "This document.",
            "GET /v1/risks": "The risk rosette for a rollup (project=arbitrum).",
            "GET /v1/project": "One rollup in full — TVS breakdown, Stage, risks (project=arbitrum).",
            "GET /v1/summary": "Ecosystem aggregate — total TVS, counts by Stage and type.",
            "GET /v1/projects": "All tracked L2s ranked by TVS (optional type=layer2|layer3, limit=100)."
        },
        "description": "Live Ethereum layer-2 / rollup risk and value-secured (TVS) data from L2BEAT. L2BEAT's signature is its independent risk framework: every rollup is rated by maturity Stage (0/1/2) and across sequencer failure, state validation, data availability, exit window and proposer failure (each good/warning/bad). projects = all tracked L2s with type, category, host chain, Stage, TVS and 7d change; project = one rollup in full (TVS breakdown, Stage, providers, purposes, full risk assessment); risks = the risk rosette for a rollup; summary = ecosystem aggregate (total TVS, counts by Stage and type). Live, no key, nothing stored
…(truncated, see openapi.json for full schema)
```


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