Docs
POST /v2/stream/ticket

Get a WebSocket ticket

stream_createTicket

Exchanges your credential for a short-lived signed ticket that authenticates the first frame on GET /v2/ws. Mint a fresh ticket for every connection.

Request body

The contract does not describe a body schema for this operation; the notes on this page give its fields.

Details

Your entitlements are fixed into the ticket when it is minted. The free tier has no streaming and gets 403 not_entitled_tier.

Units

exp is the ticket's expiry in epoch seconds, 60 seconds after it was minted.

Limits

A ticket is valid for 60 seconds and authenticates one connection. Minting has no other per-operation limit.

Example

http
POST /v2/stream/ticket
json
{
  "data": {
    "ticket": "eyJ1aWQiOiJ1c2VyLTEyMyIsInRpZXIiOiJwcm8ifQ==",
    "exp": 1790493799
  },
  "meta": { "caps": { "tier": "pro", "applied": [] } }
}

Response

Prices are dollars, timestamps epoch milliseconds, strikes integer thousandths of a dollar; null means unknown. Units →

200application/json

{ticket, exp} in the standard envelope

object

A successful response: the payload consumers parse plus response metadata. data shapes are the platform types — never reshaped by the envelope.

data object required

POST /v2/stream/ticket response data.

exp integer · int64 required

Expiry, epoch seconds (iat + 60).

ticket string required

The base64(payload ‖ Ed25519 signature) ticket.

meta object required

Response metadata.

caps object nullable

meta.caps — the entitlement caps that shaped this response. applied lists the caps that actually changed it (for example range_clamped).

applied array<string> required

Which caps actually shaped this response (e.g. range_clamped). Empty = nothing was clamped.

darkpool boolean nullable

Whether this account can use Off-Exchange in the site.

flow boolean nullable

Whether the OPRA option-flow capability (flow) is granted to this principal in the app: site Pro plus a CBOE non-professional attestation (never on an itm_ key). Emitted explicitly — true and false — by the account endpoints, so the app reads the grant instead of inferring it from tier and attestation; absent on routes that do not report it.

gexDepth string nullable

GEX data depth when the route reports it. Camel-cased to match the browser capability bundle; absent on unrelated routes.

tier string required

The tier the request was served under.

cursor string nullable

Opaque continuation cursor (pass back as ?cursor=); absent when there is nothing more to read.

plane string nullable

Which serving tier answered the read (meta.plane). Informational provenance: treat it as an opaque label, because new values may appear.

Errors

Every error is the JSON error envelope; branch on error.code.

StatusMeaning
401

unauthenticated / token_expired

403

not_entitled_tier — no streaming entitlement (site free with no charts product)

503

internal — no signing key on this instance (verify-only node)