Kalshi Python SDK (sync and async)

Kalshi's current official Python client - weekly releases, Python 3.13 only, no source.

by Kalshi

Last updated

US persons
Yes
Taker fee
None
Settlement
Cash
Liquidity
CLOB

What it is

Kalshi's current official Python client, and the reason the older kalshi-python card is a dead end. It ships as two packages built from the same specification - kalshi_python_sync and kalshi_python_async - and Kalshi's SDK documentation names both, adds a TypeScript sibling on npm (kalshi-typescript), and says in as many words that the old kalshi-python package is deprecated.

It is generated code, and it does not pretend otherwise: the README inside the wheel is the OpenAPI Generator's template, naming generator version 7.17.0 and API version 3.30.0. The package metadata carries Kalshi's support address as the author email, which is the strongest evidence available that this is the exchange's own publication - the homepage it lists, github.com/Kalshi/exchange-infra, is not readable by the public.

Inside are seventeen API modules covering what the exchange does: markets, events, orders, order groups, portfolio, account, exchange status, historical data, live data, multivariate contracts, milestones, structured targets, search, communications, incentive programs, API keys and FCM. Six runtime dependencies - urllib3, python-dateutil, pydantic, typing-extensions, lazy-imports and cryptography, the last of which does the request signing.

Release cadence is the best thing about it. Thirty-one versions since 3.0.0 on 2025-12-02, the latest 3.30.0 on 2026-09-15, and Kalshi's documentation says releases track the OpenAPI specification and generally go out on a Tuesday or Wednesday, ahead of the corresponding API change. Compare that with the package it replaced, which has not shipped since September 2025.

Availability

The library imposes nothing and installs anywhere pip works - subject to Python 3.13.

The credential does the gating. Authentication is an API key id plus an RSA private key, with RSA-PSS request signing, and the key comes from a funded Kalshi account. Who may open one is a question about the exchange, answered on kalshi; the flags on this card describe the package, which grants no access and blocks none.

Pricing

Free to install, and the exchange does not charge for API access. The licence is not free in the other sense: the published metadata says LicenseRef-Proprietary, so this is a package you may install and use, not one you may fork, vendor or relicense. If you need code you own, Kalshi's own documentation tells you to generate your own client from its specifications.

What a fill costs is Kalshi's fee schedule, which lives on the venue's card.

Markets & resolution

A client resolves nothing. Orders placed through it rest on Kalshi's order book and settle in dollars against the exchange's determination, and the questions reachable through it are whatever Kalshi lists. Prices are in cents over the wire - the generated examples divide balances by 100 - which is the one data-model detail that bites first.

Integrations

REST only. There is no WebSocket client in either package, no CLI and no MCP server; anything live has to be written against Kalshi's separate streaming specification by hand. The TypeScript package kalshi-typescript is the same generated family in another language, published by the same account and at the same version, and its npm metadata carries an OpenAPI Generator default licence rather than a considered one.

For a Python client that does stream, and that you may read, pykalshi is the third-party answer.

Limitations

Python 3.13 or nothing. The requirement is in the package metadata, and it rules out most production images in use today. Nothing on the package page explains why a generated REST client needs the newest interpreter.

No WebSocket. The whole streaming half of the Kalshi API is outside these packages.

No public source repository. The link in the metadata 404s, and the licence is proprietary, so the answer to "what does this do with my key" comes from reading the installed wheel rather than a repository, a changelog or an issue tracker. There is no issue tracker.

Kalshi says it may lag. Its documentation tells active traders to treat the REST OpenAPI and WebSocket AsyncAPI specifications as the source of truth and, for production, to generate their own client or integrate directly. That is unusually honest, and it is also a recommendation not to depend on this package.

Generated ergonomics. Model names track the specification, not the way a trader thinks; there are no domain objects, no local order book, no dataframe helpers and no retry policy of its own.

The documentation host was not reachable from here. The deprecation notice, the RSA-PSS detail and the release cadence above were read in the Internet Archive's capture of Kalshi's SDK overview page dated 2026-07-09, because the live host refused every automated request we made on 2026-09-19. The package facts - versions, dates, dependencies, module list, licence field, Python floor - come from PyPI and from the wheel itself, both read on 2026-09-19.

Alternatives

pykalshi is the maintained third-party client: MIT, WebSocket streaming, a local order book, pandas output, Python 3.9 and up.

ccxt and pmxt reach Kalshi among several venues, if one integration across exchanges matters more than exchange-shaped errors.

kalshi-python is the deprecated package this one replaces, and kalshi-api is the API underneath all of them, which you can call with plain HTTP if a generated client is not worth 3.13.

Specs

Interfaces
API, Python
Export
JSON
Available in
Global
KYC required
No
Market subjects
Resolved by
Resolves nothing
Maker fee
None
Platforms
Library
AI features
None
Capabilities
Order book, Automation, Live trading, Portfolio tracking
Pricing verified
Availability verified
Capabilities verified

Also from Kalshi

Background

How this part of the sector works, rather than which product to pick.

  • What running a bot does not solveA bot fixes speed and consistency. Rate limits, a missing rehearsal, a field that stops arriving, a partial fill and a paused market are not coding problems.
  • Where your key lives when software trades for youFour different credentials are all called a key, and they differ in what a copy permits. What the clients in this catalogue ask for, and what to ask them back.

Also worth comparing

  • Polymarket US Python SDKOfficial SDK for Polymarket US - installs as polymarket-us, unreleased since January.
  • Polymarket US TypeScript SDKOfficial TypeScript client for Polymarket US - npm has shipped nothing since January.
  • pykalshiUnofficial Kalshi client with what the generated SDK leaves out - streams and retries.
  • CCXTOne client for seven prediction venues, inside a 104-exchange crypto library.
  • limitless-sdkLimitless Exchange's own async Python SDK - CLOB and NegRisk orders, WebSocket, MIT.
  • PMXTCCXT-shaped client for prediction markets, with a hosted API and a self-hosted mode.

FAQ

Which Kalshi Python package should I install?

kalshi_python_sync or kalshi_python_async. Kalshi's SDK documentation marks the older kalshi-python package as deprecated. Both current packages were at 3.30.0 on 2026-09-15; the older one stopped at 2.1.4 on 2025-09-06.

Why does it refuse to install?

Most often the Python version. The published metadata requires Python 3.13 or newer - not 3.12 - which is stricter than almost anything else in this category and stricter than the deprecated package it replaces, which accepted 3.9.

Can I stream order book updates with it?

No. These packages are generated from the REST specification and ship no WebSocket client; the seventeen API modules inside are all HTTP. Kalshi documents its streaming API through a separate AsyncAPI specification, and you write that client yourself or use a third-party one.

Is the source public?

Not as far as we can see. The package metadata points at github.com/Kalshi/exchange-infra, which returns 404 to an unauthenticated request, and the licence field reads LicenseRef-Proprietary. What you can read is the generated Python inside the wheel.