On this page
Kalshi
Kalshi is a CFTC-regulated US event exchange. Artery exposes its public data endpoints with no signing required. Trade endpoints (planned) require per-user RSA private-key upload.
Data model
Kalshi uses a three-tier hierarchy that Artery preserves verbatim:
Series (recurring template, e.g. "Monthly Jobs Report")
└─ Event (a single occurrence — 1..N markets)
└─ Market (a binary YES/NO contract)
Identifiers are hierarchical tickers: KXHIGHNY-26MAY05-T75.
Kalshi quotes Yes and No as two separate orderbooks that arbitrage to $1 (yes_bid_dollars + no_ask_dollars ≤ 1.00). Artery preserves both sides unchanged — collapsing to a single order book
is a Normalized responses concern.
Endpoints
| Artery | Upstream |
|---|---|
GET /v1/kalshi/events | /trade-api/v2/events |
GET /v1/kalshi/events/:ticker | /events/:ticker |
GET /v1/kalshi/markets | /markets |
GET /v1/kalshi/markets/:ticker | /markets/:ticker |
GET /v1/kalshi/markets/:ticker/orderbook | /markets/:ticker/orderbook |
GET /v1/kalshi/series | /series |
GET /v1/kalshi/series/{ticker} | /series/{ticker} |
GET /v1/kalshi/exchange/status | /exchange/status |
GET /v1/kalshi/exchange/schedule | /exchange/schedule |
Demo vs production
bashART_KALSHI_ENV=demo pnpm --filter @artery/api devRoutes Artery's Kalshi adapter to demo-api.kalshi.co/trade-api/v2
instead of the production api.elections.kalshi.com.
Streaming caveat
Kalshi's WebSocket gateway returns HTTP 401 on connect even for public channels (ticker,
trade, orderbook_delta) unless the handshake carries RSA-PSS signed headers. Confirmed via
real-upstream ws-smoke on 2026-05-08. This means Kalshi streaming is gated behind M3-4 RSA
private-key upload even when the data itself is public.
Authentication (planned)
Kalshi does not support OAuth. Trade endpoints require RSA-PSS signed requests using a private key the user generates in the Kalshi UI and uploads to Artery. The PEM is encrypted at rest with Cloud KMS envelope encryption (DEK + AES-256-GCM, KMS-wrapped DEK).
The signing payload is ${timestamp_ms}${METHOD}${path} (no query string).
See @artery/signing.buildKalshiPayload for the canonical helper.
Rate limits
Kalshi switched to a token-bucket rate limit system in April 2026. Each
request costs 10 tokens by default; some discounted endpoints cost 2.
Kalshi 429 responses do NOT include Retry-After — Artery's transport
layer applies exponential backoff client-side automatically.
Geographic restrictions
Kalshi serves 47+ US states + DC and 130+ countries; restricted in Canada, UK, France, Italy, Belgium, Poland, Russia, and OFAC-sanctioned jurisdictions. Artery passes through the upstream geo-restriction errors unchanged — your client should surface them to the user.