Polymarket US Python SDK

Official SDK for Polymarket US - installs as polymarket-us, unreleased since January.

by Polymarket

Last updated

US persons
Yes
Taker fee
None
Settlement
Cash
Liquidity
CLOB

What it is

Polymarket's own Python SDK for Polymarket US, the CFTC-designated exchange run by QCX LLC, which is a different venue and a different API from the on-chain Polymarket most readers arrive from. Installing it is pip install polymarket-us; the repository is Polymarket/polymarket-us-python and the README calls it the official SDK.

The client is thin and modern: httpx for transport, pynacl for Ed25519 signing, websockets for streams, Python 3.10 or newer, MIT-licensed with the LICENSE file in the repository and the classifier on PyPI agreeing. Both a synchronous PolymarketUS and an asynchronous AsyncPolymarketUS are exported from the same package.

What it reaches:

  • Reads with no credential. Events (list, by id, by slug), markets (list, by id, by slug, order book, best bid and offer, settlement price), series, sports and teams, and a search endpoint that returns events with their markets nested.
  • Orders. create, list, retrieve, modify, cancel, cancel_all, preview and close_position. Orders are typed the way the exchange types them - an intent (ORDER_INTENT_BUY_LONG), an order type, a price with an explicit currency, a quantity and a time in force.
  • Account. Positions and activity history through portfolio, and balances through account.
  • Streams. ws.markets() for order book and trade updates, ws.private() for order, position and balance events. Both are async only.

Two details are better than most SDKs manage. Idempotent requests are retried with exponential backoff and jitter on connection errors, timeouts and 408/409/429/5xx, while order placement is never retried automatically - so a network blip cannot submit the same order twice. And every request carries a generated correlation id that is attached to the exception when one is raised, which is what you quote to support.

Availability

The package imposes nothing. It installs from PyPI anywhere pip works and the read endpoints need no credential at all.

The credential does impose something. API keys are issued from the developer page of a Polymarket US account, and Polymarket US is a US exchange that requires identity verification before it will let anyone trade - see polymarket-us for who may open one. This card's us_persons and kyc_required flags describe the library, which grants no access and blocks none.

Pricing

Free and MIT-licensed. Nothing to buy, nothing metered, no key tiers. What a fill costs is the exchange's fee schedule and belongs on polymarket-us.

Markets & resolution

An SDK resolves nothing. Orders placed through it rest on the Polymarket US order book and settle in dollars against the exchange's own determination; who decides an outcome is a question about the venue and is answered on its card.

One structural difference from Polymarket's on-chain stack is worth knowing before you write against either. Here the tradeable unit is a market slug - markets.book("btc-100k"), orders.create({"marketSlug": ...}) - not a token id, and there is no wallet, no allowance and no on-chain approval step in the way. The signing key is an exchange API credential, so the whole class of Polygon approval failures that catches new users of py-clob-client does not exist on this side.

Integrations

Three runtime dependencies - httpx, pynacl, websockets. That is the whole surface: a signing client, not a framework. There is no CLI, no MCP server and no strategy layer.

Polymarket publishes a TypeScript twin, polymarket-us-typescript, in the same GitHub organisation and under the same licence, last touched on the same day as this one. If you want the same exchange from several languages, that is the other half; nothing else here is generated from a shared specification the public can see.

Limitations

The released package is eight months behind the repository. PyPI has exactly two releases, 0.1.1 and 0.1.2, both uploaded on 2026-01-22, and there are no GitHub releases or tags at all. Since then main has taken a retry, user-agent and correlation-id change (2026-06-02) and a fix correcting the order-snapshot subscription types (2026-09-17). Everything described above as "better than most SDKs manage" is in the repository; only some of it is in the wheel you install. Install from git if you need the fixes.

It is version 0.1.2 and labelled Beta, by its own classifier. Two people from Polymarket have committed to it, issue traffic is negligible, and there is no changelog.

No paper trading, no sandbox in the SDK. orders.preview prices an order without submitting it, which is not the same thing.

WebSockets are async only, including from the synchronous client, so a purely synchronous program has to reach for asyncio.run to receive anything.

It is single-venue by construction. Polymarket US markets, Polymarket US credentials, and nothing about the on-chain exchange that shares the name.

Alternatives

For the on-chain Polymarket rather than the US exchange, the current official client is polymarket-client; py-clob-client is the archived predecessor and should not be started from.

For several venues behind one interface, ccxt and pmxt both carry Polymarket US among others, at the usual cost of reading somebody else's translation of the exchange instead of the exchange.

If you only want prices, the exchange's REST endpoints answer unauthenticated and need no library at all.

Specs

Interfaces
API, websocket, Python
Export
JSON
Available in
Global
KYC required
No
Market subjects
Resolved by
Resolves nothing
Maker fee
None
Platforms
Library
AI features
None
Capabilities
Order book, Automation, Live trading, Portfolio tracking
Pricing verified
Availability verified
Capabilities verified

Also from Polymarket

Background

How this part of the sector works, rather than which product to pick.

  • What running a bot does not solveA bot fixes speed and consistency. Rate limits, a missing rehearsal, a field that stops arriving, a partial fill and a paused market are not coding problems.
  • Where your key lives when software trades for youFour different credentials are all called a key, and they differ in what a copy permits. What the clients in this catalogue ask for, and what to ask them back.

Also worth comparing

  • Kalshi Python SDK (sync and async)Kalshi's current official Python client - weekly releases, Python 3.13 only, no source.
  • kalshi-pythonKalshi's own generated Python client - closed-source, and unreleased since September 2025.
  • pykalshiUnofficial Kalshi client with what the generated SDK leaves out - streams and retries.
  • CCXTOne client for seven prediction venues, inside a 104-exchange crypto library.
  • limitless-sdkLimitless Exchange's own async Python SDK - CLOB and NegRisk orders, WebSocket, MIT.
  • PMXTCCXT-shaped client for prediction markets, with a hosted API and a self-hosted mode.

FAQ

What is the package called on PyPI?

polymarket-us. The import is polymarket_us and the repository is Polymarket/polymarket-us-python. It is a different product from polymarket-client, which is Polymarket's SDK for the global on-chain exchange and speaks to a different API entirely.

Is the PyPI package current?

No. Version 0.1.2 was uploaded on 2026-01-22 and nothing has been published since, while the repository's main branch carries two later commits - an HTTP retry, user-agent and correlation-id change on 2026-06-02 and a fix to the order-snapshot subscription types on 2026-09-17. A pip install today gets the January code.

Does it hold my private key?

It holds a Polymarket US API credential - a key id and a base64-encoded Ed25519 secret key, issued from the developer page of a Polymarket US account. Requests are signed in process. There is no wallet key and no on-chain signing, because the US exchange settles in dollars rather than on Polygon.

Does it stream, or do I have to poll?

It streams. The SDK ships two WebSocket connections - a markets channel for order book updates and trades, and a private channel for orders, positions and balances. Both are async only, even when the rest of your code uses the synchronous client.