Skip to content

Kalshi OpenAPI Coverage Reference

Type: Internal reference (derived from Kalshi OpenAPI) Status: Living Document Created: 2026-01-13 Updated: 2026-01-16 - Added blocking reasons and future tracking Source: OpenAPI audit at https://docs.kalshi.com/openapi.yaml


Purpose

This document is the master reference for Kalshi API endpoint coverage. It tracks: - What endpoints exist in the OpenAPI spec - What we've implemented - What we need to implement (and which spec covers it) - Our deliberate non-implementations (with reasoning)


Coverage Summary

Category OpenAPI Ops Implemented Coverage Spec
Exchange 4 4 100% βœ… SPEC-040 Phase 4
Markets (Core) 5 5 100% Done
Markets (Filters) 11 params 11 params 100% βœ… SPEC-040 Phase 1
Series 4 4 100% SPEC-037 Phase 1 βœ…
Search/Discovery 2 2 100% βœ… SPEC-040 Phase 3
Events 6 5 83% ⏸️ Forecast percentile history unimplemented
Structured Targets 2 2 100% βœ… SPEC-040 Phase 3
Portfolio (Read) 6 6 100% βœ… SPEC-040 Phase 2
Portfolio (Orders) 9 9 100% βœ… SPEC-040 Phase 2
Order Groups 5 5 100% βœ… SPEC-040 Phase 4
Subaccounts 4 0 0% 🚫 API blocked (403/404)
RFQ/Communications 11 0 0% Not planned
Milestones & Live Data 4 4 100% βœ… SPEC-040 Phase 4
Multivariate Collections 5 3 60% βœ… SPEC-041 Phase 5 (partial)
Incentive Programs 1 1 100% βœ… SPEC-040 Phase 4
API Keys 4 0 0% Not planned
FCM 2 0 0% Not planned
TOTAL 74 50 68% -

Complete Endpoint Matrix

Legend

Symbol Meaning
βœ… Implemented with golden fixture + tests
πŸ”² Planned - has spec coverage
⬜ Not planned - low priority

1. Exchange & System (4 endpoints)

Endpoint Status Spec Notes
GET /exchange/status βœ… Done get_exchange_status()
GET /exchange/announcements βœ… SPEC-040 Phase 4 get_exchange_announcements()
GET /exchange/schedule βœ… SPEC-040 Phase 4 get_exchange_schedule()
GET /exchange/user_data_timestamp βœ… SPEC-040 Phase 4 get_user_data_timestamp()

2. Markets (5 core endpoints + 6 filter params)

Endpoint Status Spec Notes
GET /markets βœ… Done get_markets(), get_all_markets()
GET /markets/{ticker} βœ… Done get_market()
GET /markets/{ticker}/orderbook βœ… Done get_orderbook()
GET /markets/trades βœ… Done get_trades()
GET /markets/candlesticks βœ… Done get_candlesticks()

Filter Parameters (on GET /markets): βœ… COMPLETE

Parameter Status Spec Notes
status βœ… Done Filter by market status
event_ticker βœ… Done Filter by event
series_ticker βœ… Done Filter by series
tickers βœ… SPEC-040 Phase 1 Batch lookup (comma-separated)
min_*_ts / max_*_ts βœ… SPEC-040 Phase 1 Timestamp filters (6 params)
mve_filter βœ… Done Multivariate filtering

3. Series (4 endpoints) - βœ… COMPLETE

Endpoint Status Spec Notes
GET /series βœ… SPEC-037 Phase 1 get_series_list()
GET /series/{series_ticker} βœ… SPEC-037 Phase 1 get_series()
GET /series/fee_changes βœ… SPEC-037 Phase 1 get_series_fee_changes()
GET /series/{series_ticker}/markets/{ticker}/candlesticks βœ… Done get_series_candlesticks()

4. Search & Discovery (2 endpoints)

Endpoint Status Spec Notes
GET /search/tags_by_categories βœ… SPEC-037 Phase 1 get_tags_by_categories()
GET /search/filters_by_sport βœ… SPEC-040 Phase 3 get_filters_by_sport()

5. Events (6 endpoints)

Endpoint Status Spec Notes
GET /events βœ… Done get_events(), get_all_events()
GET /events/{event_ticker} βœ… Done get_event()
GET /events/multivariate βœ… Done get_multivariate_events*() (MVEs excluded from /events)
GET /events/{event_ticker}/metadata βœ… SPEC-040 Phase 3 get_event_metadata()
GET /series/{series_ticker}/events/{ticker}/candlesticks βœ… SPEC-040 Phase 3 get_event_candlesticks()
GET /series/{series_ticker}/events/{ticker}/forecast_percentile_history ⬜ - πŸ”„ Added Sep 11, 2025 (changelog calls it /forecast_percentiles_history). Auth required + required query params; no validated 200 fixture recorded yet

