kalshi-api
Skill0 starsChanged 3 months agoMITView on GitHub
Kalshi exchange mechanics — RSA-PSS auth, order schema, YES/NO orderbook convention, WebSocket, and endpoint surface. Market-type-agnostic shared layer for all Kalshi skills.
- Installs packages
1 other project uses a version of this.
Adopted by
Most recently taken up by
- agiprolabs/claude-trading-skillsword for word, first seen Mar 11, 2026
Other versions1 project uses a version of this.
Word for word · 1
- agiprolabs/claude-trading-skills★ 366100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository66 other files it gives its agents.
- backtraderSkill
- birdeye-apiSkill
- coingecko-apiSkill
- cointegration-analysisSkill
- copy-tradingSkill
- correlation-analysisSkill
- cost-basis-engineSkill
- crypto-tax-exportSkill
- custom-indicatorsSkill
- defillama-apiSkill
- dex-executionSkill
- dex-pool-analysisSkill
- dexscreener-apiSkill
- exit-strategiesSkill
- feature-engineeringSkill
- fixed-incomeSkill
- helius-apiSkill
- impermanent-lossSkill
- jito-bundlesSkill
- kalshi-crypto-index-marketsSkill
- kalshi-weather-marketsSkill
- kelly-criterionSkill
- liquidity-analysisSkill
- lp-mathSkill
- market-microstructureSkill
- market-microstructure-traditionalSkill
- mean-reversionSkill
- mev-analysisSkill
- ohlcv-processingSkill
- options-pricingSkill
- pandas-taSkill
- polymarket-apiSkill
- portfolio-analyticsSkill
- position-sizingSkill
- prediction-market-strategySkill
- pumpfun-mechanicsSkill
- raptor-dexSkill
- regime-detectionSkill
- regulatory-reportingSkill
- risk-managementSkill
- rl-executionSkill
- sentiment-analysisSkill
- shredstreamSkill
- signal-classificationSkill
- slippage-modelingSkill
- solana-rpcSkill
- solanatracker-apiSkill
- solana-tx-buildingSkill
- strategy-frameworkSkill
- sybil-detectionSkill
- ta-libSkill
- tax-liability-trackingSkill
- tax-loss-harvestingSkill
- token-economicsSkill
- token-holder-analysisSkill
- trade-accountingSkill
- trade-journalSkill
- trading-visualizationSkill
- vectorbtSkill
- volatility-modelingSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
1 rule. About 0 are common, 0 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 134
If a price value is > 1.0, it is integer cents — divide by 100.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Kalshi API
CFTC-regulated US event exchange. USD-denominated binary contracts settle at $1.00 (YES wins) or $0.00 (NO wins). REST + WebSocket, RSA-PSS authentication on every request.
For contract semantics and settlement rules, see the kalshi-weather-markets and kalshi-crypto-index-markets skills. For strategy, sizing, and backtesting, see prediction-market-strategy.
VERIFY BEFORE CODING. The Kalshi API has broken backward compatibility before: the host changed (old
trading-api.kalshi.com→ dead), and the order schema changed (integer cents → dollar strings). Always smoke-test signing and order bodies against a live response before shipping.Canonical sources:
- API reference: https://docs.kalshi.com (legacy mirror: https://trading-api.readme.io)
- Official Python starter: https://github.com/Kalshi/kalshi-starter-code-python
Overview
- Base URL:
https://api.elections.kalshi.com/trade-api/v2 - Auth: RSA-PSS on every request — there are no public/unauthenticated endpoints
- No demo parity: the demo environment (
demo-api.kalshi.co) has a near-empty book; use production even for read-only pulls - Contracts: $0.01–$0.99 per contract; pay price if YES wins, lose price if NO wins; max payout = $1.00
Quick Start
1. Credentials
KALSHI_KEY_ID=<your-key-uuid>
KALSHI_PRIVATE_KEY_PATH=~/.kalshi/private.pemGenerate the key in the Kalshi dashboard. Store secrets in environment variables or a secrets manager — never in code.
2. Install
pip install httpx cryptography3. Host + auth (the part everyone gets wrong)
The host and signature format are where implementations break. Three common failures:
- Using the old
trading-api.kalshi.comhost → 401 - Including the query string in the signed path → 401
- Signing with seconds instead of milliseconds → 401
import os, time, base64, httpx
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.primitives.asymmetric import padding
BASE = "https://api.elections.kalshi.com/trade-api/v2"
KEY_ID = os.environ["KALSHI_KEY_ID"]
with open(os.environ["KALSHI_PRIVATE_KEY_PATH"], "rb") as f:
PRIV = serialization.load_pem_private_key(f.read(), password=None)
def _headers(method: str, path: str) -> dict:
"""path must include /trade-api/v2 prefix and exclude query string."""
ts = str(int(time.time() * 1000)) # milliseconds
msg = f"{ts}{method}{path}".encode()
sig = PRIV.sign(
msg,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.DIGEST_LENGTH),
hashes.SHA256(),
)
return {
"KALSHI-ACCESS-KEY": KEY_ID,
"KALSHI-ACCESS-TIMESTAMP": ts,
"KALSHI-ACCESS-SIGNATURE": base64.b64encode(sig).decode(),
}
def get(path: str, params=None):
# Sign the path only — query goes into params, not the signature
r = httpx.get(BASE + path, params=params,
headers=_headers("GET", "/trade-api/v2" + path))
r.raise_for_status()
return r.json()
def post(path: str, body: dict):
r = httpx.post(BASE + path, json=body,
headers=_headers("POST", "/trade-api/v2" + path))
r.raise_for_status()
return r.json()
# Example: open markets in a series
markets = get("/markets", params={"series_ticker": "KXHIGHNY", "status": "open"})Signature spec: RSA-PSS, MGF1 over SHA-256, salt length = PSS.DIGEST_LENGTH. String to sign: {timestamp_ms}{METHOD}{path} where path includes /trade-api/v2 and excludes the query string.
Headers: KALSHI-ACCESS-KEY (UUID), KALSHI-ACCESS-TIMESTAMP (ms), KALSHI-ACCESS-SIGNATURE (base64).
4. Candlestick history
# Returns OHLC for yes_bid / yes_ask + volume + open_interest
# Values are dollar strings: {"close": "0.42"}
candles = get(
f"/series/KXHIGHNY/markets/{ticker}/candlesticks",
params={"start_ts": start_epoch, "end_ts": end_epoch, "period_interval": 60},
)period_interval is in minutes: 1, 60, or 1440.
YES/NO Order-Book Convention
On Kalshi, yes and no are both resting BID ladders — there is no separate ask book. To take the other side you lift the opposing bid:
no_ask = 1 − best_yes_bid # cost to buy NO right now (lift YES bids)
yes_ask = 1 − best_no_bid # cost to buy YES right now (lift NO bids)
P(YES) mid = (best_yes_bid + (1 − best_no_bid)) / 2Getting this backwards silently inverts every signal. Use the helpers in scripts/kalshi_orderbook.py.
Orderbook response comes in two variants depending on API tier — normalize before using:
{"orderbook": {"yes": [[price, size], ...], "no": [[price, size], ...]}}If a price value is > 1.0, it is integer cents — divide by 100.
Order Schema
POST /trade-api/v2/portfolio/orders uses fixed-point dollar STRINGS, not integers. The old schema (integer cents, count, yes_price) returns 400 invalid_parameters.
{
"ticker": "KXHIGHNY-26JUN02-B75.5",
"action": "buy",
"side": "yes",
"count_fp": "1.00",
"yes_price_dollars": "0.01",
"client_order_id": "my-strategy-001",
"time_in_force": "good_till_canceled"
}Critical field rules — each violation returns 400:
| Field | Rule | Common mistake that 400s |
count_fp | fixed-point string "1.00" | integer count: 1 |
{side}_price_dollars | dollar string "0.01" | integer cents yes_price: 1 |
time_in_force | required: good_till_canceled | immediate_or_cancel | fill_or_kill | omitted |
client_order_id | [A-Za-z0-9-] only | . or : in the string — bracket tickers contain ., so never copy the ticker directly |
type | do not send | "type": "limit" |
For the full order lifecycle (amend, decrease, cancel, batch) and strike_type gotchas, see references/auth-and-orders.md.
Endpoint Summary
| Category | Endpoint | Notes |
| Balance | GET /portfolio/balance | — |
| Positions | GET /portfolio/positions | — |
| Orders | GET /portfolio/orders | ?status=resting|canceled|executed |
| Place order | POST /portfolio/orders | dollar-string schema above |
| Cancel | DELETE /portfolio/orders/{id} | returns {"order": {...status: "canceled"}} |
| Amend | POST /portfolio/orders/{id}/amend | ticker required in body |
| Decrease | POST /portfolio/orders/{id}/decrease | {"reduce_by_fp": "1.00"} |
| Batch | POST /portfolio/orders/batched | {"orders": [...]} |
| Fills | GET /portfolio/fills | ?limit=N |
| Settlements | GET /portfolio/settlements | ?limit=N |
| Markets | GET /markets | ?series_ticker=&status=open&limit=500 |
| Orderbook | GET /markets/{ticker}/orderbook | ?depth=N |
| Candlesticks | GET /series/{series}/markets/{ticker}/candlesticks | ?start_ts=&end_ts=&period_interval=60 |
| Trades | GET /markets/trades | recent trade prints |
Full endpoint surface, market metadata fields, and rate limits: references/endpoints-and-marketdata.md.
WebSocket discovery pipeline: references/websocket.md.
Files
References
references/auth-and-orders.md— RSA-PSS spec, dollar-string order schema,time_in_force,client_order_idsanitization, amend/decrease/cancel lifecycle,strike_typegotcha, feesreferences/endpoints-and-marketdata.md— Full endpoint table, orderbook variants, market metadata fields (result,open_time,close_time,series_ticker), candlesticks, rate limitsreferences/websocket.md— WS host, discovery pipeline, channels, signing the WS upgrade
Scripts
scripts/kalshi_orderbook.py— YES/NO bid-ladder helpers (no_ask,yes_ask,p_yes_mid,overround,kalshi_fee). Pure stdlib, no keys, runs offline.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

