---
title: "WebSocket event stream"
method: GET
path: "/v1/stream/ws"
---

# WebSocket event stream

`GET /v1/stream/ws`

## Request

- Base URL: `https://api.turos.app`
- URL: `https://api.turos.app/v1/stream/ws`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

Upgrades an active stream subscription to a WebSocket connection. Supply that subscription's `stream_id` and authenticate with either a short-lived signed `ticket` from `POST /v1/stream/tickets` or the `x-api-key` header. Concurrent connections are capped by plan and are not separately billable; delivered events are billed in the same delivery-event family as stream polling and are idempotent per subscription and event.

## Query parameters

- `stream_id` string, required
- `ticket` string
- `cursor` string

## Headers

- `x-api-key` string

## Response `default`

Contract-aware error response

- Error
  - `object` 'error', required
  - `id` string, required
  - `code` string, required
  - `type` string, required
  - `message` string, required
  - `requestId` string, required
  - `traceparent` string
  - `hint` string
  - `docsUrl` string, uri
  - `details` object, required

## Other responses

- `101`: WebSocket upgrade successful. Server sends JSON frames such as connected, filing.published, pong, filters_updated, and rate_limited.
- `401`: Missing or invalid stream ticket or API key
- `429`: Per-organization connection limit exceeded
- `503`: Global connection capacity exceeded

---

[API](https://skmtc.dev/turos/apis/turos-api.md) · [All operations](https://skmtc.dev/turos/apis/turos-api/llms.txt) · [OpenAPI document](https://skmtc.dev/turos/apis/turos-api/revisions/a68d3ec80a56?raw)
