# ASP snapshot API

> The snapshot API is the HTTP surface the [ASP](/protocol/asp/what-is-an-asp) exposes so clients can sync without scanning the chain directly. Its `/note-events` endpoint is the primary discovery feed, while the `/event-snapshot/payload` endpoint serves a pre-indexed view of all pool activity that clients use to reconcile [note](/concepts/notes) status. Both replace dozens of chunked `eth_getLogs` calls with a single JSON payload.

The snapshot API is the HTTP surface the [ASP](/protocol/asp/what-is-an-asp) exposes so clients can sync without scanning the chain directly. Its `/note-events` endpoint is the primary discovery feed, while the `/event-snapshot/payload` endpoint serves a pre-indexed view of all pool activity that clients use to reconcile [note](/concepts/notes) status. Both replace dozens of chunked `eth_getLogs` calls with a single JSON payload.

## Endpoint

```text
GET https://api-dev.0xbow.io/{chainId}/public/event-snapshot/payload?entrypoint={entrypointAddress}
```

The `entrypoint` query parameter scopes the snapshot to one pool on multi-pool chains, and the SDK's `HttpASPDataProvider` always sends it (see [Multi-pool deployments](#multi-pool-deployments) below).

## Response schema (abridged)

```json
{
    "chainId": "11155111",
    "snapshotBlockNumber": "10881152",
    "generatedAt": "2026-05-19T19:57:03.712Z",
    "deposits": [
        {
            "txHash": "0x...",
            "logIndex": 549,
            "depositAddress": "0x...",
            "outputCommitment": "31452408...",
            "depositedValue": "10000000000000000",
            "fee": "0",
            "blockNumber": "10758126",
            "blockTimestamp": "2026-04-29T21:41:12.000Z",
            "asset": "0xeeee..."
        },
        ...
    ],
    "transacts": [ ... ],
    "ragequits": [ ... ]
}
```

## Other endpoints

`GET /{chainId}/public/note-events?since={fromBlock}&until={toBlock}` Encrypted Note-event payloads over a block range. This is the primary feed `discoverNotes()` pulls, with RPC gap-fill past the ASP's last-synced block.
`GET /association-set/root?chainId={chainId}` The ASP's current association-set root.
`GET /association-set/leaves?chainId={chainId}` The approved-label leaves backing the current root.
`GET /labels/{decimalLabelHash}/status` Status of a specific deposit label (approved / pending / rejected / unknown). The path segment is `Poseidon(label)` encoded as a decimal integer. The SDK calls this path-only form with no query scoping. A frontend may additionally pass optional `chainId` and `entrypoint` query parameters here as a multi-pool best practice, while the SDK label-status lookup stays path-only.
`GET /public-key` The ASP's X25519 pubkey. Clients encrypt the deposit's label-registration payload (the `aspCiphertext` passed to [`Entrypoint`](/protocol/contracts/entrypoint)`.deposit`) to this key. Note events are encrypted to recipient viewing keys, never to the ASP.

## Multi-pool deployments

The SDK's `HttpASPDataProvider` scopes its requests by both `chainId` and `entrypoint`: the entrypoint address is a required field of its config, and the provider appends `entrypoint={entrypointAddress}` to the association-set, event-snapshot, and note-events requests (e.g. `/association-set/root?chainId={chainId}&entrypoint={entrypoint}`, `/{chainId}/public/event-snapshot/payload?entrypoint={entrypoint}`). On a chain that hosts more than one pool, resolve your pool's entrypoint from the ASP's `/global/public/entrypoints` feed (matched by [`PoolVault`](/protocol/contracts/pool-vault) address).

## How the SDK uses it

The SDK reaches these endpoints through `HttpASPDataProvider`. When `aspUrl` is present in the session config, `discoverNotes()` pulls encrypted Note events from the `/note-events` endpoint as its primary feed, gap-fills any range past the ASP's last-synced block over RPC, and reads the `/event-snapshot/payload` view to reconcile note status (the spent, ragequit, and phantom-purge checks). It falls back to chunked log scans if the ASP returns a 404 or is unavailable.

## Caching

The ASP regenerates the snapshot server-side every few seconds. For a real-time UI, poll the snapshot every 5 to 10 seconds and watch the chain tip directly for the very latest events.
