kalshi

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Kalshi API

Kalshi API

Kalshi is a CFTC-regulated prediction market exchange where users trade on the outcomes of real-world events.
Check this skill and the official documentation FREQUENTLY. The canonical machine-readable index of all docs lives at:
Always consult
llms.txt
to discover every available page before building. It is the single source of truth for endpoint references, SDK docs, WebSocket channels, FIX protocol details, and getting-started guides.

Kalshi是受美国商品期货交易委员会(CFTC)监管的预测市场交易所,用户可针对现实世界事件的结果进行交易。
频繁查阅本技能和官方文档。所有文档的标准机器可读索引位于:
在开发前,请务必查阅
llms.txt
以了解所有可用页面。它是端点参考、SDK文档、WebSocket通道、FIX协议细节以及入门指南的唯一可信来源。

Key Concepts (Glossary)

核心概念(术语表)

TermDefinition
MarketA single binary outcome contract (Yes / No) with prices in cents (1–99¢).
EventA collection of related markets representing a real-world occurrence (e.g., an election, a weather reading).
SeriesA template for recurring events that share the same structure and rules (e.g., "Daily Highest Temp in NYC").
OrderbookBids only — in binary markets a YES bid at X¢ is equivalent to a NO ask at (100−X)¢.
FillA matched trade on one of your orders.
SettlementThe final resolution of a market (Yes or No) after determination.
Multivariate EventA combo event created dynamically from a multivariate event collection.

术语定义
Market(市场)单个二元结果合约(是/否),价格以美分计价(1-99美分)。
Event(事件)一组相关市场的集合,代表某一现实世界事件(例如选举、天气读数)。
Series(系列)具有相同结构和规则的重复事件模板(例如“纽约每日最高气温”)。
Orderbook(订单簿)仅包含买单——在二元市场中,X美分的YES买单等价于(100−X)美分的NO卖单。
Fill(成交)您的某笔订单达成的匹配交易。
Settlement(结算)市场在结果确定后的最终决议(是或否)。
Multivariate Event(多元事件)从多元事件集合中动态创建的组合事件。

Base URLs

基础URL

EnvironmentREST APIWebSocket
Production
https://api.elections.kalshi.com/trade-api/v2
wss://api.elections.kalshi.com/trade-api/ws/v2
Demo
https://demo-api.kalshi.co/trade-api/v2
wss://demo-api.kalshi.co/trade-api/ws/v2
Note: Despite the
elections
subdomain, the production URL serves ALL Kalshi markets — economics, weather, tech, entertainment, etc.

环境REST APIWebSocket
生产环境
https://api.elections.kalshi.com/trade-api/v2
wss://api.elections.kalshi.com/trade-api/ws/v2
演示环境
https://demo-api.kalshi.co/trade-api/v2
wss://demo-api.kalshi.co/trade-api/ws/v2
注意: 尽管域名包含
elections
,生产环境URL仍适用于所有Kalshi市场——包括经济、天气、科技、娱乐等领域。

Documentation & References

文档与参考

Authentication

认证

Kalshi uses RSA-PSS signed requests (not Bearer tokens). Every authenticated request requires three headers:
HeaderValue
KALSHI-ACCESS-KEY
Your API Key ID
KALSHI-ACCESS-TIMESTAMP
Current Unix timestamp in milliseconds
KALSHI-ACCESS-SIGNATURE
Base64-encoded RSA-PSS signature of
{timestamp}{METHOD}{path}
Important: When signing, use the path without query parameters. For example, sign
/trade-api/v2/portfolio/orders
even if the request URL is
/trade-api/v2/portfolio/orders?limit=5
.
Kalshi使用RSA-PSS签名请求(而非Bearer令牌)。每笔认证请求都需要三个请求头:
请求头
KALSHI-ACCESS-KEY
您的API密钥ID
KALSHI-ACCESS-TIMESTAMP
当前Unix时间戳(毫秒
KALSHI-ACCESS-SIGNATURE
{timestamp}{METHOD}{path}
的Base64编码RSA-PSS签名
重要提示: 签名时,请使用不含查询参数的路径。例如,即使请求URL是
/trade-api/v2/portfolio/orders?limit=5
,也要对
/trade-api/v2/portfolio/orders
进行签名。

Generating API Keys

生成API密钥

  1. Log in → Account Settings → API Keys section.
  2. Click "Create New API Key" to generate an RSA key pair.
  3. Store the private key immediately — it cannot be retrieved again.
  1. 登录 → 账户设置 → API密钥部分。
  2. 点击“Create New API Key”生成RSA密钥对。
  3. 立即存储私钥——私钥无法再次找回。

Python Signing Example

Python签名示例

python
import base64, datetime, requests
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding

def load_private_key(file_path):
    with open(file_path, "rb") as f:
        return serialization.load_pem_private_key(f.read(), password=None)

def sign_pss(private_key, text: str) -> str:
    sig = private_key.sign(
        text.encode("utf-8"),
        padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.DIGEST_LENGTH),
        hashes.SHA256(),
    )
    return base64.b64encode(sig).decode("utf-8")

