---
title: "Get webhook plan limits and usage"
method: GET
path: "/v1/webhooks/limits"
tags: ["Webhooks - Catalog and Limits"]
---

# Get webhook plan limits and usage

`GET /v1/webhooks/limits`

## Request

- Base URL: `https://api.0xarchive.io`
- URL: `https://api.0xarchive.io/v1/webhooks/limits`
- Auth: API key in header `X-API-Key`

What this plan allows for webhooks and what is currently in use: endpoints, subscriptions, watched wallets, today's delivery budget and how many subscriptions are paused. Free has no webhook delivery, so `included` is false and every cap is zero. Build allows 1 endpoint, 8 subscriptions, 2 watched wallets and 5,000 deliveries a day; Pro allows 4, 40, 15 and 50,000; Scale allows 12, 200, 50 and 500,000; Enterprise allows 100, 2,000, 250 and deliveries without a daily ceiling. The estimate and the dry-run stay available on every plan, so `preview_included` is always true. The delivery budget resets on its own and a paused subscription does not, which is why the paused count is reported here next to it. Authenticate with an API key or a signed-in dashboard session. Costs no credits.

## Response `200`

Webhook plan limits and current usage

- ApiResponseWebhookLimits: API response containing webhook plan limits and current usage.
  - `success` boolean, required
  - `data` WebhookLimits, required: What this plan allows and what is in use, in one call. Every number is read from the same place the caps are enforced from, so a refusal and this report cannot disagree.
    - `plan` string, required: The plan webhook decisions are priced at.
    - `plan_label` string, nullable: The plan's display name, or null for a plan this build cannot name.
    - `included` boolean, required: Whether the plan has webhook delivery at all. False on Free, where every cap is zero.
    - `preview_included` boolean, required: Whether the estimate and the dry-run are available. True on every plan, including Free.
    - `endpoints` WebhookLimitUsage, required: One cap: what the plan allows, what is in use, and what is left.
      - `used` integer, required: In use now.
      - `limit` integer, required: What the plan allows. Zero on a plan without webhook delivery.
      - `remaining` integer, required: What is left, never below zero. A plan change can leave an account legitimately over a cap.
    - `subscriptions` WebhookLimitUsage, required: One cap: what the plan allows, what is in use, and what is left.
      - `used` integer, required: In use now.
      - `limit` integer, required: What the plan allows. Zero on a plan without webhook delivery.
      - `remaining` integer, required: What is left, never below zero. A plan change can leave an account legitimately over a cap.
    - `watched_addresses` WebhookLimitUsage, required: One cap: what the plan allows, what is in use, and what is left.
      - `used` integer, required: In use now.
      - `limit` integer, required: What the plan allows. Zero on a plan without webhook delivery.
      - `remaining` integer, required: What is left, never below zero. A plan change can leave an account legitimately over a cap.
    - `deliveries_per_day` WebhookDeliveryBudget, required: Today's delivery budget. The budget resets on its own; a paused rule does not.
      - `used` integer, required: Deliveries today.
      - `limit` integer, nullable, required: Deliveries a day the plan allows. Null when the plan has no ceiling.
      - `remaining` integer, nullable, required: Deliveries left today, never below zero. Null when the plan has no ceiling.
      - `unlimited` boolean, required: True when the plan has no daily ceiling.
      - `resets_at` string, date-time, required: When the budget resets.
      - `resets_at_note` string: Present only while something is paused, to say that the reset time is the budget's and not the pause's.
    - `paused_subscriptions` WebhookPausedSubscriptions, required: Paused rules on the account. Always present, so zero paused needs no special case.
      - `count` integer, required: How many rules are paused and delivering nothing.
      - `earliest_paused_at` string, date-time, nullable: Start of the oldest pause still in force.
      - `reasons` string[], required: Distinct causes across the paused rules: the account reached its daily delivery limit, or the plan does not include webhook delivery.
      - `message` string: What is paused and what clears it, in plain words. Present only when something is paused.
    - `notice` string: Why the caps are zero, and what to do about it. Present only on a plan without webhook delivery.
  - `meta` ResponseMeta, required: Response metadata. Every 2xx JSON response carries `meta.request_id`; list payloads add `count`; cursor-paged routes add `has_more` and, when another page follows, `next_cursor`; per-symbol routes add `symbol` and `venue`. Fields that do not apply to a route are omitted.
    - `count` integer: Number of records returned
    - `has_more` boolean: Cursor-paged routes: whether another page follows. `next_cursor` is present exactly when this is `true`. A final page can be empty when the previous page was exactly full; `has_more` is `false` on it.
    - `next_cursor` string: Opaque cursor for the next page, present exactly when `has_more` is `true`. Pass it back unchanged as `cursor` with the same filters. Do not parse or construct it.
    - `request_id` string, uuid, required: Unique request ID for support
    - `symbol` string: Per-symbol routes: the canonical public symbol the response describes (for example `BTC`, `xyz:TSLA`, `HYPE-USDC`, `#0`).
    - `venue` 'hyperliquid' | 'hip3' | 'hip4' | 'spot' | 'lighter' | 'rh-lighter': Per-symbol routes: the venue the response describes.
    - `coverage_from` string, date-time: Earliest coverage for the requested symbol and data type. Present only when the requested window ends before coverage begins.
    - `notice` string: Human-readable advisory about the response. Used when the requested window ends before coverage begins for the symbol, and on CVD responses that are one page of several; may carry other advisories in future.
    - `finalized_through` string, date-time: Two-tier datasets (Lighter trades): data at or before this instant is final; later data is preliminary.
    - `requested_end` string, date-time, nullable: The `end` the request asked for, echoed when it was clamped to `finalized_through`.
    - `clamped_to` string, date-time, nullable: The boundary the request's `end` was clamped to, when clamping occurred.
    - `preliminary_row_count` integer, nullable: Number of preliminary rows in this response, on routes that intentionally serve preliminary data (Lighter `/recent`).

## Other responses

- `401`: Authentication required: the API key is missing or invalid.
- `429`: Rate limit, concurrency limit or monthly credits exceeded. See `error_code`.
- `default`: Any other error. The body is an `ErrorResponse`; branch on `error_code`. A 503 (`upstream_unavailable`) carries `Retry-After`.

---

[API](https://skmtc.dev/0xarchive/apis/0xarchive-api-2.md) · [All operations](https://skmtc.dev/0xarchive/apis/0xarchive-api-2/llms.txt) · [OpenAPI document](https://skmtc.dev/0xarchive/apis/0xarchive-api-2/revisions/27076f55595f?raw)
