| project | Filter to one project; omitted = all. Project API keys see only their own |
{ "subscriptions": [ {
"name": "billing-worker", "stream": "orders", "project": "payments",
"paused": false,
"delivery": { "mode": "pull", "lease_seconds": 30, "max_in_flight_total": 500 },
"retry": { "max_attempts": 5, "strategy": "exponential_jitter",
"initial_backoff": "10s", "max_backoff": "1h" },
"dead_letter": { "enabled": true, "retain": "30d" },
"filter": null, "backlog": 12, "dead": 0,
"created_at": "2026-08-30T08:05:00.000Z"
} ] }| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "name": "billing-worker", "stream": "orders", "project": "payments",
"delivery": { "mode": "pull", "lease_seconds": 30, "max_in_flight_total": 500 },
"retry": { "max_attempts": 5, "strategy": "exponential_jitter",
"initial_backoff": "10s", "max_backoff": "1h" },
"dead_letter": { "enabled": true },
"limits": { "rate_per_second": 100, "rate_per_key_per_second": 5 },
"filter": { "headers": { "region": "in" } },
"from_beginning": true }| name / stream | Required. Bare names, scoped to the project |
| delivery.mode | "pull" (receive/ack) or "push" (webhook; then push.url is required) |
| push | { url, headers? } — the worker POSTs { delivery_id, attempt, message }; 2xx acks, anything else nacks |
| retry.strategy | fixed | exponential | exponential_jitter |
| filter.headers | Exact-match header filter; non-matching messages are skipped for this subscription |
| from_beginning | Default true: existing available messages are backfilled as pending deliveries |
{ "name": "billing-worker", "stream": "orders",
"project": "payments", "created": true }| 400 | missing name/stream, bad names, push mode without a valid http(s) push.url, non-positive limits |
| 409 | a subscription named {name} already exists in project {project} |
| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "name": "billing-worker", "project": "payments", "stream": "orders",
"paused": false, "delivery": { … }, "retry": { … },
"dead_letter": { … }, "created_at": "…" }| 404 | no subscription named {sub} in project {project} |
| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "retry": { "max_attempts": 8 },
"limits": { "rate_per_second": 50 } }| fields | Any of delivery, push, retry, dead_letter, limits, filter — merged onto the current values |
{ "name": "…", "updated": true, "subscription": { … } }| 400 | nothing to update, or invalid push/limits |
| 404 | no subscription named {sub} in project {project} |
| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "name": "…", "deleted": true, "deliveries_deleted": 240 }| 404 | no subscription named {sub} in project {project} |
| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "name": "payments/billing-worker", "paused": true }| 404 | no subscription named {sub} in project {project} |
| project | Project the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side. |
{ "to": 0, "key": "tenant_42" }
// or by time, across all keys:
{ "to": "2026-08-30T00:00:00Z" }| to | Offset (number) or ISO timestamp. Deliveries at/after it become pending again (rebuilt from the log if aged out); pending work before it is skipped |
| key | Limit the seek to one lane; other keys are untouched |
{ "subscription": "payments/billing-worker", "to": 0,
"key": "tenant_42", "replayed": 87, "skipped": 0 }| 400 | seek target must be an offset or a timestamp |
| 404 | no subscription named {sub} in project {project} |