К основному содержанию
скилл CX Codex

kalshi-api — скилл для Claude Code: механика биржи Kalshi

Скилл описывает подпись RSA-PSS, схему ордеров и стакан YES/NO на бирже Kalshi. Нужен, когда пишете торговый код под этот API.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add agiprolabs/claude-trading-skills --skill kalshi-api -a claude-code
Открыть на GitHub

Что делает kalshi-api

Скилл даёт справочный слой по API биржи Kalshi: базовый адрес https://api.elections.kalshi.com/trade-api/v2, подпись каждого запроса, схема тела ордера, соглашение стакана YES/NO и обзор эндпоинтов. Он не привязан к типу рынка, поэтому на него опираются остальные скиллы по Kalshi.

Внутри — готовый код подписи на Python: httpx и cryptography, ключ читается из KALSHI_PRIVATE_KEY_PATH, идентификатор из KALSHI_KEY_ID. Подписывается строка {timestamp_ms}{METHOD}{path} без query-строки, метка времени в миллисекундах, соль равна PSS.DIGEST_LENGTH. Стакан устроен непривычно: yes и no — это два встречных бид-лестницы, отдельного аска нет, поэтому цена покупки NO считается как 1 − best_yes_bid.

Публичных эндпоинтов нет, авторизация нужна даже на чтение. Демо-среда demo-api.kalshi.co почти пуста, так что и для чтения идут в продакшн. Ордер принимает долларовые строки: count_fp вида "1.00", yes_price_dollars вида "0.01", обязательный time_in_force; поле type отправлять нельзя. В client_order_id допустимы только [A-Za-z0-9-], а тикеры со страйками содержат точку — копировать тикер в это поле нельзя. Старый хост trading-api.kalshi.com мёртв, и схема ордера уже менялась с целых центов на долларовые строки, поэтому подпись и тело стоит прогнать на живом ответе до выкатки.

Какие задачи решает

  • подписать запрос к Kalshi ключом RSA-PSS
  • разобрать стакан YES/NO и посчитать цену входа
  • собрать тело ордера в долларовых строках
  • вытащить свечи по рынку серии
  • проверить баланс и позиции через API

Примеры запросов агенту

  • Напиши функцию подписи запроса к Kalshi на Python с ключом из KALSHI_PRIVATE_KEY_PATH
  • Посчитай цену покупки NO по стакану рынка KXHIGHNY-26JUN02-B75.5
  • Собери тело ордера на покупку 1 контракта YES по цене 0.01 с time_in_force good_till_canceled

Как установить kalshi-api

1Через Skills CLI (Vercel)

npx skills add agiprolabs/claude-trading-skills --skill kalshi-api -a claude-code

2Вручную: положить файлы

~/.claude/skills/kalshi-api/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/kalshi-api/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о kalshi-api

Как установить kalshi-api в Claude Code?

Выполните npx skills add agiprolabs/claude-trading-skills --skill kalshi-api -a claude-code. Файл скилла появится по пути ~/.claude/skills/kalshi-api/SKILL.md.

Что делает скилл kalshi-api?

Описывает механику биржи Kalshi: подпись RSA-PSS, схему ордеров, соглашение стакана YES/NO, WebSocket и список эндпоинтов. Это общий слой для остальных скиллов по Kalshi.

Что нужно, чтобы скилл заработал?

Ключ из дашборда Kalshi в переменных KALSHI_KEY_ID и KALSHI_PRIVATE_KEY_PATH, а также пакеты httpx и cryptography.

Исходный текст

SKILL.md · MIT
---
name: kalshi-api
description: 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.
---

# 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.pem
```

Generate the key in the Kalshi dashboard. Store secrets in environment variables or a secrets manager — never in code.

### 2. Install

```bash
pip install httpx cryptography
```

### 3. Host + auth (the part everyone gets wrong)

The host and signature format are where implementations break. Three common failures:
1. Using the old `trading-api.kalshi.com` host → 401
2. Including the query string in the signed path → 401
3. Signing with seconds instead of milliseconds → 401

```python
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

```python
# 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)) / 2
```

Getting 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:
```json
{"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`.

```json
{
  "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_id` sanitization, amend/decrease/cancel lifecycle, `strike_type` gotcha, fees
- `references/endpoints-and-marketdata.md` — Full endpoint table, orderbook variants, market metadata fields (`result`, `open_time`, `close_time`, `series_ticker`), candlesticks, rate limits
- `references/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.

© agiprolabs · MIT · agiprolabs/claude-trading-skills

Похожие скиллы

Все скиллы по теме «Финансы и бизнес» →
churn-prevention coreyhaines31 Скилл для Claude Code, который разбирает отток подписок: опрос при отмене, предложение под причину ухода, восстановление неудачных платежей. CX Codex +1 121 000установок revops coreyhaines31 Скилл помогает проектировать RevOps: вести лидов по этапам, считать скоринг и выстраивать передачу из маркетинга в продажи. Нужен для CRM-процессов. CX Codex +1 113 500установок community-marketing coreyhaines31 Помогает запустить и развивать сообщество в Discord или Slack для удержания пользователей и создания базы амбассадоров. CX Codex +1 89 500установок ads coreyhaines31 Скилл помогает планировать, проверять и оптимизировать рекламу в Google Ads, Meta и LinkedIn. Опирается на плейбуки и требует фактов вместо домыслов. CX Codex +1 82 800установок pricing coreyhaines31 Помогает агенту разобрать цены и тарифы SaaS: выбрать метрику, собрать планы, проверить страницу с ценами. Пригодится, когда непонятно, сколько брать и за что. CX Codex +1 79 300установок marketing-plan coreyhaines31 Генерирует 12-месячный маркетинговый план по структуре AARRR с аудитом и дорожной картой на 90 дней. Готовый результат оформляется в Markdown для Notion. CX Codex +1 67 900установок

Из того же набора64

fixed-income Считает цену облигации, доходность к погашению, дюрацию и выпуклость. Подойдёт для базового анализа fixed income и DeFi-ставок. CX Codex +1 424установок dex-execution Скилл проводит своп токенов на Solana через агрегатор Jupiter: котировка, сборка транзакции, подпись и подтверждение. CX Codex +1 424установок tax-liability-tracking Считает налоговую нагрузку по криптосделкам в реальном времени: пропорциональная себестоимость, классификация прибыли и сигналы с учётом налога. CX Codex +1 423установок shredstream Скилл для потоковой передачи транзакций Solana до исполнения блока — на 100-500 мс раньше стандартного Yellowstone gRPC. Для торговых стратегий, где важна каждая миллисекунда. CX Codex +1 423установок regulatory-reporting Превращает историю сделок с криптовалютой в строки для форм IRS 8949 и Schedule D. Пригодится трейдерам при подготовке годовой отчётности. CX Codex +1 420установок cost-basis-engine Считает себестоимость криптосделок методами FIFO, LIFO, HIFO, specific ID и средней стоимости, чтобы сравнить налоговую нагрузку по каждому. CX Codex +1 421установок raptor-dex Помогает настроить и вызывать селф-хостед агрегатор DEX на Solana без лимитов по API. Пригодится для поиска маршрутов обмена по 25+ биржам и отправки транзакций через TPU. CX Codex +1 413установок prediction-market-strategy Слой стратегии, расчёта ставки и бэктеста для бинарных prediction-рынков: Kalshi, Polymarket, ForecastEx. Пригодится, когда нужно отобрать сделку по net edge, а не по проценту угаданных исходов. CX Codex +1 311установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой