Appearance
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/eventsRequired scope: webhooks:read
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | 1-indexed page number. |
per_page | integer | 25 | Page size, clamped to 1–100. |
event_type | string | — | Exact-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:
| Value | Meaning |
|---|---|
received | Stored, not yet fanned out (e.g. no destinations or sig invalid). |
forwarding | At least one delivery in flight. |
succeeded | Every delivery to every matching destination succeeded. |
failed | At least one delivery exhausted retries; others may have succeeded. |
Get an event with deliveries
GET /webhooks/sources/:source_id/events/:event_idRequired 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/replayRequired scope: webhooks:write
Request body (optional)
| Field | Type | Description |
|---|---|---|
destination_ids | array of strings | Subset 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/outgoingRequired 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": [...] }
]
}