def kalshi_headers(key_id, private_key, method, path):
    ts = str(int(datetime.datetime.now().timestamp() * 1000))
    path_no_qs = path.split("?")[0]
    sig = sign_pss(private_key, ts + method + path_no_qs)
    return {
        "KALSHI-ACCESS-KEY": key_id,
        "KALSHI-ACCESS-SIGNATURE": sig,
        "KALSHI-ACCESS-TIMESTAMP": ts,
    }
python
import base64, datetime, requests
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding

def load_private_key(file_path):
    with open(file_path, "rb") as f:
        return serialization.load_pem_private_key(f.read(), password=None)

def sign_pss(private_key, text: str) -> str:
    sig = private_key.sign(
        text.encode("utf-8"),
        padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.DIGEST_LENGTH),
        hashes.SHA256(),
    )
    return base64.b64encode(sig).decode("utf-8")

def kalshi_headers(key_id, private_key, method, path):
    ts = str(int(datetime.datetime.now().timestamp() * 1000))
    path_no_qs = path.split("?")[0]
    sig = sign_pss(private_key, ts + method + path_no_qs)
    return {
        "KALSHI-ACCESS-KEY": key_id,
        "KALSHI-ACCESS-SIGNATURE": sig,
        "KALSHI-ACCESS-TIMESTAMP": ts,
    }

JavaScript Signing Example

JavaScript签名示例

javascript
const crypto = require("crypto");
const fs = require("fs");

function signPss(privateKeyPem, text) {
  const sign = crypto.createSign("RSA-SHA256");
  sign.update(text);
  sign.end();
  return sign.sign({
    key: privateKeyPem,
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
    saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST,
  }).toString("base64");
}

function kalshiHeaders(keyId, privateKeyPem, method, path) {
  const ts = Date.now().toString();
  const pathNoQs = path.split("?")[0];
  const sig = signPss(privateKeyPem, ts + method + pathNoQs);
  return {
    "KALSHI-ACCESS-KEY": keyId,
    "KALSHI-ACCESS-SIGNATURE": sig,
    "KALSHI-ACCESS-TIMESTAMP": ts,
  };
}

javascript
const crypto = require("crypto");
const fs = require("fs");

function signPss(privateKeyPem, text) {
  const sign = crypto.createSign("RSA-SHA256");
  sign.update(text);
  sign.end();
  return sign.sign({
    key: privateKeyPem,
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING,
    saltLength: crypto.constants.RSA_PSS_SALTLEN_DIGEST,
  }).toString("base64");
}

function kalshiHeaders(keyId, privateKeyPem, method, path) {
  const ts = Date.now().toString();
  const pathNoQs = path.split("?")[0];
  const sig = signPss(privateKeyPem, ts + method + pathNoQs);
  return {
    "KALSHI-ACCESS-KEY": keyId,
    "KALSHI-ACCESS-SIGNATURE": sig,
    "KALSHI-ACCESS-TIMESTAMP": ts,
  };
}

SDKs

SDK

Kalshi provides official SDKs. Prefer these for production integrations:
SDKInstallDocs
Python (sync)
pip install kalshi_python_sync
https://docs.kalshi.com/sdks/python/quickstart.md
Python (async)
pip install kalshi_python_async
https://docs.kalshi.com/sdks/python/quickstart.md
TypeScript
npm install kalshi-typescript
https://docs.kalshi.com/sdks/typescript/quickstart.md
The old
kalshi-python
package is deprecated. Migrate to
kalshi_python_sync
or
kalshi_python_async
.
For production applications, consider generating your own client from the OpenAPI spec.

Kalshi提供官方SDK。生产环境集成建议优先使用SDK:
SDK安装方式文档
Python(同步)
pip install kalshi_python_sync
https://docs.kalshi.com/sdks/python/quickstart.md
Python(异步)
pip install kalshi_python_async
https://docs.kalshi.com/sdks/python/quickstart.md
TypeScript
npm install kalshi-typescript
https://docs.kalshi.com/sdks/typescript/quickstart.md
旧版
kalshi-python
包已弃用。请迁移至
kalshi_python_sync
kalshi_python_async
对于生产应用,可考虑从OpenAPI规范生成自定义客户端。

Rate Limits

速率限制

TierReadWrite
Basic20/s10/s
Advanced30/s30/s
Premier100/s100/s
Prime400/s400/s
Write-limited endpoints:
CreateOrder
,
CancelOrder
,
AmendOrder
,
DecreaseOrder
,
BatchCreateOrders
,
BatchCancelOrders
. In batch APIs each item counts as 1 transaction (except
BatchCancelOrders
where each cancel = 0.2 transactions).

等级读取写入
基础版20次/秒10次/秒
进阶版30次/秒30次/秒
高级版100次/秒100次/秒
旗舰版400次/秒400次/秒
受写入限制的端点:
CreateOrder
,
CancelOrder
,
AmendOrder
,
DecreaseOrder
,
BatchCreateOrders
,
BatchCancelOrders
。在批量API中,每个条目计为1次交易(
BatchCancelOrders
除外,每笔取消计为0.2次交易)。

