Skip to main content
GET
SSE stream of new messages on the conversation.

Authorizations

Authorization
string
header
required

Pass a user JWT or a oag_ User API Key on the Authorization: Bearer <token> header. Both are validated by openapi-gateway against the Auth service.

Both credential types are user-scoped: every key (and every JWT) is bound to exactly one owner, and every route grants the caller full access to that owner's own resources. Cross-tenant access is denied by owner-ACL inside the handlers — there is no per-route scope vocabulary on this API.

Removed in v1.1.0: the legacy agents:* / tasks:* / files:* / instances:* scope set has been dropped together with the 403 insufficient_scope error. Existing oag_ keys automatically gain full owner-level access and do not need to be re-issued. SDK calls that previously passed scopes to createAPIKey should drop the argument. See the changelog at the bottom of this spec for the full migration note.

Path Parameters

agentId
string
required
Maximum string length: 128
convId
string
required
Maximum string length: 128

Query Parameters

since
integer<int64>

Replay cursor. Matches the offset field on the last received event — clients persist this value and pass it back on reconnect to resume without gaps or duplicates (Last-Event-ID semantics; the wire spelling stays since for backward compatibility with the pre-v2 SSE clients).

Special values:

  • omitted / 0 — full history replay.
  • <offset> — resume strictly AFTER the given offset.

Unlike the task variant, this stream never auto-closes on a terminal envelope — conversations stay open across many turns and emit further agent_reply events. Persist since across reconnect ranges to avoid dropping turns during network blips.

Required range: x >= 0

Response

SSE stream of channel-message envelopes.

Server-Sent Events stream.

Per-event JSON payload format (v3 envelope fields body, state, stop_reason, updated_at are populated whenever the underlying row was written via the v3 path; legacy v1 / v2 rows leave them empty — consumers should fall back to payload.text

  • type to detect terminality):

Backfill truncation frame — emitted ONCE when the server caps the historical replay window (see since=<offset> semantics above). Field shape matches TaskSSEBackfillTruncated. Clients should resume from oldest_redis_offset after seeing this frame:

Terminal events:

end.reason enum:

Well-known message type values: