Webhook delivery health
Returns outbound webhook delivery metrics aggregated into fixed time
buckets across a window you specify, counting delivered, failed, and
retried attempts. Grouping by kind separates organization-level
endpoints from per-number delivery feeds.
Requires the metrics:read scope. The plan-tier granularity gate,
10,000-bucket cap, cursor pagination via meta.next_cursor, the
meta.as_of aggregation watermark, and Cache-Control: private, max-age=30 all behave the same as on getMetricsMessages.
Authenticate by sending your API key as a bearer token:
Authorization: Bearer am_live_.... Every request is automatically
scoped to the organization that owns the key and to the scopes granted
to that key.
In: header
Query Parameters
"delivered" | "failed" | "retried"date-timedate-time"minute" | "hour" | "day""endpoint_id" | "kind" | "http_status_class"10001 <= value <= 5000"prior_period"Response Body
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/metrics/webhooks?metric=delivered"{
"success": true,
"data": {
"metric": "messages.inbound.received",
"granularity": "hour",
"from": "2026-05-05T00:00:00Z",
"to": "2026-05-06T00:00:00Z",
"buckets": [
{
"bucket_start": "2026-05-05T00:00:00Z",
"value": 14
},
{
"bucket_start": "2026-05-05T01:00:00Z",
"value": 9
},
{
"bucket_start": "2026-05-06T00:00:00Z",
"value": null
}
]
},
"meta": {
"as_of": "2026-05-05T23:59:43Z",
"limit": 1000,
"next_cursor": null
}
}{
"success": false,
"error": {
"code": "UNAUTHORIZED",
"message": "authentication failed",
"request_id": "01JTBQH2FZ8K1RXC0WJ4Z9P3VM"
}
}{
"success": false,
"error": {
"code": "FORBIDDEN",
"message": "missing required scope",
"request_id": "01JTBQH2FZ8K1RXC0WJ4Z9P3VM"
}
}{
"success": false,
"error": {
"code": "GRANULARITY_NOT_AVAILABLE",
"message": "granularity not available at this plan tier",
"request_id": "01JTBQH2FZ8K1RXC0WJ4Z9P3VM",
"details": {
"max_granularity": "day"
}
}
}