API reference / Streams

Streams scope: manage · reads: read

Create, configure, browse, and delete streams — named durable logs with per-stream retention and backlog caps.
A stream is a named, durable log inside a project. Explicit creation is optional — the first publish creates it — but lets you set retention and a backlog cap up front.
GET/v1/streamsList streams
Query parameters
projectFilter to one project. Omitted = all projects (dashboard view). Project API keys always see only their own.
Response · 200
{ "streams": [ {
  "name": "orders", "project": "payments",
  "messages": 1204, "active_keys": 3, "scheduled": 2,
  "subscriptions": ["billing-worker", "notifier"],
  "created_at": "2026-08-30T08:00:00.000Z"
} ] }
POST/v1/streamsCreate a stream explicitly
Request body
{ "name": "orders", "project": "payments",
  "retention": "30d", "max_backlog": 50000 }
nameRequired. Letters, digits, dot, dash, underscore. Unique per project, not globally
projectOptional; also accepted as ?project=. Default "default"
retentionOptional duration ("7d", "12h") or "forever". Default: DEFAULT_RETENTION (7d)
max_backlogOptional backpressure cap: publishes 429 once undelivered backlog crosses it
Response · 200
{ "name": "orders", "project": "payments", "created": true }
Errors
400missing/invalid name, retention, or max_backlog
404no project named {project}
409a stream named {name} already exists in project {project}
GET/v1/streams/{stream}Settings + message count
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Response · 200
{ "name": "orders", "project": "payments", "messages": 1204,
  "retention": "30d", "effective_retention_ms": 2592000000,
  "max_backlog": 50000, "effective_max_backlog": 50000,
  "created_at": "2026-08-30T08:00:00.000Z" }
Errors
404no stream named {stream} in project {project}
PATCH/v1/streams/{stream}Change retention / backlog cap
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Request body
{ "retention": "forever", "max_backlog": null }
retentionDuration or "forever"
max_backlogPositive integer; null or 0 clears the cap
Response · 200
{ "name": "orders", "project": "payments",
  "retention": "forever", "max_backlog": null }
Errors
400nothing to update, or invalid values
404no stream named {stream} in project {project}
DELETE/v1/streams/{stream}Delete the stream and its messages permanently
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
Response · 200
{ "name": "orders", "project": "payments",
  "deleted": true, "messages_deleted": 1204 }
Errors
404no stream named {stream} in project {project}
409delete this stream's subscriptions first: …
GET/v1/streams/{stream}/messagesBrowse messages, newest first
Query parameters
projectProject the name is scoped to. Omitted = "default". Ignored for project API keys — their project is enforced server-side.
keyOnly this key
statusscheduled | available | cancelled | expired
qPayload contains this substring
limitMax rows (default 100, cap 500)
before_offsetPage backwards from this offset
Response · 200
{ "messages": [ {
    "id": "msg_1m1b9kb5qvvcqn0tc334f",
    "stream": "orders", "project": "payments",
    "key": "tenant_42",
    "payload": { "order_id": 8891 },
    "headers": { "region": "in" },
    "idempotency_key": "order-8891-created",
    "deliver_at": null, "expires_at": null,
    "published_at": "2026-08-31T10:15:00.000Z",
    "offset": 41, "status": "available"
  } ] }
All topicsPublish