Skip to main content

Probalytics Python Client

Python client for Probalytics market data. Use it to query markets, fills, and orderbook snapshots directly from ClickHouse and return results as Polars or pandas dataframes.

Installation

pip install probalytics

The client requires Python 3.11 or newer.

Polars support is included by default. To use frame="pandas", install the pandas extra:

pip install "probalytics[pandas]"

Connect

from probalytics import ProbalyticsClient

client = ProbalyticsClient.from_clickhouse(
    host="clickhouse.probalytics.io",
    username="your_username",
    password="your_password",
)

By default, the client connects securely to the probalytics database. If your account uses a custom host, port, or database, pass those values when creating the client.

client = ProbalyticsClient.from_clickhouse(
    host="clickhouse.probalytics.io",
    port=9440,
    database="probalytics",
    username="your_username",
    password="your_password",
    secure=True,
    frame="polars",
)

You can also configure the client from environment variables:

export PROBALYTICS_CLICKHOUSE_USERNAME="your_username"
export PROBALYTICS_CLICKHOUSE_PASSWORD="your_password"
export PROBALYTICS_CLICKHOUSE_HOST="clickhouse.probalytics.io"
export PROBALYTICS_FRAME="pandas"
client = ProbalyticsClient.from_env()

Use the client as a context manager when you want the connection closed automatically:

with ProbalyticsClient.from_env() as client:
    markets = client.markets(platform="POLYMARKET", status="ACTIVE")

Query Markets

Markets are returned as typed Pydantic models.

markets = client.markets(
    market_platform_id="0xmarket",
    platform="POLYMARKET",
    status="ACTIVE",
    limit=100,
)

market = markets[0]
print(market.title)
print(market.platform)
print(market.platform_id)

You can also return markets as a dataframe.

markets_df = client.markets_frame(
    platform="KALSHI",
    status="ACTIVE",
    frame="polars",
)

Filters such as platform and status accept either one value or a list of values.

markets = client.markets(
    market_platform_id=["0xmarket", "KXBTC-26JUN-T50000"],
    platform=["POLYMARKET", "KALSHI"],
    status=["ACTIVE", "PAUSED"],
)

Query Fills

Fills return as a Polars dataframe by default.

fills = client.fills(
    market=market,
    start_time="2026-03-15T00:00:00Z",
    end_time="2026-03-16T00:00:00Z",
)

Use market, market_id, or market_platform_id to scope fills to one or more markets. A full market object is the most convenient option when you already loaded markets first.

fills = client.fills(market=market)
fills = market.fills()
fills = client.fills(market_id=market.id)
fills = client.fills(market_platform_id=market.platform_id, platform=market.platform)

market_id, market_platform_id, platform, taker_side, and trader_id also accept lists.

fills = client.fills(
    platform=["POLYMARKET", "KALSHI"],
    market_platform_id=["0xmarket", "KXBTC-26JUN-T50000"],
    taker_side=["BUY", "SELL"],
    start_time="2026-03-15T00:00:00Z",
)

Use a market selector or a bounded time range when querying fills. This keeps queries fast and avoids scanning more data than you need.

Filter by participant or taker side:

fills = client.fills(
    market=market,
    trader_id="0x1234...",
    taker_side="BUY",
    start_time="2026-03-15T00:00:00Z",
)

If you need typed fill models instead of a dataframe:

fill_models = client.fills_models(
    market=market,
    start_time="2026-03-15T00:00:00Z",
)

fill_models = market.fills_models(
    start_time="2026-03-15T00:00:00Z",
)

Query Orderbook Snapshots

Orderbook snapshots are available for accounts with orderbook access.

book = client.orderbook_snapshots(
    market=market,
    start_time="2026-03-15T00:00:00Z",
    end_time="2026-03-15T00:01:00Z",
)

book = market.orderbook_snapshots(
    start_time="2026-03-15T00:00:00Z",
    end_time="2026-03-15T00:01:00Z",
)

Each snapshot is a complete replacement book for one outcome. Rows include indexed_at, hash, state, continuity, and path_index in addition to the market identifiers, outcome, bids, asks, and source timestamp.

Use state="VERIFIED" when you only need books reconstructed without gaps. Use continuity separately to distinguish rows connected to the preceding published state from fresh starting points.

Choose Polars or pandas

All dataframe methods return Polars by default. Set frame="pandas" when creating the client to use pandas globally. pandas support is optional; install it with pip install "probalytics[pandas]".

client = ProbalyticsClient.from_clickhouse(
    host="clickhouse.probalytics.io",
    username="your_username",
    password="your_password",
    frame="pandas",
)

You can also override the frame for a single call.

fills_pd = client.fills(
    market=market,
    start_time="2026-03-15T00:00:00Z",
    frame="pandas",
)

Invalid frame values fail early with a clear error. Supported values are "polars" and "pandas".

Run Custom SQL

Use query() for read-only ClickHouse queries when the convenience methods do not cover your use case.

df = client.query(
    """
    SELECT platform, count() AS fills
    FROM fills
    WHERE timestamp >= %(start_time)s
    GROUP BY platform
    ORDER BY fills DESC
    """,
    parameters={"start_time": "2026-03-15T00:00:00Z"},
)

Always pass user-provided values through parameters instead of formatting them directly into SQL strings.

Supported Filters

markets() and markets_frame() support:

  • start_time
  • end_time
  • status or list of statuses
  • platform or list of platforms
  • market_id or list of market IDs
  • market_platform_id or list of market platform IDs
  • limit
  • max_rows

fills() and fills_models() support:

  • start_time
  • end_time
  • platform or list of platforms
  • market
  • market_id or list of market IDs
  • market_platform_id or list of market platform IDs
  • taker_side or list of taker sides
  • trader_id or list of trader IDs
  • limit
  • max_rows

orderbook_snapshots() supports:

  • start_time
  • end_time
  • platform or list of platforms
  • market
  • market_id or list of market IDs
  • market_platform_id or list of market platform IDs
  • state or list of states
  • continuity or list of continuity values
  • limit

Local Development

uv sync --extra test
uv run --extra test pytest

Run the ClickHouse integration tests with Docker:

PROBALYTICS_RUN_INTEGRATION=1 uv run --extra test pytest tests/test_clickhouse_integration.py

Use PYTHONPATH=src if running tests without installing the package into the active environment.

Metadata

Release files for probalytics 0.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for probalytics 0.2.1
File Size Uploaded
probalytics-0.2.1.tar.gz 18.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for probalytics 0.2.1
File Interpreter ABI Platform
probalytics-0.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 34.7 kB

Release files / probalytics-0.2.1.tar.gz

Download URL probalytics-0.2.1.tar.gz
Size 18.9 kB
Tags Source
SHA-256 checksum
How to use checksums
9ce6b41cbd9b92f90fde2923ad3b6be055defe1eb048cfcd4e91485abe072aac
BLAKE2b-256 checksum
How to use checksums
3d9e9d0f2f27bbd09d5ee1e0f0e8113c91d30ac01bf6a97f812b5d9efe3a65e6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release files / probalytics-0.2.1-py3-none-any.whl

Download URL probalytics-0.2.1-py3-none-any.whl
Size 15.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7c594f6f3a18b7219a8eb7b509534932c5bf75c2a33031b479fe5252cd84a7e5
BLAKE2b-256 checksum
How to use checksums
6b9fa5860957799a103092168b8c99e019463727b0f3aea063af693a576e2627
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 3, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.1 This release

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page