Pagination

分页

The API uses cursor-based pagination. Responses include a
cursor
field; pass it as
?cursor={value}
on the next request. An empty/null cursor means no more pages. Default page size is 100 (max typically 1000).

API使用基于游标(cursor)的分页。响应中包含
cursor
字段;在下一次请求中,将其作为
?cursor={value}
参数传递。空值或null游标表示没有更多页面。默认页面大小为100(最大值通常为1000)。

REST API Endpoints Overview

REST API端点概览

Below is a summary organized by domain. For full request/response schemas, see the linked docs or browse https://docs.kalshi.com/llms.txt.
以下是按领域分类的摘要。如需完整的请求/响应模式,请查阅链接文档或浏览https://docs.kalshi.com/llms.txt

Markets

市场

EndpointMethodAuthDescription
/markets
GETNoList markets with filters (status, series, timestamps). Docs: Get Markets
/markets/{ticker}
GETNoGet a single market by ticker. Docs: Get Market
/markets/{ticker}/orderbook
GETNoGet current orderbook (yes bids + no bids). Docs: Get Market Orderbook
/markets/{ticker}/candlesticks
GETNoCandlestick data (1m, 1h, 1d). Docs: Get Market Candlesticks
/markets/candlesticks
POSTNoBatch candlesticks for up to 100 tickers. Docs: Batch Get Market Candlesticks
/markets/trades
GETNoAll public trades. Docs: Get Trades
/series/{ticker}
GETNoGet a series. Docs: Get Series
/series
GETNoList series. Docs: Get Series List
端点方法是否需要认证描述
/markets
GET带筛选条件列出市场(状态、系列、时间戳)。文档:Get Markets
/markets/{ticker}
GET通过交易代码获取单个市场。文档:Get Market
/markets/{ticker}/orderbook
GET获取当前订单簿(YES买单 + NO买单)。文档:Get Market Orderbook
/markets/{ticker}/candlesticks
GETK线数据(1分钟、1小时、1天)。文档:Get Market Candlesticks
/markets/candlesticks
POST批量获取最多100个交易代码的K线数据。文档:Batch Get Market Candlesticks
/markets/trades
GET所有公开交易。文档:Get Trades
/series/{ticker}
GET获取系列。文档:Get Series
/series
GET列出系列。文档:Get Series List

Events

事件

EndpointMethodAuthDescription
/events
GETNoList events (excludes multivariate). Docs: Get Events
/events/{ticker}
GETNoGet a single event. Docs: Get Event
/events/{ticker}/metadata
GETNoEvent metadata only. Docs: Get Event Metadata
/events/{ticker}/candlesticks
GETNoAggregated event candlesticks. Docs: Get Event Candlesticks
/events/{ticker}/forecast/percentile_history
GETNoForecast percentile history. Docs: Get Event Forecast Percentile History
/events/multivariate
GETNoList multivariate events. Docs: Get Multivariate Events
端点方法是否需要认证描述
/events
GET列出事件(不含多元事件)。文档:Get Events
/events/{ticker}
GET获取单个事件。文档:Get Event
/events/{ticker}/metadata
GET仅获取事件元数据。文档:Get Event Metadata
/events/{ticker}/candlesticks
GET聚合事件K线数据。文档:Get Event Candlesticks
/events/{ticker}/forecast/percentile_history
GET预测百分位数历史数据。文档:Get Event Forecast Percentile History
/events/multivariate
GET列出多元事件。文档:Get Multivariate Events

Orders (Authenticated)

订单(需认证)

EndpointMethodAuthDescription
/portfolio/orders
POSTYesCreate an order. Docs: Create Order
/portfolio/orders
GETYesList your orders (resting/canceled/executed). Docs: Get Orders
/portfolio/orders/{order_id}
GETYesGet a single order. Docs: Get Order
/portfolio/orders/{order_id}
DELETEYesCancel an order. Docs: Cancel Order
/portfolio/orders/{order_id}/amend
POSTYesAmend price/count. Docs: Amend Order
/portfolio/orders/{order_id}/decrease
POSTYesDecrease contract count. Docs: Decrease Order
/portfolio/orders/{order_id}/queue_position
GETYesQueue position. Docs: Get Order Queue Position
/portfolio/orders/queue_positions
GETYesQueue positions for all resting orders. Docs: Get Queue Positions for Orders
/portfolio/orders/batched
POSTYesBatch create (up to 20). Docs: Batch Create Orders
/portfolio/orders/batched
DELETEYesBatch cancel (up to 20). Docs: Batch Cancel Orders
端点方法是否需要认证描述
/portfolio/orders
POST创建订单。文档:Create Order
/portfolio/orders
GET列出您的订单(待处理/已取消/已执行)。文档:Get Orders
/portfolio/orders/{order_id}
GET获取单个订单。文档:Get Order
/portfolio/orders/{order_id}
DELETE取消订单。文档:Cancel Order
/portfolio/orders/{order_id}/amend
POST修改价格/数量。文档:Amend Order
/portfolio/orders/{order_id}/decrease
POST减少合约数量。文档:Decrease Order
/portfolio/orders/{order_id}/queue_position
GET队列位置。文档:Get Order Queue Position
/portfolio/orders/queue_positions
GET所有待处理订单的队列位置。文档:Get Queue Positions for Orders
/portfolio/orders/batched
POST批量创建(最多20笔)。文档:Batch Create Orders
/portfolio/orders/batched
DELETE批量取消(最多20笔)。文档:Batch Cancel Orders

Portfolio (Authenticated)

投资组合(需认证)

EndpointMethodAuthDescription
/portfolio/balance
GETYesAccount balance (cents). Docs: Get Balance
/portfolio/positions
GETYesMarket positions. Docs: Get Positions
/portfolio/fills
GETYesYour fills. Docs: Get Fills
/portfolio/settlements
GETYesSettlement history. Docs: Get Settlements
/portfolio/resting_order_value
GETYesTotal resting order value (FCM). Docs: Get Total Resting Order Value
端点方法是否需要认证描述
/portfolio/balance
GET账户余额(美分)。文档:Get Balance
/portfolio/positions
GET市场持仓。文档:Get Positions
/portfolio/fills
GET您的成交记录。文档:Get Fills
/portfolio/settlements
GET结算历史。文档:Get Settlements
/portfolio/resting_order_value
GET待处理订单总价值(FCM)。文档:Get Total Resting Order Value

Subaccounts (Authenticated)

子账户(需认证)

EndpointMethodAuthDescription
/portfolio/subaccounts
POSTYesCreate subaccount (max 32). Docs: Create Subaccount
/portfolio/subaccounts/balances
GETYesAll subaccount balances. Docs: Get All Subaccount Balances
/portfolio/subaccounts/transfers
GETYesSubaccount transfer history. Docs: Get Subaccount Transfers
/portfolio/subaccounts/transfer
POSTYesTransfer between subaccounts. Docs: Transfer Between Subaccounts
端点方法是否需要认证描述
/portfolio/subaccounts
POST创建子账户(最多32个)。文档:Create Subaccount
/portfolio/subaccounts/balances
GET所有子账户余额。文档:Get All Subaccount Balances
/portfolio/subaccounts/transfers
GET子账户转账历史。文档:Get Subaccount Transfers
/portfolio/subaccounts/transfer
POST子账户间转账。文档:Transfer Between Subaccounts

Order Groups (Authenticated)

订单组(需认证)

Order groups apply a rolling 15-second contracts limit; when hit, all orders in the group are auto-cancelled.
EndpointMethodAuthDescription
/portfolio/order_groups
POSTYesCreate group. Docs: Create Order Group
/portfolio/order_groups
GETYesList groups. Docs: Get Order Groups
/portfolio/order_groups/{id}
GETYesGet group. Docs: Get Order Group
/portfolio/order_groups/{id}
DELETEYesDelete group. Docs: Delete Order Group
/portfolio/order_groups/{id}/reset
POSTYesReset counter. Docs: Reset Order Group
/portfolio/order_groups/{id}/trigger
POSTYesManually trigger. Docs: Trigger Order Group
/portfolio/order_groups/{id}/limit
PUTYesUpdate limit. Docs: Update Order Group Limit
订单组应用滚动15秒合约限制;达到限制时,组内所有订单将自动取消。
端点方法是否需要认证描述
/portfolio/order_groups
POST创建组。文档:Create Order Group
/portfolio/order_groups
GET列出组。文档:Get Order Groups
/portfolio/order_groups/{id}
GET获取组。文档:Get Order Group
/portfolio/order_groups/{id}
DELETE删除组。文档:Delete Order Group
/portfolio/order_groups/{id}/reset
POST重置计数器。文档:Reset Order Group
/portfolio/order_groups/{id}/trigger
POST手动触发。文档:Trigger Order Group
/portfolio/order_groups/{id}/limit
PUT更新限制。文档:Update Order Group Limit

Communications / RFQ (Authenticated)

通信 / RFQ(需认证)

EndpointMethodAuthDescription
/communications/id
GETYesGet your comms ID. Docs: Get Communications ID
/rfqs
POSTYesCreate RFQ (max 100 open). Docs: Create RFQ
/rfqs
GETYesList RFQs. Docs: Get RFQs
/rfqs/{id}
GETYesGet RFQ. Docs: Get RFQ
/rfqs/{id}
DELETEYesDelete RFQ. Docs: Delete RFQ
/quotes
POSTYesCreate quote. Docs: Create Quote
/quotes
GETYesList quotes. Docs: Get Quotes
/quotes/{id}
GETYesGet quote. Docs: Get Quote
/quotes/{id}
DELETEYesDelete quote. Docs: Delete Quote
/quotes/{id}/accept
POSTYesAccept quote. Docs: Accept Quote
/quotes/{id}/confirm
POSTYesConfirm quote. Docs: Confirm Quote
端点方法是否需要认证描述
/communications/id
GET获取您的通信ID。文档:Get Communications ID
/rfqs
POST创建RFQ(最多100个未处理)。文档:Create RFQ
/rfqs
GET列出RFQ。文档:Get RFQs
/rfqs/{id}
GET获取单个RFQ。文档:Get RFQ
/rfqs/{id}
DELETE删除RFQ。文档:Delete RFQ
/quotes
POST创建报价。文档:Create Quote
/quotes
GET列出报价。文档:Get Quotes
/quotes/{id}
GET获取单个报价。文档:Get Quote
/quotes/{id}
DELETE删除报价。文档:Delete Quote
/quotes/{id}/accept
POST接受报价。文档:Accept Quote
/quotes/{id}/confirm
POST确认报价。文档:Confirm Quote

Historical Data (Authenticated)

历史数据(需认证)

Historical data is for archived markets, orders, and fills that have moved past cutoff timestamps.
EndpointMethodAuthDescription
/historical/cutoff_timestamps
GETYesCutoff boundaries. Docs: Get Historical Cutoff Timestamps
/historical/markets
GETYesArchived markets. Docs: Get Historical Markets
/historical/markets/{ticker}
GETYesSingle archived market. Docs: Get Historical Market
/historical/markets/{ticker}/candlesticks
GETYesArchived candlesticks. Docs: Get Historical Market Candlesticks
/historical/fills
GETYesArchived fills. Docs: Get Historical Fills
/historical/orders
GETYesArchived orders. Docs: Get Historical Orders
历史数据适用于已超过截止时间的归档市场、订单和成交记录。
端点方法是否需要认证描述
/historical/cutoff_timestamps
GET截止时间边界。文档:Get Historical Cutoff Timestamps
/historical/markets
GET归档市场。文档:Get Historical Markets
/historical/markets/{ticker}
GET单个归档市场。文档:Get Historical Market
/historical/markets/{ticker}/candlesticks
GET归档K线数据。文档:Get Historical Market Candlesticks
/historical/fills
GET归档成交记录。文档:Get Historical Fills
/historical/orders
GET归档订单。文档:Get Historical Orders

Multivariate Collections

多元事件集合

EndpointMethodAuthDescription
/multivariate/collections
GETNoList collections. Docs: Get Multivariate Event Collections
/multivariate/collections/{ticker}
GETNoGet collection. Docs: Get Multivariate Event Collection
/multivariate/collections/{ticker}/markets
POSTYesCreate market in collection. Docs: Create Market In Multivariate Event Collection
/multivariate/collections/{ticker}/lookup
GETNoLookup tickers. Docs: Lookup Tickers For Market In Multivariate Event Collection
/multivariate/collections/{ticker}/lookup_history
GETNoRecent lookups. Docs: Get Multivariate Event Collection Lookup History
端点方法是否需要认证描述
/multivariate/collections
GET列出集合。文档:Get Multivariate Event Collections
/multivariate/collections/{ticker}
GET获取集合。文档:Get Multivariate Event Collection
/multivariate/collections/{ticker}/markets
POST在集合中创建市场。文档:Create Market In Multivariate Event Collection
/multivariate/collections/{ticker}/lookup
GET查询交易代码。文档:Lookup Tickers For Market In Multivariate Event Collection
/multivariate/collections/{ticker}/lookup_history
GET近期查询记录。文档:Get Multivariate Event Collection Lookup History

Milestones & Structured Targets

里程碑与结构化目标

EndpointMethodAuthDescription
/milestones
GETNoList milestones. Docs: Get Milestones
/milestones/{id}
GETNoGet milestone. Docs: Get Milestone
/structured_targets
GETNoList structured targets. Docs: Get Structured Targets
/structured_targets/{id}
GETNoGet structured target. Docs: Get Structured Target
端点方法是否需要认证描述
/milestones
GET列出里程碑。文档:Get Milestones
/milestones/{id}
GET获取单个里程碑。文档:Get Milestone
/structured_targets
GET列出结构化目标。文档:Get Structured Targets
/structured_targets/{id}
GET获取单个结构化目标。文档:Get Structured Target

Live Data

实时数据

EndpointMethodAuthDescription
/live_data/{milestone_id}
GETNoLive data for milestone. Docs: Get Live Data
/live_data
GETNoMultiple milestones. Docs: Get Multiple Live Data
端点方法是否需要认证描述
/live_data/{milestone_id}
GET里程碑的实时数据。文档:Get Live Data
/live_data
GET多个里程碑的实时数据。文档:Get Multiple Live Data

Search & Discovery

搜索与发现

EndpointMethodAuthDescription
/search/sports/filters
GETNoSport filters. Docs: Get Filters for Sports
/search/tags
GETNoTags by category. Docs: Get Tags for Series Categories
端点方法是否需要认证描述
/search/sports/filters
GET体育类筛选条件。文档:Get Filters for Sports
/search/tags
GET按分类列出标签。文档:Get Tags for Series Categories

Exchange & Account

交易所与账户

