Skip to main content

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 ID
  • KALSHI_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:

  1. Timestamp: Current time in milliseconds
  2. Method: HTTP method (GET, POST, etc.)
  3. Path: API endpoint path
  4. 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:

  1. sync: Blocking request that returns parsed data
  2. sync_detailed: Blocking request that returns full response details
  3. asyncio: Async request that returns parsed data
  4. asyncio_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:

  1. Update the metadata in pyproject.toml (e.g. authors, version).
  2. If you're using a private repository: https://docs.astral.sh/uv/guides/integration/alternative-indexes/
  3. Build a distribution with uv build, builds sdist and wheel by default.
  4. 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:

  1. If that project is using uv, you can simply do uv add <path-to-this-client> from that project
  2. If that project is not using uv:
    1. Build a wheel with uv build --wheel.
    2. Install that wheel from the other project pip install <path-to-wheel>.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kalshi_py-2.0.6.6.tar.gz (75.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kalshi_py-2.0.6.6-py3-none-any.whl (229.4 kB view details)

Uploaded Python 3

File details

Details for the file kalshi_py-2.0.6.6.tar.gz.

File metadata

  • Download URL: kalshi_py-2.0.6.6.tar.gz
  • Upload date:
  • Size: 75.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.2

File hashes

Hashes for kalshi_py-2.0.6.6.tar.gz
Algorithm Hash digest
SHA256 dfa12d4b425f23be11e20e195143622e1936e32d7e47beffbbdfe17dd18f62eb
MD5 3c9276631e91765959efb4250d7aed2d
BLAKE2b-256 4c57c494e2b371d02b409cd2b60d6623e40d7d142a3789875ab6c8bc8bf7c591

See more details on using hashes here.

File details

Details for the file kalshi_py-2.0.6.6-py3-none-any.whl.

File metadata

File hashes

Hashes for kalshi_py-2.0.6.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0b326eb7b93342e3c5e791a5c474f61f3a94650119bb678dd1356f05f5d8ac07
MD5 69895db2cbb7a2476a829d2bbbdbc504
BLAKE2b-256 c72ea23baf5185c208dfc68c45d330a356218753f310e8bc750e041aeacf5329

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page