6. Structured Targets (2 endpoints)

Endpoint Status Spec Notes
GET /structured_targets βœ… SPEC-040 Phase 3 get_structured_targets()
GET /structured_targets/{structured_target_id} βœ… SPEC-040 Phase 3 get_structured_target()

Filter Parameters: - type (e.g., PLAYER_STATS, GAME_EVENT) - competition (e.g., NFL, NBA, EPL) - page_size, cursor


7. Portfolio - Read (6 endpoints)

Endpoint Status Spec Notes
GET /portfolio/balance βœ… Done get_balance()
GET /portfolio/positions βœ… Done get_positions()
GET /portfolio/orders βœ… Done get_orders()
GET /portfolio/fills βœ… Done get_fills()
GET /portfolio/settlements βœ… Done get_settlements()
GET /portfolio/summary/total_resting_order_value βœ… SPEC-040 Phase 2 get_total_resting_order_value() (returns 403 on demo - prod-only permission)

8. Portfolio - Orders (9 endpoints) βœ… COMPLETE

Endpoint Status Spec Notes
POST /portfolio/orders βœ… Done create_order()
DELETE /portfolio/orders/{order_id} βœ… Done cancel_order()
POST /portfolio/orders/{order_id}/amend βœ… Done amend_order()
GET /portfolio/orders/{order_id} βœ… SPEC-040 Phase 2 get_order()
POST /portfolio/orders/batched βœ… SPEC-040 Phase 2 batch_create_orders()
DELETE /portfolio/orders/batched βœ… SPEC-040 Phase 2 batch_cancel_orders()
POST /portfolio/orders/{order_id}/decrease βœ… SPEC-040 Phase 2 decrease_order()
GET /portfolio/orders/{order_id}/queue_position βœ… SPEC-040 Phase 2 get_order_queue_position()
GET /portfolio/orders/queue_positions βœ… SPEC-040 Phase 2 get_orders_queue_positions()

9. Order Groups (5 endpoints)

Endpoint Status Spec Notes
GET /portfolio/order_groups βœ… SPEC-040 Phase 4 get_order_groups()
POST /portfolio/order_groups/create βœ… SPEC-040 Phase 4 create_order_group()
GET /portfolio/order_groups/{order_group_id} βœ… SPEC-040 Phase 4 get_order_group()
DELETE /portfolio/order_groups/{order_group_id} βœ… SPEC-040 Phase 4 delete_order_group()
PUT /portfolio/order_groups/{order_group_id}/reset βœ… SPEC-040 Phase 4 reset_order_group()

10. Subaccounts (4 endpoints) - πŸ”„ REVISIT Q2 2026

Endpoint Status Spec Notes
POST /portfolio/subaccounts ⬜ - OpenAPI exists, but endpoint returned 404 page not found in demo + prod (2026-01-15)
GET /portfolio/subaccounts/balances ⬜ - Demo: 200 empty; Prod: 403 invalid_parameters ("not available in production")
POST /portfolio/subaccounts/transfer ⬜ - OpenAPI exists, but endpoint returned 404 page not found in demo + prod (2026-01-15)
GET /portfolio/subaccounts/transfers ⬜ - Demo: 200 empty; Prod: 403 invalid_parameters ("not available in production")

Blocking reason: Feature added Jan 9, 2026 (per changelog) - only 7 days before testing. Likely in phased rollout / account-permission gated (exact rollout criteria unknown).

Action: Re-check in Q2 2026 or contact Kalshi support to request access.

Note: External fiat/crypto deposits are NOT available via API (use Kalshi web UI).


11. Milestones & Live Data (4 endpoints)

Endpoint Status Spec Notes
GET /milestones βœ… SPEC-040 Phase 4 get_milestones()
GET /milestones/{milestone_id} βœ… SPEC-040 Phase 4 get_milestone()
GET /live_data/{type}/milestone/{milestone_id} βœ… SPEC-040 Phase 4 get_milestone_live_data()
GET /live_data/batch βœ… SPEC-040 Phase 4 get_live_data_batch()

12. Multivariate Collections (5 endpoints)

Endpoint Status Spec Notes
GET /multivariate_event_collections βœ… SPEC-041 Phase 5 get_multivariate_event_collections()
GET /multivariate_event_collections/{collection_ticker} βœ… SPEC-041 Phase 5 get_multivariate_event_collection()
POST /multivariate_event_collections/{collection_ticker} ⬜ - Auth required
GET /multivariate_event_collections/{collection_ticker}/lookup ⬜ - Lookup history (low value)
PUT /multivariate_event_collections/{collection_ticker}/lookup βœ… SPEC-041 Phase 5 lookup_multivariate_event_collection_tickers()