EndpointMethodAuthDescription
/exchange/status
GETNoExchange status. Docs: Get Exchange Status
/exchange/schedule
GETNoExchange schedule. Docs: Get Exchange Schedule
/exchange/announcements
GETNoAnnouncements. Docs: Get Exchange Announcements
/exchange/data_timestamp
GETYesData freshness timestamp. Docs: Get User Data Timestamp
/exchange/series_fee_changes
GETNoFee changes. Docs: Get Series Fee Changes
/account/api_limits
GETYesYour rate limit tier. Docs: Get Account API Limits
/account/api_keys
GETYesList API keys. Docs: Get API Keys
/account/api_keys
POSTYesCreate API key. Docs: Create API Key
/account/api_keys/generate
POSTYesGenerate key pair. Docs: Get API Keys
/account/api_keys/{id}
DELETEYesDelete API key. Docs: Delete API Key
端点方法是否需要认证描述
/exchange/status
GET交易所状态。文档:Get Exchange Status
/exchange/schedule
GET交易所日程。文档:Get Exchange Schedule
/exchange/announcements
GET公告。文档:Get Exchange Announcements
/exchange/data_timestamp
GET数据新鲜度时间戳。文档:Get User Data Timestamp
/exchange/series_fee_changes
GET系列费用变更。文档:Get Series Fee Changes
/account/api_limits
GET您的速率限制等级。文档:Get Account API Limits
/account/api_keys
GET列出API密钥。文档:Get API Keys
/account/api_keys
POST创建API密钥。文档:Create API Key
/account/api_keys/generate
POST生成密钥对。文档:Generate API Key
/account/api_keys/{id}
DELETE删除API密钥。文档:Delete API Key

Incentive Programs

激励计划

EndpointMethodAuthDescription
/incentives
GETNoList incentives. Docs: Get Incentives

端点方法是否需要认证描述
/incentives
GET列出激励计划。文档:Get Incentives

WebSocket API

WebSocket API

A single authenticated WebSocket connection provides real-time streaming. Subscribe to channels by sending JSON commands.
单个已认证的WebSocket连接可提供实时流传输。通过发送JSON命令订阅通道。

Connection

连接

wss://api.elections.kalshi.com/trade-api/ws/v2      (production)
wss://demo-api.kalshi.co/trade-api/ws/v2            (demo)
Authentication headers (
KALSHI-ACCESS-KEY
,
KALSHI-ACCESS-SIGNATURE
,
KALSHI-ACCESS-TIMESTAMP
) must be included during the handshake. Sign the string
{timestamp}GET/trade-api/ws/v2
.
wss://api.elections.kalshi.com/trade-api/ws/v2      (生产环境)
wss://demo-api.kalshi.co/trade-api/ws/v2            (演示环境)
握手时必须包含认证请求头(
KALSHI-ACCESS-KEY
KALSHI-ACCESS-SIGNATURE
KALSHI-ACCESS-TIMESTAMP
)。对字符串
{timestamp}GET/trade-api/ws/v2
进行签名。

Available Channels

可用通道

ChannelAuth RequiredDescriptionDocs
ticker
No*Market price/volume/OI updatesMarket Ticker
trade
No*Public trade notificationsPublic Trades
market_lifecycle_v2
No*Market/event state changesMarket & Event Lifecycle
multivariate
No*Multivariate lookup notificationsMultivariate Lookups
orderbook_delta
YesReal-time orderbook updatesOrderbook Updates
fill
YesYour fill notificationsUser Fills
order
YesYour order updatesUser Orders
market_positions
YesYour position updatesMarket Positions
communications
YesRFQ/quote notificationsCommunications
order_group_updates
YesOrder group lifecycleOrder Group Updates
*The connection itself always requires authentication, even for public channels.
通道是否需要认证描述文档
ticker
否*市场价格/成交量/持仓量更新Market Ticker
trade
否*公开交易通知Public Trades
market_lifecycle_v2
否*市场/事件状态变更Market & Event Lifecycle
multivariate
否*多元事件查询通知Multivariate Lookups
orderbook_delta
实时订单簿更新Orderbook Updates
fill
您的成交通知User Fills
order
您的订单更新User Orders
market_positions
您的持仓更新Market Positions
communications
RFQ/报价通知Communications
order_group_updates
订单组生命周期更新Order Group Updates
*即使是公开通道,连接本身也始终需要认证。

Subscribe Command

订阅命令

json
{
  "id": 1,
  "cmd": "subscribe",
  "params": {
    "channels": ["ticker", "orderbook_delta"],
    "market_tickers": ["KXHIGHNY-24JAN01-T60"]
  }
}
json
{
  "id": 1,
  "cmd": "subscribe",
  "params": {
    "channels": ["ticker", "orderbook_delta"],
    "market_tickers": ["KXHIGHNY-24JAN01-T60"]
  }
}

Keep-Alive

保活机制

Kalshi sends Ping frames every 10 seconds with body
heartbeat
. Clients must respond with Pong frames. Docs: Connection Keep-Alive

Kalshi每10秒发送一次Ping帧,内容为
heartbeat
。客户端必须回复Pong帧。文档:Connection Keep-Alive

Orderbook Structure

订单簿结构

