GET/v1/webhook-endpoints
List webhook endpoints#
Lists the church's webhook endpoints with their health: status, consecutive failures and delivery counts over the last 30 days. An endpoint disabled after 20 failures in a row shows status disabled and a disabled_reason.
Auth. A church API key. Needs the webhooks:read scope, or a wildcard that includes it (machine:read, machine:*, * on a partner key). A partner key can call it for a customer church by sending X-Folio-Church.
Limits. Responses carry RateLimit-Limit and RateLimit-Remaining; a 429 carries Retry-After.
- Auth
- Church API key
- Scope
webhooks:read- Operation id
machineListWebhookEndpoints
Parameters
| Name | In | Description |
|---|---|---|
limit | query | Items per page. (integer) |
cursor | query | Opaque cursor from meta.next_cursor of the previous page. (string) |
X-Folio-Church | header | Partner keys only: run this call as one of your customer churches (its org_ id or slug). The church must be one of yours, the key must be allowed to act for it, and plan checks run against that church. (string, e.g. org_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012) |
Responses
200 Success. List webhook endpoints.
{
"status": true,
"message": "webhook_endpoints",
"data": [
{
"id": "whe_0192f7a8-3b1c-7d2e-9a40-5c6d7e8f9012",
"object": "webhook_endpoint",
"name": "Sunday pipeline",
"url": "https://hooks.example.org/folio",
"event_types": [
"teaching.ready",
"note.published"
],
"mode": "live",
"status": "active",
"api_version": "2026-12-01",
"child_scope": "none",
"church_ids": [],
"consecutive_failures": 0,
"last_success_at": "2026-11-01T12:31:04Z",
"last_failure_at": null,
"created_at": "2026-10-20T09:00:00Z",
"stats": {
"delivered": 42,
"failed": 1,
"pending": 0,
"window_days": 30,
"last_delivery_at": "2026-11-01T12:31:04Z"
}
}
],
"meta": {
"request_id": "req_b337770ecebe03b03a88a8998b59263d",
"has_next": false,
"has_prev": false
}
}400 The request could not be read.
{
"status": false,
"message": "the page cursor is not valid",
"error": {
"code": "invalid_argument",
"status": 400,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}401 The key or session is missing, invalid or expired.
{
"status": false,
"message": "That API key is not valid or has expired.",
"error": {
"code": "unauthenticated",
"status": 401,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}403 The credential lacks the scope, the church is suspended, the feature is not in the plan, or the address is not allowed.
{
"status": false,
"message": "That API key does not have the required scope.",
"error": {
"code": "permission_denied",
"status": 403,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}404 The resource is not in this church.
{
"status": false,
"message": "That item is not in this church.",
"error": {
"code": "not_found",
"status": 404,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}409 Conflict, including a duplicate Idempotency-Key still being processed.
{
"status": false,
"message": "A request with this Idempotency-Key is still running.",
"error": {
"code": "conflict",
"status": 409,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}422 A field failed validation, or an Idempotency-Key was reused with a different body.
{
"status": false,
"message": "A field is not valid.",
"error": {
"code": "validation",
"status": 422,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}429 Rate limited. Wait Retry-After seconds.
{
"status": false,
"message": "Too many requests. Wait before trying again.",
"error": {
"code": "rate_limited",
"status": 429,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}500 Something went wrong. Quote error.request_id.
{
"status": false,
"message": "Something went wrong. Quote the request id to support.",
"error": {
"code": "internal",
"status": 500,
"request_id": "req_b337770ecebe03b03a88a8998b59263d"
}
}Code samples
curl -X GET "$FOLIO_API_URL/v1/webhook-endpoints" \
-H "Authorization: Bearer $FOLIO_API_KEY"