13. RFQ / Communications (11 endpoints) - ❌ INSTITUTIONAL ONLY

Endpoint Status Notes
GET /communications/id ⬜ Large block trades only
GET /communications/rfqs ⬜ Institutional use
POST /communications/rfqs ⬜ Institutional use
GET /communications/rfqs/{rfq_id} ⬜ Institutional use
DELETE /communications/rfqs/{rfq_id} ⬜ Institutional use
GET /communications/quotes ⬜ Institutional use
POST /communications/quotes ⬜ Institutional use
GET /communications/quotes/{quote_id} ⬜ Institutional use
DELETE /communications/quotes/{quote_id} ⬜ Institutional use
PUT /communications/quotes/{quote_id}/accept ⬜ Institutional use
PUT /communications/quotes/{quote_id}/confirm ⬜ Institutional use

Why not planned: RFQ (Request for Quote) is for negotiating large block trades (1000+ contracts) outside the orderbook. Used by market makers, hedge funds, and institutional traders. Not relevant for retail/research automation.

Would implement if: Trading very large positions where orderbook liquidity is insufficient.


14. API Keys (4 endpoints) - ❌ SECURITY RISK

Endpoint Status Notes
GET /api_keys ⬜ Manage via web UI
POST /api_keys ⬜ Manage via web UI
POST /api_keys/generate ⬜ Manage via web UI
DELETE /api_keys/{api_key} ⬜ Manage via web UI

Why not planned: Programmatic API key management is a security risk. Better managed via Kalshi web UI where you have 2FA protection and audit trails.

Would implement if: Building a multi-user service that needs to manage keys programmatically (not our use case).


15. FCM (2 endpoints) - ❌ INSTITUTIONAL ONLY (EXPLICITLY DOCUMENTED)

Endpoint Status Notes
GET /fcm/orders ⬜ FCM members only
GET /fcm/positions ⬜ FCM members only

Why not planned: Per the Kalshi API Changelog:

"This endpoint requires FCM member access level... only intended for use by FCM members (rare)"

FCM = Futures Commission Merchant. These are for broker integrations (Robinhood, Webull) and institutional clearing members. Not applicable to retail traders.

Would implement if: Building a brokerage integration (not our use case).


16. Incentive Programs (1 endpoint)

Endpoint Status Spec Notes
GET /incentive_programs βœ… SPEC-040 Phase 4 get_incentive_programs()

Implementation Priority

P1: Critical Path (SPEC-040 Phase 1–2)

  • Market filters (tickers, min_*_ts / max_*_ts) to avoid the "fetch all" anti-pattern.
  • Order operations (batch create/cancel, get order detail, decrease, queue positions, resting order total value).

P2: Discovery Completeness (SPEC-040 Phase 3)

  • Event metadata and event-level candlesticks.
  • Sports discovery helpers (/search/filters_by_sport, structured targets).
  • (Optional, auth) forecast percentile history.

P3: Operational Nice-to-Have (SPEC-040 Phase 4)

  • Exchange schedule/announcements/user_data_timestamp.
  • Order groups, subaccounts (only if you use them).
  • Milestones/live data and incentive programs (informational / alerts-driven).

Confirmed API Limitations (Platform Design)

These are NOT bugs in our code - they are Kalshi platform limitations:

Limitation Confirmed Via Our Workaround
No keyword/text search OpenAPI has no /search?q=... Sync to local DB β†’ SQL search
MVEs excluded from /events OpenAPI docs Use /events/multivariate (implemented)
No deposits via API OpenAPI - no deposit endpoint Use Kalshi web UI

Spec Coverage

Spec Scope Status
SPEC-040 Complete Kalshi endpoint implementation plan (TDD, SSOT-driven) βœ… Complete (Phases 1-4)
SPEC-029 Strategic endpoint coverage (client + CLI) Superseded by SPEC-040
SPEC-037 SSOT-driven implementation with fixtures Superseded by SPEC-040

All planned endpoints have spec coverage. No new specs required.


Future Tracking: Endpoints to Revisit

These endpoints are tracked for future re-evaluation:

Category Endpoints Blocking Reason Revisit When
Subaccounts 4 New feature (Jan 9, 2026) - not yet available Q2 2026
Forecast percentile history 1 No validated 200 fixture yet (auth + required params) Periodically
Multivariate create/lookup history 2 Low value for solo workflow If needed

GitHub Issues: See issue tracker for individual endpoint tracking.


Cross-References

Item Relationship
SPEC-040 Consolidated endpoint implementation plan
SPEC-029 Superseded strategy doc
SPEC-037 Superseded phase doc
DEBT-015 Original missing endpoints list
FUTURE-002 Blocked/unimplemented endpoint tracker
DEBT-020 Discovery gaps (resolved by this work)
kalshi-api-reference.md SSOT vendor docs