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.
Route Metadata
| Field | Value |
|---|---|
| Method | GET |
| Path | /v1/webhooks/limits |
| operationId | getWebhookLimits |
| Tag | Webhooks - Catalog and Limits |
| Family | Webhooks |
| Deprecated or legacy | no |
Response Contracts
Status 200
Webhook plan limits and current usageapplication/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getWebhookLimits response 200",
"description": "API response containing webhook plan limits and current usage.",
"type": "object",
"properties": {
"data": {
"description": "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.",
"type": "object",
"required": [
"deliveries_per_day",
"endpoints",
"included",
"paused_subscriptions",
"plan",
"preview_included",
"subscriptions",
"watched_addresses"
],
"properties": {
"deliveries_per_day": {
"description": "Today's delivery budget. The budget resets on its own; a paused rule does not.",
"type": "object",
"required": [
"limit",
"remaining",
"resets_at",
"unlimited",
"used"
],
"properties": {
"limit": {
"description": "Deliveries a day the plan allows. Null when the plan has no ceiling.",
"type": "integer",
"format": "int64",
"nullable": true,
"example": 50000
},
"remaining": {
"description": "Deliveries left today, never below zero. Null when the plan has no ceiling.",
"type": "integer",
"format": "int64",
"nullable": true,
"example": 49588
},
"resets_at": {
"description": "When the budget resets.",
"type": "string",
"format": "date-time"
},
"resets_at_note": {
"description": "Present only while something is paused, to say that the reset time is the budget's and not the pause's.",
"type": "string"
},
"unlimited": {
"description": "True when the plan has no daily ceiling.",
"type": "boolean",
"example": false
},
"used": {
"description": "Deliveries today.",
"type": "integer",
"format": "int64",
"example": 412
}
}
},
"endpoints": {
"description": "One cap: what the plan allows, what is in use, and what is left.",
"type": "object",
"required": [
"limit",
"remaining",
"used"
],
"properties": {
"limit": {
"description": "What the plan allows. Zero on a plan without webhook delivery.",
"type": "integer",
"format": "int64",
"example": 4
},
"remaining": {
"description": "What is left, never below zero. A plan change can leave an account legitimately over a cap.",
"type": "integer",
"format": "int64",
"example": 3
},
"used": {
"description": "In use now.",
"type": "integer",
"format": "int64",
"example": 1
}
}
},
"included": {
"description": "Whether the plan has webhook delivery at all. False on Free, where every cap is zero.",
"type": "boolean",
"example": true
},
"notice": {
"description": "Why the caps are zero, and what to do about it. Present only on a plan without webhook delivery.",
"type": "string"
},
"paused_subscriptions": {
"description": "Paused rules on the account. Always present, so zero paused needs no special case.",
"type": "object",
"required": [
"count",
"reasons"
],
"properties": {
"count": {
"description": "How many rules are paused and delivering nothing.",
"type": "integer",
"format": "int64",
"example": 0
},
"earliest_paused_at": {
"description": "Start of the oldest pause still in force.",
"type": "string",
"format": "date-time",
"nullable": true
},
"message": {
"description": "What is paused and what clears it, in plain words. Present only when something is paused.",
"type": "string"
},
"reasons": {
"description": "Distinct causes across the paused rules: the account reached its daily delivery limit, or the plan does not include webhook delivery.",
"type": "array",
"items": {
"type": "string"
},
"example": []
}
}
},
"plan": {
"description": "The plan webhook decisions are priced at.",
"type": "string",
"example": "pro"
},
"plan_label": {
"description": "The plan's display name, or null for a plan this build cannot name.",
"type": "string",
"nullable": true,
"example": "Pro"
},
"preview_included": {
"description": "Whether the estimate and the dry-run are available. True on every plan, including Free.",
"type": "boolean",
"example": true
},
"subscriptions": {
"description": "One cap: what the plan allows, what is in use, and what is left.",
"type": "object",
"required": [
"limit",
"remaining",
"used"
],
"properties": {
"limit": {
"description": "What the plan allows. Zero on a plan without webhook delivery.",
"type": "integer",
"format": "int64",
"example": 4
},
"remaining": {
"description": "What is left, never below zero. A plan change can leave an account legitimately over a cap.",
"type": "integer",
"format": "int64",
"example": 3
},
"used": {
"description": "In use now.",
"type": "integer",
"format": "int64",
"example": 1
}
}
},
"watched_addresses": {
"description": "One cap: what the plan allows, what is in use, and what is left.",
"type": "object",
"required": [
"limit",
"remaining",
"used"
],
"properties": {
"limit": {
"description": "What the plan allows. Zero on a plan without webhook delivery.",
"type": "integer",
"format": "int64",
"example": 4
},
"remaining": {
"description": "What is left, never below zero. A plan change can leave an account legitimately over a cap.",
"type": "integer",
"format": "int64",
"example": 3
},
"used": {
"description": "In use now.",
"type": "integer",
"format": "int64",
"example": 1
}
}
}
}
},
"success": {
"type": "boolean",
"example": true
}
}
}
Status 401
Authentication requiredapplication/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getWebhookLimits response 401",
"description": "Error response",
"type": "object",
"properties": {
"code": {
"description": "HTTP status code",
"type": "integer"
},
"error": {
"description": "Error message",
"type": "string"
},
"error_code": {
"description": "Machine-readable error code. Common values: `invalid_query_params` (a query parameter failed to parse or validate) and `invalid_path_params` (a path parameter failed to parse). Other endpoint-specific codes exist; treat unknown codes as generic errors of the given HTTP status.",
"type": "string"
},
"request_id": {
"description": "Unique request ID for support",
"type": "string",
"format": "uuid"
}
}
}
OpenAPI example
{
"code": 401,
"error": "Missing or invalid API key. Provide X-API-Key header."
}
Status 429
Rate limit exceededapplication/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getWebhookLimits response 429",
"description": "Error response",
"type": "object",
"properties": {
"code": {
"description": "HTTP status code",
"type": "integer"
},
"error": {
"description": "Error message",
"type": "string"
},
"error_code": {
"description": "Machine-readable error code. Common values: `invalid_query_params` (a query parameter failed to parse or validate) and `invalid_path_params` (a path parameter failed to parse). Other endpoint-specific codes exist; treat unknown codes as generic errors of the given HTTP status.",
"type": "string"
},
"request_id": {
"description": "Unique request ID for support",
"type": "string",
"format": "uuid"
}
}
}
OpenAPI example
{
"code": 429,
"error": "Rate limit exceeded"
}