Graine AI

List recent webhook deliveries

Inspect what we sent, when, and what your endpoint said.

Inspect what we sent, when, and what your endpoint said.

This is the record that answers "my customer never got a webhook". Two shapes of question, two modes:

  • With call_id you get EVERY row for that call — delivered, pending, failed and suppressed alike. This is the mode to use when a specific call is in dispute.
  • Without call_id you get the organisation's terminal FAILURES: failed (the four-attempt ladder was exhausted) and suppressed (no request was made at all, and suppressed_reason says why — not_subscribed, webhooks_disabled, no_callback_url or url_rejected, the last meaning the URL resolved into private address space at send time). Successful deliveries are not listed organisation-wide; ask for them per call.

Rows expire after 30 days. Only the callback HOST is shown, never the path or query string, because a callback URL routinely carries your own token. body_preview is the first 2000 characters of the body we sent and body_bytes is its true size.

At most 500 rows are searched per request, newest first; narrow with since or call_id rather than paging deeply.

Errors: 400 (bad event type, status or timestamp), 401, 403, 422, 429, 503.

Rate limit: 1000 requests per minute per organization (bucket default). Exceeding it returns 429 with Retry-After; the X-RateLimit-* response headers report your remaining allowance on every call.

GET
/v2/webhooks/deliveries
/v2/webhooks/deliveries?call_id=dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3&event_type=all_processing_completed&status=delivered&since=2026-08-26T00%3A00%3A00Z&page=1&page_size=20

The Authorization access token

Authorization

Authorization
Required
Bearer <token>

Your Graine API key. Create one in the dashboard under Developers, or via POST /v2/api-keys. Send it as Authorization: Bearer <key>.

In: header

Query Parameters

call_idCall Id

Every delivery row for one call, whatever its status.

event_typeEvent Type

Filter by event type. Valid event types: all_processing_completed, call_completed, call_corrected, call_ringing, call_started, client_analysis_completed, platform_analysis_completed, recording_completed. Omitting event_types, or sending an empty list, resolves to all_processing_completed — there is no value that means "every event".

statusStatus

pending | delivered | failed | suppressed.

sinceSince

Only rows created at or after this ISO-8601 timestamp. A timezone offset is required.

organization_idOrganization Id

Must match the organisation the API key belongs to.

pagePage

1-indexed page number (max 10000 — narrow the window instead)

Default: 1Minimum: 1Maximum: 10000

page_sizePage Size

Items per page (max 100)

Default: 20Minimum: 1Maximum: 100

Response Body

200

A page of delivery rows, newest first.

data
Required
Data

This page of delivery rows, newest first.

pagination
Required
Pagination

Where this page sits in the result set.

400

1000 — malformed input the schema could not reject: an unknown event type, a method other than POST/PUT, a reserved header name, or a callback_url pointing at a private, loopback or metadata address.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

401

1100 — missing, unknown or inactive API key. 1101 — a browser session token was presented instead of a gat_ key.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

403

1102 — the key is valid but lacks the scope this endpoint requires, or names another organisation. GET /v2/scopes reports which scopes the key holds.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

422

1001 — the body or query failed validation; the message names the first offending field.

error
Required
integer

Stable integer code from the error table. Branch on this, not on the message.

message
Required
string

One human-readable sentence. Wording may change; the code will not.

429

1300 — per-organisation rate limit exceeded. Carries Retry-After.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

503

1501 — the webhook subscription store is unreachable.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

504

1502 — an upstream did not respond in time.

error
Required
Error

Stable integer code from the /v2 error table. Branch on this.

message
Required
Message

One human-readable sentence. Wording may change; the code will not.

curl -X GET "https://api.graine.ai/v2/webhooks/deliveries?call_id=dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3&event_type=all_processing_completed&status=delivered&since=2026-08-26T00%3A00%3A00Z&organization_id=string&page=1&page_size=20" \
  -H "Authorization: Bearer <token>"

A page of delivery rows, newest first.

{
  "data": [
    {
      "delivery_id": "e5b3a1c9-4d72-4f80-b6a3-1c9e7d5f2b48",
      "event_id": "a7f4c1e2-9b3d-5e88-a0c6-3f7d2e9b4c15",
      "event_type": "all_processing_completed",
      "call_id": "dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3",
      "organization_id": "organization-live-EXAMPLE",
      "agent_id": "6c6f4cc3-f56c-479d-8422-7f76694daa29",
      "subscription_id": "b91d2f77-3ea5-4c58-9d10-6f8b4a2c7e31",
      "callback_host": "example.com",
      "method_type": "POST",
      "signed": true,
      "status": "delivered",
      "attempt_count": 1,
      "failure_reason": "http_error",
      "suppressed_reason": "not_subscribed",
      "delivered_at": "2026-08-26T12:25:02.526Z",
      "failed_at": "2026-08-26T12:25:14.902Z",
      "created_at": "2026-08-26T12:25:01.998Z",
      "attempts": [
        {
          "attempt": 1,
          "started_at": "2026-08-26T12:25:02.114Z",
          "duration_ms": 412,
          "http_status": 200,
          "error_class": "timeout",
          "error_message": "Read timed out after 10s.",
          "response_snippet": "{\"received\": true}"
        }
      ],
      "body_bytes": 4821,
      "body_preview": "{\"event_type\": \"all_processing_completed\", \"call_id\": \"dbcffa37-92a1-4ae7-9814-71ca7b8ab3d3\"}"
    }
  ],
  "pagination": {
    "page": 1,
    "page_size": 20,
    "total": 137,
    "total_pages": 7,
    "has_more": true
  }
}