Kalshi orderbooks return bids only (no asks). In binary markets:
  • A YES bid at X¢ = a NO ask at (100−X)¢
  • A NO bid at Y¢ = a YES ask at (100−Y)¢
Each entry is
[price, quantity]
sorted ascending. The best bid is the last element.
Spread calculation:
  • Best YES ask =
    100 - best_no_bid
  • Spread = Best YES ask − Best YES bid

Kalshi订单簿仅返回买单(无卖单)。在二元市场中:
  • X美分的YES买单等价于(100−X)美分的NO卖单
  • Y美分的NO买单等价于(100−Y)美分的YES卖单
每个条目为
[price, quantity]
,按升序排列。最优买单是最后一个元素。
点差计算:
  • 最优YES卖单价格 =
    100 - 最优NO买单价格
  • 点差 = 最优YES卖单价格 − 最优YES买单价格

FIX Protocol

FIX协议

Common Patterns

常见模式

Fetch All Open Markets for a Series

获取某系列的所有开放市场

bash
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXHIGHNY&status=open" | jq '.markets[] | {ticker, title, yes_price, volume}'
bash
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets?series_ticker=KXHIGHNY&status=open" | jq '.markets[] | {ticker, title, yes_price, volume}'

Get Orderbook for a Market

获取某市场的订单簿

bash
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets/KXHIGHNY-24JAN01-T60/orderbook" | jq '.orderbook'
bash
curl -s "https://api.elections.kalshi.com/trade-api/v2/markets/KXHIGHNY-24JAN01-T60/orderbook" | jq '.orderbook'

Paginate Through All Results

遍历所有结果(分页)

bash
undefined
bash
undefined

First page

第一页

Extract cursor for next page

提取下一页的游标

CURSOR=$(jq -r '.cursor' page1.json)
CURSOR=$(jq -r '.cursor' page1.json)

Next page

下一页

Usage Tips

使用技巧

  • Always check
    llms.txt
    first:
    https://docs.kalshi.com/llms.txt has every endpoint and guide.
  • Use the demo environment for testing — credentials are separate from production.
  • Never hardcode API keys — use environment variables or secure key storage.
  • Prices are in cents (1–99). Monetary values in WebSocket position channels are in centi-cents (divide by 10,000 for dollars).
  • Sign paths without query parameters. Strip everything after
    ?
    before signing.
  • Handle pagination — always check for a non-null
    cursor
    and loop until exhausted.
  • Respect rate limits — implement exponential backoff on 429 responses.
  • Combine REST + WebSocket for the most accurate state: use REST for initial snapshots and WebSocket for real-time deltas.
  • Orderbook is bids-only — derive asks via the 100−price complement.
  • Historical vs. Live data: Check cutoff timestamps to know whether to query live or historical endpoints.
  • For market status values, use:
    unopened
    ,
    open
    ,
    closed
    ,
    settled
    .
  • Batch operations count against per-second write limits per item.

  • 首先查阅
    llms.txt
    https://docs.kalshi.com/llms.txt包含所有端点和指南。
  • 使用演示环境进行测试——演示环境的凭证与生产环境分离。
  • 切勿硬编码API密钥——使用环境变量或安全密钥存储。
  • 价格以美分计价(1-99)。WebSocket持仓通道中的货币价值以厘分计价(除以10000转换为美元)。
  • 对不含查询参数的路径进行签名。签名前,删除
    ?
    后的所有内容。
  • 处理分页——始终检查非空
    cursor
    ,并循环直到没有更多页面。
  • 遵守速率限制——在收到429响应时实现指数退避。
  • 结合REST + WebSocket以获取最准确的状态:使用REST获取初始快照,使用WebSocket获取实时增量更新。
  • 订单簿仅含买单——通过100−价格的补数推导卖单。
  • 历史数据与实时数据: 检查截止时间戳以确定应查询实时端点还是历史端点。
  • 市场状态值包括:
    unopened
    open
    closed
    settled
  • 批量操作按每个条目计入每秒写入限制。

Error Handling

错误处理

Standard HTTP error codes apply. The API returns JSON error bodies with descriptive messages. Implement retry with backoff for 429 (rate limited) and 5xx (server errors).
适用标准HTTP错误码。API返回带描述性消息的JSON错误体。对429(速率限制)和5xx(服务器错误)响应实现重试与退避机制。

WebSocket Error Codes

WebSocket错误码

CodeMeaning
1Unable to process message
2Params required
3Channels required
5Unknown command
8Unknown channel name
9Authentication required
14Market ticker required
16Market not found
17Internal error
18Command timeout

代码含义
1无法处理消息
2需要参数
3需要通道
5未知命令
8未知通道名称
9需要认证
14需要市场交易代码
16市场未找到
17内部错误
18命令超时

Example Project: Alph Bot

示例项目:Alph Bot

Alph Bot is an open-source automated trading bot that demonstrates a production-quality integration of the Kalshi API alongside Shipp for real-time sports data and Claude AI for probability estimation.
Alph Bot是一个开源自动化交易机器人,展示了如何将Kalshi API与Shipp实时体育数据以及Claude AI概率估算进行生产级集成。

