BETA
Skip to content

Events

Every inbound POST to /in/:slug creates an event row with the raw body, headers, signature-validity flag, and the resolved event_type. Events drive fan-out, are queryable, and can be replayed.

Base URL: https://app.krafter.dev/api/v1

List events

GET /webhooks/sources/:source_id/events

Required scope: webhooks:read

Query parameters

ParameterTypeDefaultDescription
pageinteger11-indexed page number.
per_pageinteger25Page size, clamped to 1100.
event_typestringExact-match filter on the resolved event type.

Response — 200 OK

json
{
  "data": [
    {
      "id": "uuid",
      "source_id": "uuid",
      "event_type": "invoice.paid",
      "status": "succeeded",
      "signature_valid": true,
      "created_at": "2026-04-26T09:00:00Z"
    }
  ],
  "meta": { "page": 1, "per_page": 25, "total": 142 }
}

status is one of:

ValueMeaning
receivedStored, not yet fanned out (e.g. no destinations or sig invalid).
forwardingAt least one delivery in flight.
succeededEvery delivery to every matching destination succeeded.
failedAt least one delivery exhausted retries; others may have succeeded.

Get an event with deliveries

GET /webhooks/sources/:source_id/events/:event_id

Required scope: webhooks:read

Returns the event plus the per-destination delivery history.

json
{
  "data": {
    "id": "uuid",
    "source_id": "uuid",
    "event_type": "invoice.paid",
    "status": "succeeded",
    "signature_valid": true,
    "created_at": "2026-04-26T09:00:00Z",
    "deliveries": [
      {
        "id": "uuid",
        "destination_id": "uuid",
        "status": "success",
        "response_status": 200,
        "response_body": "ok",
        "attempt": 1,
        "delivered_at": "2026-04-26T09:00:01Z",
        "created_at": "2026-04-26T09:00:00Z"
      }
    ]
  }
}

response_body is truncated server-side to the first 1024 bytes.

Replay an event

POST /webhooks/sources/:source_id/events/:event_id/replay

Required scope: webhooks:write

Request body (optional)

FieldTypeDescription
destination_idsarray of stringsSubset of destination IDs to target. Omit to fan out to all matching enabled destinations.

Response — 202 Accepted

json
{
  "data": {
    "replayed_to": 2,
    "queued_destination_ids": ["uuid-1", "uuid-2"]
  }
}

replayed_to equals length(queued_destination_ids). The event's status flips to forwarding while the new attempts run. See the Replay guide for full semantics.

Outgoing aggregation

GET /webhooks/outgoing

Required scope: webhooks:read

Returns Krafter's own outgoing webhooks (currently Mail, Flags, Push) configured for the team — useful for an "all webhooks in one view" dashboard. This is read-only; manage individual webhooks in their service-specific APIs.

json
{
  "data": [
    { "id": "uuid", "url": "...", "enabled": true, "service": "mail",  "events": [...] },
    { "id": "uuid", "url": "...", "enabled": true, "service": "flags", "events": [...] },
    { "id": "uuid", "url": "...", "enabled": true, "service": "push",  "events": [...] }
  ]
}

Built by Krafter Studio