A client library for accessing Kalshi Trade API
Project description
kalshi-py
A client library for accessing Kalshi Trade API
📚 Documentation - Complete API reference, examples, and guides
Installation
pip install kalshi-py
Usage
Basic Usage (Public Endpoints)
For public endpoints that don't require authentication:
from kalshi_py import Client
client = Client(base_url="https://api.elections.kalshi.com/trade-api/v2")
from kalshi_py.api.market import get_markets
response = get_markets.sync(client=client, limit=10)
print(f"Found {len(response.markets)} markets")
Authenticated Usage (Trading Endpoints)
For trading endpoints that require authentication, use the Kalshi-specific authenticated client:
from kalshi_py import create_client
# Using environment variables ("KALSHI_API_KEY_ID" and "KALSHI_PY_PRIVATE_KEY_PEM")
client = create_client()
# Or with file path
client = create_client(
access_key_id="your-access-key-id",
private_key_path="/path/to/your/private-key.pem"
)
# Or with PEM data directly
client = create_client(
access_key_id="your-access-key-id",
private_key_data="-----BEGIN PRIVATE KEY-----\n..."
)
from kalshi_py.api.portfolio import get_balance
balance = get_balance.sync(client=client)
print(f"Account balance: {balance.balance}")
Direct Client Usage
You can also create the authenticated client directly if you prefer:
from kalshi_py import KalshiAuthenticatedClient
# Direct usage requires explicit credentials
client = KalshiAuthenticatedClient(
access_key_id="your-access-key-id",
private_key_pem="-----BEGIN PRIVATE KEY-----\n..."
)
from kalshi_py.api.portfolio import get_balance
balance = get_balance.sync(client=client)
print(f"Account balance: {balance.balance}")
Environment Variables
You can set the following environment variables to avoid passing credentials explicitly:
KALSHI_API_KEY_ID: Your Kalshi access key IDKALSHI_PY_PRIVATE_KEY_PEM: Your RSA private key in PEM format
API Endpoints
The client supports both synchronous and asynchronous operations:
from kalshi_py import create_client
from kalshi_py.api.market import get_markets
from kalshi_py.api.portfolio import get_balance
# Synchronous usage
client = create_client()
markets = get_markets.sync(client=client, limit=5)
balance = get_balance.sync(client=client)
# Asynchronous usage
import asyncio
async def main():
client = create_client()
markets = await get_markets.asyncio(client=client, limit=5)
balance = await get_balance.asyncio(client=client)
asyncio.run(main())
Authentication Details
The Kalshi API uses RSA-PSS signature authentication. Each request is signed with:
- Timestamp: Current time in milliseconds
- Method: HTTP method (GET, POST, etc.)
- Path: API endpoint path
- Signature: RSA-PSS signature of
timestamp + method + path
The client automatically handles:
- Loading your private key from file
- Generating timestamps
- Creating signatures for each request
- Adding required headers (
KALSHI-ACCESS-KEY,KALSHI-ACCESS-SIGNATURE,KALSHI-ACCESS-TIMESTAMP)
Legacy Bearer Token Authentication
If you need to use the legacy bearer token authentication (not recommended for trading):
from kalshi_py import AuthenticatedClient
client = AuthenticatedClient(
base_url="https://api.elections.kalshi.com/trade-api/v2",
token="your-bearer-token"
)
Advanced Customizations
Custom SSL Configuration
client = create_client(
verify_ssl="/path/to/certificate_bundle.pem"
)
# Or disable SSL verification (not recommended for production)
client = create_client(verify_ssl=False)
Custom Headers and Timeouts
import httpx
client = create_client(
timeout=httpx.Timeout(30.0),
headers={"User-Agent": "MyApp/1.0"}
)
Request Logging
def log_request(request):
print(f"Request: {request.method} {request.url}")
def log_response(response):
print(f"Response: {response.status_code}")
client = create_client(
httpx_args={
"event_hooks": {
"request": [log_request],
"response": [log_response]
}
}
)
API Structure
Every API endpoint becomes a Python module with four functions:
sync: Blocking request that returns parsed datasync_detailed: Blocking request that returns full response detailsasyncio: Async request that returns parsed dataasyncio_detailed: Async request that returns full response details
All path/query parameters and request bodies become function arguments.
Building / Publishing this package
This project uses uv to manage dependencies and packaging. Here are the basics:
- Update the metadata in
pyproject.toml(e.g. authors, version). - If you're using a private repository: https://docs.astral.sh/uv/guides/integration/alternative-indexes/
- Build a distribution with
uv build, buildssdistandwheelby default. - Publish the client with
uv publish, see documentation for publishing to private indexes.
If you want to install this client into another project without publishing it (e.g. for development) then:
- If that project is using uv, you can simply do
uv add <path-to-this-client>from that project - If that project is not using uv:
- Build a wheel with
uv build --wheel. - Install that wheel from the other project
pip install <path-to-wheel>.
- Build a wheel with
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kalshi_py-2.0.6.5.tar.gz.
File metadata
- Download URL: kalshi_py-2.0.6.5.tar.gz
- Upload date:
- Size: 75.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c9d1f7ed58c38056d2a34677b10f224359dd95354acacc8402a188575a5ecc5
|
|
| MD5 |
00e7f534fe39129d281cc93e090cfbf6
|
|
| BLAKE2b-256 |
8c35cd9beb8c934a1aeaaaeac50b7617bc3cf01ae20092d9afb99db53961105c
|
File details
Details for the file kalshi_py-2.0.6.5-py3-none-any.whl.
File metadata
- Download URL: kalshi_py-2.0.6.5-py3-none-any.whl
- Upload date:
- Size: 229.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f4ea8a2d5a4b5ebdd44370cd6e292a3b8b139eb330ba87f29990f429f57269f6
|
|
| MD5 |
d42d0801f56650b52f32dc6450106c4f
|
|
| BLAKE2b-256 |
755108e69e8b98f3da6c1fb4903f4b9df89079fbcc403fe97ceba771a952ac1b
|