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
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 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9407e8ea08b6b350a733ae55d05f247cda2d0de9dd447a495f9ddc817ea92d54
|
|
| MD5 |
de8f11d02902158042be58275eef014c
|
|
| BLAKE2b-256 |
47fe8c6563768acd6101a4864fcb0b73deafef271d14b798cf1fcb39a8ab67f2
|
Provenance
The following attestation bundles were made for parlayx-0.0.0.tar.gz:
Publisher:
release-python-sdk.yml on parlayx/aggregator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
parlayx-0.0.0.tar.gz -
Subject digest:
9407e8ea08b6b350a733ae55d05f247cda2d0de9dd447a495f9ddc817ea92d54 - Sigstore transparency entry: 2743870226
- Sigstore integration time:
-
Permalink:
parlayx/aggregator@2344cfff9b2ac720a930026e5357c7ce8c138247 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/parlayx
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python-sdk.yml@2344cfff9b2ac720a930026e5357c7ce8c138247 -
Trigger Event:
workflow_dispatch
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7ca6872352c751f444b8e040e89dd9ad8f35533260d785f03b52db00d9a599bd
|
|
| MD5 |
cf5730dc119b5fb41a0cf964fee6a85c
|
|
| BLAKE2b-256 |
fb7316838acc04048887b665112f0720c27cd9ea3378cc8fc7be7ea63ba4bc3d
|
Provenance
The following attestation bundles were made for parlayx-0.0.0-py3-none-any.whl:
Publisher:
release-python-sdk.yml on parlayx/aggregator
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
parlayx-0.0.0-py3-none-any.whl -
Subject digest:
7ca6872352c751f444b8e040e89dd9ad8f35533260d785f03b52db00d9a599bd - Sigstore transparency entry: 2743870230
- Sigstore integration time:
-
Permalink:
parlayx/aggregator@2344cfff9b2ac720a930026e5357c7ce8c138247 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/parlayx
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python-sdk.yml@2344cfff9b2ac720a930026e5357c7ce8c138247 -
Trigger Event:
workflow_dispatch
-
Statement type: