Polymarket US API (2026): Keys, Endpoints and Rate Limits

The Short Answer
The Polymarket US API comes in two parts: a public API at gateway.polymarket.us that serves market data with no key, and an authenticated API at api.polymarket.us for orders, positions, balances and WebSocket streams. To trade, you verify your identity in the Polymarket US app, create a Key ID and Secret Key at polymarket.us/developer, and sign each request with that Ed25519 key. Both APIs allow 20 requests a second, per key for authenticated calls and per IP for public ones, and official Python and TypeScript SDKs handle the signing for you.
Key Takeaways
- Polymarket US is a separate exchange from global Polymarket, with its own accounts, markets, documentation and API.
- Market data needs no key. Trading needs identity verification in the app and a Key ID and Secret Key from the developer portal.
- Requests are signed with Ed25519 over the timestamp, method and path, and timestamps must be within 30 seconds of server time.
- The limit is 20 requests a second per API key, and 20 per IP on public endpoints. WebSockets are the way to avoid polling.
- The official SDK is
polymarket-uson both PyPI and npm, and it covers events, markets, orders, portfolio and account endpoints.
How is the Polymarket US API different from Polymarket's?
Polymarket US is the regulated version of Polymarket for US traders, explained in what Polymarket US is, and it runs on a separate stack. Nothing from the global Polymarket API carries over: there is no wallet, no CLOB credential and no Polygon transaction. Accounts hold US dollars at the exchange, and markets are addressed by slug.
| Polymarket | Polymarket US | |
|---|---|---|
| APIs | Gamma, CLOB and Data APIs | A public gateway and an authenticated API |
| Authentication | A wallet plus CLOB credentials derived from it | An Ed25519 Key ID and Secret Key from the developer portal |
| Collateral | pUSD on Polygon | US dollars held at the exchange |
| Market identifiers | Condition IDs and token IDs | Market slugs |
| Official SDKs | @polymarket/client and polymarket-client | polymarket-us for Python and TypeScript |
If you also build on global Polymarket, the Polymarket API guide covers that side.
How do you get a Polymarket US API key?
- Create an account in the Polymarket US app and complete identity verification. You need approval before you can trade or use the API.
- Open the developer portal at
polymarket.us/developerand sign in with the same method you used in the app: Apple, Google or email. - Create an API key. You get a Key ID and a Secret Key, and the secret is shown only once, so store it immediately.
Polymarket's documentation warns that switching between sign-in methods may break your API key access, and that you can email support if you need help or an invite code. Revoke a compromised key from the same portal.
How does authentication work?
Every authenticated request carries three headers:
| Header | Value |
|---|---|
X-PM-Access-Key | Your Key ID |
X-PM-Timestamp | The current time in milliseconds |
X-PM-Signature | An Ed25519 signature of the timestamp, method and path, base64-encoded |
Timestamps must be within 30 seconds of server time, so a drifting system clock is the first thing to check when signatures start failing. Without an SDK, signing looks like this, using the requests and cryptography packages:
import base64, os, time
import requests
from cryptography.hazmat.primitives.asymmetric import ed25519
key = ed25519.Ed25519PrivateKey.from_private_bytes(base64.b64decode(os.environ["POLYMARKET_SECRET_KEY"])[:32])
def headers(method, path):
ts = str(int(time.time() * 1000))
sig = base64.b64encode(key.sign(f"{ts}{method}{path}".encode())).decode()
return {"X-PM-Access-Key": os.environ["POLYMARKET_KEY_ID"], "X-PM-Timestamp": ts,
"X-PM-Signature": sig, "Content-Type": "application/json"}
path = "/v1/portfolio/positions"
print(requests.get("https://api.polymarket.us" + path, headers=headers("GET", path)).json())
The signed message is the timestamp, the HTTP method and the path joined together, and the request body is not part of it. The first 32 bytes of the decoded secret are the Ed25519 private key. The same three headers authenticate the WebSocket handshake.
What endpoints does the Polymarket US API have?
| Group | API | What it covers |
|---|---|---|
| Markets | Public | List markets, get one by ID or slug, the order book, best bid and offer, settlement price and price history |
| Events, series and sports | Public | Events, series such as a league season, leagues, teams and game schedules |
| Search | Public | Full-text search across events and markets |
| Orders | Authenticated | Create, preview, modify, cancel and close positions, with batches of up to 20 orders |
| Portfolio and account | Authenticated | Positions, activity including resolutions, balances and buying power |
| Combos and RFQs | Authenticated | Combo instruments and request-for-quote trading, generally available since 1 October 2026 |
Order types are limit and market orders, with time-in-force options of day, good till cancel, good till date, immediate or cancel, and fill or kill. Public data is a plain request, for example GET https://gateway.polymarket.us/v1/markets/{slug}/bbo for one market's best bid and offer.
What are the Polymarket US API rate limits?
The Retail API allows 20 requests a second per API key across all authenticated endpoints, and public endpoints allow 20 requests a second per IP. Going over returns 429 Too Many Requests, and Polymarket's guidance is to wait at least a second and retry with exponential backoff.
One error looks like a rate limit and isn't. During periods of higher latency, Polymarket US rejects any new order or cancel-replace that has not been processed within 5 seconds, to protect you from a fill at a stale price. Those rejects carry the message Global Rate Limit Exceeded, but the documentation is explicit that they are a transient latency reject, not a signal to throttle. Plain cancels are never rejected this way.
The best way to stay under the limits is to stop polling: cache market metadata, and stream orders, positions, balances and books over WebSocket instead of requesting them repeatedly.
How do you stream live Polymarket US data?
The authenticated API has two WebSocket endpoints, and both use the same three signed headers in the handshake, signed over the timestamp, GET and the socket path:
wss://api.polymarket.us/v1/ws/markets: market data with three subscription types,SUBSCRIPTION_TYPE_MARKET_DATAfor the full book and market stats,SUBSCRIPTION_TYPE_MARKET_DATA_LITEfor lightweight prices, andSUBSCRIPTION_TYPE_TRADEfor trades.wss://api.polymarket.us/v1/ws/private: your own orders, positions and balance updates.
Which Polymarket US SDK should you use?
Polymarket publishes polymarket-us for Python 3.10+, with sync and async clients, and for TypeScript on Node.js 18+. Both sign requests for you. Public market data works without keys:
from polymarket_us import PolymarketUS
client = PolymarketUS()
markets = client.markets.list({"limit": 5, "active": True, "closed": False})["markets"]
for m in markets:
bbo = client.markets.bbo(m["slug"])["marketData"]
bid, ask = bbo.get("bestBid"), bbo.get("bestAsk")
print(m["question"], bid and bid["value"], ask and ask["value"])
Pass your keys to trade. This is the order shape from Polymarket's quickstart, buying 100 contracts at 55 cents:
import os
from polymarket_us import PolymarketUS
client = PolymarketUS(key_id=os.environ["POLYMARKET_KEY_ID"], secret_key=os.environ["POLYMARKET_SECRET_KEY"])
order = client.orders.create({
"marketSlug": "your-market-slug",
"intent": "ORDER_INTENT_BUY_LONG",
"type": "ORDER_TYPE_LIMIT",
"price": {"value": "0.55", "currency": "USD"},
"quantity": 100,
"tif": "TIME_IN_FORCE_GOOD_TILL_CANCEL",
})
When is Polymarket US open for trading?
Nearly around the clock. There is a recurring weekly maintenance window every Thursday from 6:00 to 8:00 AM ET, and trading can be paused without notice for emergency maintenance. Daily reporting runs as of 5:00 PM ET each business day. Build your bot to treat a maintenance window as expected downtime rather than an error.
How do you use Polymarket US alongside other venues?
Polymarket US prices many of the same events as Kalshi, Polymarket and other venues, so comparing them usually means a second and third integration. The Predictefy API serves Polymarket US next to Polymarket, Kalshi and 15+ other venues on one normalized schema, so one call can read the same event everywhere it trades. You can also trade Polymarket US through Predictefy with your own Key ID and Secret Key, which Predictefy uses for the one request that needs them and never stores.
Frequently Asked Questions
Does Polymarket US have an API?
Yes. Polymarket US has a public API at gateway.polymarket.us for market data, events, series, sports and search, which needs no key, and an authenticated API at api.polymarket.us for orders, portfolio, account data and WebSocket streams.
How do I get a Polymarket US API key?
Create an account in the Polymarket US app and complete identity verification, then sign in at polymarket.us/developer with the same method you used in the app and create a key. You get a Key ID and a Secret Key, and the secret is shown only once.
What are the Polymarket US API rate limits?
20 requests a second per API key across authenticated endpoints, and 20 requests a second per IP on public endpoints. Exceeding them returns a 429 error. Separately, orders not processed within 5 seconds during high latency are rejected with a "Global Rate Limit Exceeded" message, which is not an actual rate limit.
Is the Polymarket US API the same as the Polymarket API?
No. Polymarket US is a separate exchange with its own API, documentation and accounts. It uses Ed25519 API keys and US dollar balances, while global Polymarket uses wallets, CLOB credentials and pUSD on Polygon.
Does the Polymarket US API have a WebSocket?
Yes, two. The markets socket streams order books, lightweight prices and trades, and the private socket streams your orders, positions and balances. Both authenticate with the same signed headers as the REST API.
Is there a Polymarket US Python SDK?
Yes. Install it with pip install polymarket-us. It needs Python 3.10 or newer, supports sync and async use, and signs requests automatically. A TypeScript SDK with the same name is available on npm for Node.js 18 and newer.