Skip to main content

parlayx

Official Python client for the ParlayX public API, a single trading interface over aggregated prediction markets.

Documentation

Full guides, authentication, and API reference live at docs.parlayx.com.

Install

pip install parlayx

Requires Python 3.11 or newer. Requests are signed with your Ed25519 key, so the client runs server-side: the private key stays in your own process and only the key id, a timestamp, and the signature go on the wire.

Usage

from parlayx import ParlayX

with ParlayX.from_env() as client:
    who = client.whoami()
    competitions = client.list_competitions(sport="spt_baseball")
    balance = client.kalshi.get_balance()

from_env() reads PARLAYX_KEY_ID and PARLAYX_PRIVATE_KEY_HEX; pass them to ParlayX(...) directly if you load them another way.

Orders, positions and balances are venue-scoped, because the venues address markets differently:

from parlayx import KalshiOrderRequest

order = client.kalshi.submit_order(
    KalshiOrderRequest(
        ticker="KXMLBGAME-26SEP01-NYY",
        side="YES",
        action="BUY",
        count=10,
        price_cents=45,
    )
)
print(order.order_id, order.status)

Fields accept either spelling: price_cents or priceCents. The wire always carries the API's own camelCase.

Each of client.polymarket and client.kalshi carries the same seven methods: submit_order, list_orders, get_order, cancel_order, get_order_fills, list_positions and get_balance.

Idempotency

submit_order attaches a fresh idempotency key per call, so retrying a call that failed submits a second order. Pass your own key to make a specific retry safe:

client.kalshi.submit_order(order, idempotency_key="my-retry-key")

Errors

Every non-2xx response raises RequestError, carrying a stable code, the HTTP status, a message and the parsed body:

from parlayx import ApiErrorCode, RequestError

try:
    client.polymarket.get_balance()
except RequestError as error:
    if error.code == ApiErrorCode.insufficient_balance:
        ...

Pagination

Order listings are cursored. The paginators follow nextPageToken to exhaustion:

from parlayx import paginate_kalshi_orders

for order in paginate_kalshi_orders(client, status="OPEN"):
    print(order.order_id, order.status)

Positions and fills are not cursored and return their full result in one call.

Async

AsyncParlayX is the same surface with await, and apaginate_kalshi_orders and apaginate_polymarket_orders are the async paginators:

from parlayx import AsyncParlayX

async with AsyncParlayX.from_env() as client:
    who = await client.whoami()

Market data stream

The stream is a separate import and needs the extra:

pip install "parlayx[stream]"

It authenticates with the same signing key, re-signing the handshake on every connect, and replays your subscriptions across reconnects so you subscribe once:

from parlayx.stream import StreamClient

async with StreamClient.from_env() as stream:
    await stream.subscribe([{"venue": "polymarket", "tokenId": "97840505..."}])
    async for frame in stream:
        if frame.type == "snapshot":
            print(frame.seq, frame.bids[:3], frame.asks[:3])
        elif frame.type == "delta":
            for change in frame.changes:
                ...  # size 0 removes the level, anything else sets it

channels defaults to ["book"]; pass ["book", "trade"] for the trade tape as well.

Connection lifecycle is reported through callbacks rather than frames, because it describes the connection rather than the market:

StreamClient.from_env(
    on_reconnecting=lambda event: log.info("reconnecting, attempt %s", event.attempt),
    on_terminated=lambda event: log.warning("stream stopped: %s", event.reason),
    on_unparseable=lambda raw: log.warning("dropped an unrecognised frame: %s", raw),
)

A terminated stream does not reconnect; build a new client to resume.

One inconsistency worth knowing

Discovery listings report venue in uppercase (KALSHI, POLYMARKET), while the order and streaming surfaces take it lowercase. The client passes the value through unchanged in both directions rather than quietly rewriting it.

License

MIT. See LICENSE.

Download files

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

Source Distribution

parlayx-0.0.0.tar.gz (27.8 kB view details)

Uploaded Source

Built Distribution

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

parlayx-0.0.0-py3-none-any.whl (34.2 kB view details)

Uploaded Python 3

File details

Details for the file parlayx-0.0.0.tar.gz.

File metadata

  • Download URL: parlayx-0.0.0.tar.gz
  • Upload date:
  • Size: 27.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for parlayx-0.0.0.tar.gz
Algorithm Hash digest
SHA256 9407e8ea08b6b350a733ae55d05f247cda2d0de9dd447a495f9ddc817ea92d54
MD5 de8f11d02902158042be58275eef014c
BLAKE2b-256 47fe8c6563768acd6101a4864fcb0b73deafef271d14b798cf1fcb39a8ab67f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for parlayx-0.0.0.tar.gz:

Publisher: release-python-sdk.yml on parlayx/aggregator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file parlayx-0.0.0-py3-none-any.whl.

File metadata

  • Download URL: parlayx-0.0.0-py3-none-any.whl
  • Upload date:
  • Size: 34.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for parlayx-0.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7ca6872352c751f444b8e040e89dd9ad8f35533260d785f03b52db00d9a599bd
MD5 cf5730dc119b5fb41a0cf964fee6a85c
BLAKE2b-256 fb7316838acc04048887b665112f0720c27cd9ea3378cc8fc7be7ea63ba4bc3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for parlayx-0.0.0-py3-none-any.whl:

Publisher: release-python-sdk.yml on parlayx/aggregator

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.1.0

2 files

1.0.0

2 files

This release

0.0.0 This release

2 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