The mental model
A regional node runs the whole fast-lane order pipeline colocated with a specific venue, with no cross-region runtime dependency — it keeps trading even if the primary and every other node is unreachable. The central primary serves everything the nodes don’t: candles, the public trade tape, history, analytics, portfolio/PnL, market metadata, discovery, and search. Two nodes are live in production:Where to connect
This is where you submit orders and read authoritative live position state — the node’s HTTPS / WebSocket server.GET /health/deep exists but is an internal operator probe gated by a service token — it is not reachable with a partner credential. Use GET /health for reachability, or GET /v2/health for a partner-safe view of the external lane (provider list, Polygon RPC, idempotency and admission mode).
Authentication (both REST and WebSocket) is unchanged from the rest of the API: a Kairos JWT (Authorization: Bearer <kairos-jwt> for REST; on the WebSocket the JWT rides Sec-WebSocket-Protocol as authorization, Bearer_<base64url-no-pad(token)>), or a scoped API key issued at onboarding. Which credential you use is set at onboarding — confirm with Kairos.
Gotcha: a bearer token is not enough on the shared order routes.POST /ordersand the three cancel routes carry an extra gate that a bareAuthorization: Bearerheader does not satisfy. Sending the full API-key triple (X-Client-Id+X-Api-Key+X-Api-Secret) satisfies it automatically. The/v2/*external-signing routes andGET /positions/exposurehave no such gate.
Gotcha: there is no latency-based DNS — pin your node’s hostname. Each node’s hostname is a plain record pointing at that region’s load balancer, and your assignment is a fixed onboarding decision. Pin it in your config. To confirm which deployment you actually reached (and which venues it serves), call GET /v2/regions at startup:
role is cell on a regional executor and central on the primary; exchanges is the venue scope this deployment serves (empty means all), and external_execution reports whether the /v2 external-signing lane is mounted. This is a static identity read — unauthenticated, no latency measurement, no automatic routing. It tells you where you landed, so a misconfigured hostname surfaces as a mismatch instead of a silent cross-region hop.
Market data
Live orderbook depth for your venue is produced in-region. For partners consuming market data from outside the node’s network, Kairos offers a public WebSocket distribution endpoint:stream.kairos.trade, is confirm with Kairos. The shared public tier is read-only market data; it carries no order flow.
What is (and isn’t) served regionally
A node serves live orderbook market data and execution only. Everything historical, derived, or portfolio-related stays on the primary:
Rule of thumb: if it’s live orderbook or execution, use the node. If it’s candles, history, PnL, or the trade tape, use the primary — anything not in the node’s “regional” column requires a call to the central region, so fetch it out of band and keep the hot path on the node.
Live position exposure
Authorization: Bearer <kairos-jwt> or a scoped API key, with the position:read scope. No query parameters.
Example
Response
Gotcha: absence is not zero. A token missing from every bucket means the node has no current opinion on it — leave any previously-cached value as-is. Only presence in
closed_token_ids tells you to zero a cached position.Reading live positions — a critical caveat
When you execute on a regional node, the central positions read is asynchronous and is not the live source of truth right after a fill. Fills are recorded on the node first and synced centrally in the background. The central copy is the durable long-term record of what you hold, but it can be briefly stale right after a fill — more so cross-region than on the co-located primary. Do not poll the central positions endpoint from a remote region and treat it as live truth during active trading — you’ll act on a sync-lagged view and pay a needless cross-region round-trip. ReadGET /positions/exposure on the node for live state; reconcile against the central record for the durable copy once the sync has caught up.
Execute over WebSocket, not REST
Execute over the WebSocket (/ws), not REST. This is not a stylistic preference — the REST path is materially slower at detecting your fill.
- WebSocket (recommended) — fill detection is event-driven. A fill is recorded and pushed on the same socket as a
filled/partially_filled/status_changedframe, typically sub-second. The socket stays warm, so you also skip per-order HTTPS/TLS setup. (There is noorder_updateorfillframe type — see Signing & Order Lifecycle › Fills for the exact shapes.) - REST — submission works and returns the venue’s immediate status, but any fill not in the submit response (every queued/market order and all resting limit fills) is only caught on the next polling tick — a multi-second gap.
/orders as a fallback / control-plane path (cancels, one-off ops), not your steady-state execution or fill-detection path.
Colocation
The whole point of a regional node is venue proximity. You get the biggest win by colocating your infrastructure with the matching node.
Concretely: run your bot in the same region as your assigned node (in-region private-network access for colocated workloads is available on some accounts — confirm with Kairos); pin your execution socket to the region’s node (a London desk trading Polymarket connects to
eu-west-1-polymarket.executor.kairos.trade, not the central region); and consume market data in-region via the region’s stream endpoint.
Why this is fast
Building the order and verifying your signature is single-digit milliseconds of Kairos compute — most of the wall-clock is the unavoidable venue network hop, which is identical regardless of how the order was signed. Signing locally with your own key removes the ~50–100 ms round-trip a managed signature would add. The larger lever is fill detection: an event-driven WebSocket (sub-second) versus REST polling (multi-second). Colocating your infrastructure in the same region as your assigned node collapses the remaining submit and market-data round-trips to sub-region.Slow paths to avoid
In one line: a London desk trading Polymarket should execute on the Ireland node over WebSocket and read positions from that node — not call the central region for orders, fills, or positions when a regional path exists.
See also
- Overview — access and the self-custody model.
- Signing & Order Lifecycle — the intent → sign → submit flow and the WebSocket one-round-trip path.
- API Reference — full schema for
GET /positions/exposureand the order endpoints. - WebSocket › Order Execution — the general execution WebSocket surface.

