API reference / Subscriptions

Subscriptions scope: manage · reads: read

Declare retry policy, rate limits, filters, and push delivery on the subscription — no retry or DLQ code in consumers.
Retry policy, rate limits, filters, and push delivery are declared here — no retry or DLQ code in your consumer.
GET/v1/subscriptionsList with backlog and dead counts
Query parameters
projectFilter to one project; omitted = all. Project API keys see only their own
Response · 200
{ "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"
} ] }
POST/v1/subscriptionsCreate a subscription on a stream in the same project
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Request body
{ "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 / streamRequired. 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.strategyfixed | exponential | exponential_jitter
filter.headersExact-match header filter; non-matching messages are skipped for this subscription
from_beginningDefault true: existing available messages are backfilled as pending deliveries
Response · 200
{ "name": "billing-worker", "stream": "orders",
  "project": "payments", "created": true }
Errors
400missing name/stream, bad names, push mode without a valid http(s) push.url, non-positive limits
409a subscription named {name} already exists in project {project}
GET/v1/subscriptions/{sub}Full configuration and state
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Response · 200
{ "name": "billing-worker", "project": "payments", "stream": "orders",
  "paused": false, "delivery": { … }, "retry": { … },
  "dead_letter": { … }, "created_at": "…" }
Errors
404no subscription named {sub} in project {project}
PATCH/v1/subscriptions/{sub}Update policy fields
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Request body
{ "retry": { "max_attempts": 8 },
  "limits": { "rate_per_second": 50 } }
fieldsAny of delivery, push, retry, dead_letter, limits, filter — merged onto the current values
Response · 200
{ "name": "…", "updated": true, "subscription": { … } }
Errors
400nothing to update, or invalid push/limits
404no subscription named {sub} in project {project}
DELETE/v1/subscriptions/{sub}Drop its position and delivery state (incl. its DLQ); the stream keeps its messages
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Response · 200
{ "name": "…", "deleted": true, "deliveries_deleted": 240 }
Errors
404no subscription named {sub} in project {project}
POST/v1/subscriptions/{sub}/pauseStop delivery — in-flight leases drain naturally (resume: same shape)
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Response · 200
{ "name": "payments/billing-worker", "paused": true }
Errors
404no subscription named {sub} in project {project}
POST/v1/subscriptions/{sub}/seekReplay / skip ahead — per key or whole subscription
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Request body
{ "to": 0, "key": "tenant_42" }
// or by time, across all keys:
{ "to": "2026-08-30T00:00:00Z" }
toOffset (number) or ISO timestamp. Deliveries at/after it become pending again (rebuilt from the log if aged out); pending work before it is skipped
keyLimit the seek to one lane; other keys are untouched
Response · 200
{ "subscription": "payments/billing-worker", "to": 0,
  "key": "tenant_42", "replayed": 87, "skipped": 0 }
Errors
400seek target must be an offset or a timestamp
404no subscription named {sub} in project {project}
ConsumeAll topicsFailed messages (DLQ)