AArtery
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.

Note

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

ArteryUpstream
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 dev

Routes Artery's Kalshi adapter to demo-api.kalshi.co/trade-api/v2 instead of the production api.elections.kalshi.com.

Streaming caveat

Warning

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)

Warning

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.

Edit this page on GitHubLast updated
Kalshi · Artery API Docs