How Alph Bot Uses Kalshi

Alph Bot如何使用Kalshi

  1. Market discovery — Searches for Kalshi event contracts related to a live sports game (e.g., NBA point spreads, totals).
  2. Orderbook reading — Fetches orderbook data to determine current market-implied probabilities (prices in cents map directly to implied %).
  3. Edge detection — Compares Kalshi market prices against AI-estimated probabilities powered by Claude + Shipp real-time game data.
  4. Order execution — Places limit orders when sufficient edge is found, using Kelly Criterion for position sizing.
  5. Risk management — Enforces circuit breakers (max daily loss), position size limits, single-market exposure caps, and minimum account balance thresholds.
  1. 市场发现——搜索与实时体育赛事相关的Kalshi事件合约(例如NBA让分盘、总分盘)。
  2. 订单簿读取——获取订单簿数据以确定当前市场隐含概率(美分价格直接对应隐含百分比)。
  3. 机会识别——将Kalshi市场价格与Claude + Shipp实时赛事数据驱动的AI估算概率进行比较。
  4. 订单执行——当发现足够的套利空间时,使用凯利准则(Kelly Criterion)确定持仓规模并下达限价订单。
  5. 风险管理——实施熔断机制(每日最大亏损)、持仓规模限制、单一市场暴露上限以及最低账户余额阈值。

Alph Bot's Kalshi Configuration

Alph Bot的Kalshi配置

From its
.env.example
:
ALPH_BOT_KALSHI_API_KEY_ID=abc123
ALPH_BOT_KALSHI_PRIVATE_KEY_PATH=./keys/kalshi-private.pem
来自其
.env.example
ALPH_BOT_KALSHI_API_KEY_ID=abc123
ALPH_BOT_KALSHI_PRIVATE_KEY_PATH=./keys/kalshi-private.pem

Strategy

策略

ALPH_BOT_MIN_EDGE_PCT=5 ALPH_BOT_MIN_CONFIDENCE=medium ALPH_BOT_KELLY_FRACTION=0.25
ALPH_BOT_MIN_EDGE_PCT=5 ALPH_BOT_MIN_CONFIDENCE=medium ALPH_BOT_KELLY_FRACTION=0.25

Risk controls

风险控制

ALPH_BOT_MAX_TOTAL_EXPOSURE_USD=10000 ALPH_BOT_MAX_POSITION_SIZE_USD=1000 ALPH_BOT_MAX_SINGLE_MARKET_PERCENT=20 ALPH_BOT_MAX_DAILY_LOSS_USD=500 ALPH_BOT_MAX_DAILY_TRADES=50 ALPH_BOT_MIN_ACCOUNT_BALANCE_USD=100
undefined
ALPH_BOT_MAX_TOTAL_EXPOSURE_USD=10000 ALPH_BOT_MAX_POSITION_SIZE_USD=1000 ALPH_BOT_MAX_SINGLE_MARKET_PERCENT=20 ALPH_BOT_MAX_DAILY_LOSS_USD=500 ALPH_BOT_MAX_DAILY_TRADES=50 ALPH_BOT_MIN_ACCOUNT_BALANCE_USD=100
undefined

Try It

尝试使用

bash
git clone https://gitlab.com/outsharp/shipp/alph-bot.git
cd alph-bot
cp .env.example .env
bash
git clone https://gitlab.com/outsharp/shipp/alph-bot.git
cd alph-bot
cp .env.example .env

Add your Kalshi, Shipp, and Anthropic API keys

添加您的Kalshi、Shipp和Anthropic API密钥

yarn migrate
yarn migrate

Find a game to trade on

查找可交易的赛事

./index.ts available-games --sport NBA
./index.ts available-games --sport NBA

Run value betting in demo mode (uses Kalshi demo environment)

以演示模式运行价值投注(使用Kalshi演示环境)

./index.ts value-bet -d --game <GAME_ID>
./index.ts value-bet -d --game <GAME_ID>

Run in paper mode (no real orders executed)

以模拟模式运行(不执行真实订单)

./index.ts value-bet --paper --game <GAME_ID>

> **Warning:** Trading on Kalshi involves real money when not in demo/paper mode. Always start with a [demo account](https://help.kalshi.com/account/demo-account).

See the [Alph Bot README](https://gitlab.com/outsharp/shipp/alph-bot) for full setup instructions.

---
./index.ts value-bet --paper --game <GAME_ID>

> **警告:** 非演示/模拟模式下,在Kalshi进行交易涉及真实资金。请始终从[演示账户](https://help.kalshi.com/account/demo-account)开始。

查看[Alph Bot README](https://gitlab.com/outsharp/shipp/alph-bot)获取完整设置说明。

---

Versioning

版本控制

The current API version is v2 under
/trade-api/v2
. Monitor the API Changelog for updates. SDK versions align with the OpenAPI spec and are generally published weekly.
当前API版本为v2,路径为
/trade-api/v2
。请关注API更新日志以获取更新信息。SDK版本与OpenAPI规范保持一致,通常每周发布一次。