curl --request GET \
--url https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metricsconst options = {method: 'GET'};
fetch('https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics"
response = requests.get(url)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"total": "160",
"period": "day",
"data": [
{
"date": "2026-03-03",
"success": 22,
"failed": 0
},
{
"date": "2026-03-04",
"success": 19,
"failed": 1
},
{
"date": "2026-03-05",
"success": 25,
"failed": 0
},
{
"date": "2026-03-06",
"success": 18,
"failed": 0
},
{
"date": "2026-03-07",
"success": 27,
"failed": 2
},
{
"date": "2026-03-08",
"success": 21,
"failed": 0
},
{
"date": "2026-03-09",
"success": 24,
"failed": 1
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}Retrieve endpoint delivery metrics
Retrieve delivery success and failure counts for an endpoint over a time range. Requires the webhooks:read scope.
curl --request GET \
--url https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metricsconst options = {method: 'GET'};
fetch('https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics"
response = requests.get(url)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/webhooks/endpoints/{endpoint_id}/metrics"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"total": "160",
"period": "day",
"data": [
{
"date": "2026-03-03",
"success": 22,
"failed": 0
},
{
"date": "2026-03-04",
"success": 19,
"failed": 1
},
{
"date": "2026-03-05",
"success": 25,
"failed": 0
},
{
"date": "2026-03-06",
"success": 18,
"failed": 0
},
{
"date": "2026-03-07",
"success": 27,
"failed": 2
},
{
"date": "2026-03-08",
"success": 21,
"failed": 0
},
{
"date": "2026-03-09",
"success": 24,
"failed": 1
}
]
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}{
"detail": "Rate limit exceeded. Please retry after a few seconds.",
"error_code": "TOO_MANY_REQUESTS"
}Path Parameters
The webhook endpoint's ID.
Query Parameters
Grouping period, e.g. day.
Start of the range (ISO 8601).
End of the range (ISO 8601).
Response
Delivery metrics.
Delivery metrics for an endpoint over a time range.
The number of delivery attempts across the whole range, as a string. It equals the sum of success and failed over every entry in data, so use it to compute a success rate without re-adding the series.
"160"
How the series is bucketed. day: one entry per calendar day (the default, over the last 30 days when you send no dates). week: one entry per week. month: one entry per month. An unrecognised value falls back to day.
"day"
One entry per bucket in the range, in ascending time order. Buckets with no attempts are still returned with zero counts, so the series is safe to plot without filling gaps yourself.
Show child attributes
Show child attributes

