You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/apis/openapi.yaml
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1790,7 +1790,7 @@ components:
1790
1790
properties:
1791
1791
id:
1792
1792
type: string
1793
-
description: Optional. A unique identifier for the event. If not provided, a UUID will be generated.
1793
+
description: Optional. A unique identifier for the event. If not provided, a UUID will be generated. A stable id enables publish idempotency (see `duplicate` in the response) and is the value receivers should use to deduplicate webhook deliveries — by default sent as the `X-Outpost-Event-Id` header (prefix configurable).
The request body contains the event's `data` field as JSON. The `metadata` field is translated to headers using the configured prefix.
72
72
73
+
### Event ID header and idempotency
74
+
75
+
Webhook delivery is **at-least-once** (see [Event delivery & retries](/docs/outpost/features/event-delivery)). Your handler should deduplicate using the **event id** — the same stable `id` you set when [publishing](/docs/outpost/publishing/events) (Outpost may redeliver on retries).
76
+
77
+
In **default** mode, that id is sent as the system **`event-id`** metadata field. The HTTP header name is **`{header_prefix}{metadata-key}`** with **no extra separator** — the prefix and key are concatenated as-is. So the default prefix `x-outpost-` plus `event-id` yields **`X-Outpost-Event-Id`**; a prefix without a trailing separator (for example `x-acme`) would produce `x-acme` + `event-id` → **`X-Acmeevent-Id`** (Go canonicalizes the wire name). Include a trailing hyphen in the prefix when you want a conventional shape like **`X-Acme-Event-Id`**. Change the prefix with **`DESTINATIONS_WEBHOOK_HEADER_PREFIX`**, or omit this header with **`DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_EVENT_ID_HEADER`**.
78
+
79
+
In **Standard Webhooks** mode, the same value is sent as the **`webhook-id`** header (default prefix `webhook-`, so typically **`Webhook-Id`**) per the [Standard Webhooks](https://www.standardwebhooks.com/) specification.
Configure webhook operator behavior using these keys in the Config API or in [Hookdeck Destinations settings](https://dashboard.hookdeck.com/settings/project/destinations): `DESTINATIONS_WEBHOOK_HEADER_PREFIX`, `DESTINATIONS_WEBHOOK_DISABLE_EVENT_ID_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_TIMESTAMP_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_TOPIC_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_SIGNATURE_HEADER`, `DESTINATIONS_WEBHOOK_MODE`, `DESTINATIONS_WEBHOOK_SIGNATURE_ALGORITHM`, `DESTINATIONS_WEBHOOK_SIGNATURE_ENCODING`, `DESTINATIONS_WEBHOOK_SIGNATURE_CONTENT_TEMPLATE`, and `DESTINATIONS_WEBHOOK_SIGNATURE_HEADER_TEMPLATE`.
182
+
Configure webhook operator behavior using these keys in the Config API or in [Hookdeck Destinations settings](https://dashboard.hookdeck.com/settings/project/destinations): `DESTINATIONS_WEBHOOK_HEADER_PREFIX`, `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_EVENT_ID_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TIMESTAMP_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TOPIC_HEADER`, `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_SIGNATURE_HEADER`, `DESTINATIONS_WEBHOOK_MODE`, `DESTINATIONS_WEBHOOK_SIGNATURE_ALGORITHM`, `DESTINATIONS_WEBHOOK_SIGNATURE_ENCODING`, `DESTINATIONS_WEBHOOK_SIGNATURE_CONTENT_TEMPLATE`, and `DESTINATIONS_WEBHOOK_SIGNATURE_HEADER_TEMPLATE`.
175
183
{% /tab %}
176
184
{% tab label="Self-Hosted" %}
177
185
### Header Settings
178
186
179
187
| Variable | Default | Description |
180
188
|----------|---------|-------------|
181
-
| `DESTINATIONS_WEBHOOK_HEADER_PREFIX` | `x-outpost-` | Prefix for all webhook headers |
182
-
| `DESTINATIONS_WEBHOOK_DISABLE_EVENT_ID_HEADER` | `false` | Disable the event ID header |
183
-
| `DESTINATIONS_WEBHOOK_DISABLE_TIMESTAMP_HEADER` | `false` | Disable the timestamp header |
184
-
| `DESTINATIONS_WEBHOOK_DISABLE_TOPIC_HEADER` | `false` | Disable the topic header |
185
-
| `DESTINATIONS_WEBHOOK_DISABLE_SIGNATURE_HEADER` | `false` | Disable the signature header |
189
+
| `DESTINATIONS_WEBHOOK_HEADER_PREFIX` | `x-outpost-` / `webhook-` | Prefix for system webhook headers (event id, topic, timestamp, signature). Unless overridden, defaults to **`x-outpost-`** when `DESTINATIONS_WEBHOOK_MODE` is `default` and **`webhook-`** when `standard`. |
190
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_EVENT_ID_HEADER` | `false` | Disable the event ID header |
191
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TIMESTAMP_HEADER` | `false` | Disable the timestamp header |
192
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TOPIC_HEADER` | `false` | Disable the topic header |
193
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_SIGNATURE_HEADER` | `false` | Disable the signature header |
Copy file name to clipboardExpand all lines: docs/content/features/event-delivery.mdoc
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,7 @@ title: "Event Delivery & Retries"
3
3
description: "How Outpost delivers events, tracks attempts, and retries on failure."
4
4
---
5
5
6
-
Outpost tracks each event, its status, and all delivery attempts. Delivery operates on an **at-least-once guarantee** — events may occasionally be re-delivered. Consumers should use the unique event ID to deduplicate when needed.
6
+
Outpost tracks each event, its status, and all delivery attempts. Delivery operates on an **at-least-once guarantee** — events may occasionally be re-delivered. Consumers should deduplicate using the **event id** (the same value as publish `id` when you set one). For how that appears on webhook requests — headers, prefix, Standard Webhooks — see [Event ID header and idempotency](/docs/outpost/destinations/webhook#event-id-header-and-idempotency).
Copy file name to clipboardExpand all lines: docs/content/guides/migrate-to-outpost.mdoc
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -59,7 +59,7 @@ Webhooks are delivered via HTTP `POST` requests.
59
59
60
60
### Webhook Event HTTP Headers
61
61
62
-
- `x-outpost-event-id`: A unique identifier for the event within the Outpost installation
62
+
- `x-outpost-event-id`: The event id (same as publish `id` when you provide one). Use it as the **deduplication / idempotency key** for at-least-once delivery; the `x-outpost-` prefix is [configurable](/docs/outpost/destinations/webhook#operator-configuration).
63
63
- `x-outpost-signature`: HMAC of the raw body (default `v0=<hex>`; operators may customize templates — see [Webhook destination](/docs/outpost/destinations/webhook#signature)).
64
64
- `x-outpost-timestamp`: A Unix timestamp representing the time the event was generated
65
65
- `x-outpost-topic`: The topic of the event. For example, `user.created`.
Copy file name to clipboardExpand all lines: docs/content/publishing/events.mdoc
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -40,7 +40,7 @@ If you already publish events to a supported message queue, refer to the relevan
40
40
41
41
| Field | Required | Description |
42
42
|-------|----------|-------------|
43
-
| `id` | No | Unique event ID. If omitted, generated by hashing topic, data, and timestamp. Providing an ID enables idempotency. |
43
+
| `id` | No | Unique event ID. If omitted, Outpost assigns a server-generated id (UUID-style by default; configurable). Providing a stable ID enables **publish idempotency** (duplicate publishes are not re-queued while the key is remembered) and is the value receivers use to **deduplicate deliveries** — for webhooks, see [`X-Outpost-Event-Id` / header prefix](/docs/outpost/destinations/webhook#event-id-header-and-idempotency). |
44
44
| `tenant_id` | Yes | The tenant to deliver the event to. Must match an existing tenant. |
45
45
| `destination_id` | No | Force delivery to a specific destination, bypassing topic matching. |
46
46
| `topic` | No | The event topic. Must match one of the configured topics if set. Assumed to match all topics if omitted. |
Copy file name to clipboardExpand all lines: docs/content/quickstarts/hookdeck-outpost-curl.mdoc
+15-2Lines changed: 15 additions & 2 deletions
Original file line number
Diff line number
Diff line change
@@ -38,6 +38,8 @@ curl --request PUT "$OUTPOST_API_BASE_URL/tenants/$TENANT_ID" \
38
38
--header "Authorization: Bearer $OUTPOST_API_KEY"
39
39
```
40
40
41
+
A successful tenant upsert returns **HTTP 200** if that tenant id already existed, or **HTTP 201** if Outpost created it. In shell scripts, treat **200 and 201** as success (do not require exactly `200`—automation that deletes the tenant first will usually see **201**).
42
+
41
43
## Create a webhook destination
42
44
43
45
Subscribe the tenant to one or more topics you configured in the dashboard. Set `config.url` to an HTTPS endpoint you control.
@@ -59,6 +61,8 @@ curl --request POST "$OUTPOST_API_BASE_URL/tenants/$TENANT_ID/destinations" \
59
61
}'
60
62
```
61
63
64
+
On success, expect **HTTP 2xx** (often **201** the first time this destination is created for the tenant).
65
+
62
66
To receive every configured topic on this destination, set `"topics": ["*"]` instead.
63
67
64
68
## Publish a test event
@@ -86,9 +90,18 @@ A `202` response means the event was accepted for delivery.
86
90
87
91
## Shell scripts: status codes and portability
88
92
89
-
If you combine API response bodies with `curl --write-out '\n%{http_code}'`:
93
+
When a script must **fail on unexpected HTTP status**, capture the code with `curl -o … -w '%{http_code}'` (response body to a file or `/dev/null`). Example for **tenant upsert**—accept **200** or **201** only:
94
+
95
+
```sh
96
+
code="$(curl -sS -o /dev/null -w "%{http_code}" --request PUT "$OUTPOST_API_BASE_URL/tenants/$TENANT_ID" \
- **Publish** success is **HTTP 202** (not only 200/201). Treat **202** as success in conditional checks.
104
+
- **Publish** success is **HTTP 202** (not 200/201). Treat **202** as success in conditional checks.
92
105
- **Portability:** GNU `head -n -1` (“all lines but the last”) is **not** available on macOS BSD `head`. Prefer splitting with **`sed '$d'`** (body) and **`tail -n 1`** (status), or another POSIX-friendly approach, so the same script runs on Linux and macOS.
Copy file name to clipboardExpand all lines: docs/content/self-hosting/configuration.mdoc
+5-5Lines changed: 5 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -114,11 +114,11 @@ Choose one for event log persistence:
114
114
| Variable | Default | Description |
115
115
|----------|---------|-------------|
116
116
| `DESTINATIONS_WEBHOOK_MODE` | `default` | Set to `standard` for Standard Webhooks compliance |
117
-
| `DESTINATIONS_WEBHOOK_HEADER_PREFIX` | `x-outpost-` | Prefix for all webhook headers |
118
-
| `DESTINATIONS_WEBHOOK_DISABLE_EVENT_ID_HEADER` | `false` | Disable the event ID header |
119
-
| `DESTINATIONS_WEBHOOK_DISABLE_TIMESTAMP_HEADER` | `false` | Disable the timestamp header |
120
-
| `DESTINATIONS_WEBHOOK_DISABLE_TOPIC_HEADER` | `false` | Disable the topic header |
121
-
| `DESTINATIONS_WEBHOOK_DISABLE_SIGNATURE_HEADER` | `false` | Disable the signature header |
117
+
| `DESTINATIONS_WEBHOOK_HEADER_PREFIX` | `x-outpost-` / `webhook-` | Prefix for system webhook headers (event id, topic, timestamp, signature). Unless overridden, defaults to **`x-outpost-`** when `DESTINATIONS_WEBHOOK_MODE` is `default` and **`webhook-`** when `standard`. |
118
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_EVENT_ID_HEADER` | `false` | Disable the event ID header |
119
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TIMESTAMP_HEADER` | `false` | Disable the timestamp header |
120
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_TOPIC_HEADER` | `false` | Disable the topic header |
121
+
| `DESTINATIONS_WEBHOOK_DISABLE_DEFAULT_SIGNATURE_HEADER` | `false` | Disable the signature header |
0 commit comments