The Polymarket Exchange API uses Private Key JWT authentication with RSA keys. You sign a JWT with your RSA private key and exchange it for an access token.Documentation Index
Fetch the complete documentation index at: https://docs.polymarket.us/llms.txt
Use this file to discover all available pages before exploring further.
Complete Onboarding first to generate your keys and receive your Client ID.
Environments
| Environment | Auth Domain | API Domain |
|---|---|---|
| Development | pmx-dev01.us.auth0.com | api.dev01.polymarketexchange.com |
| Pre-production | pmx-preprod.us.auth0.com | api.preprod.polymarketexchange.com |
| Production | pmx-prod.us.auth0.com | api.prod.polymarketexchange.com |
Use
https://[API Domain] for both the JWT audience claim and API base URL.Each environment requires separate onboarding. Your pre-production credentials will not work in production.
How It Works
Authentication follows these steps:- Create a signed JWT assertion - Sign a JWT with your private key
- Exchange for API access token - Send the assertion to the token endpoint
- Call API with access token - Include the token in your API requests
Prerequisites
After completing Onboarding, you will have:| You Have | From Onboarding |
|---|---|
| Private key file | Generated by you (keep secure!) |
| Client ID | Provided by Polymarket via clientid.txt in your shared Google Drive folder |
| Auth Domain | See Environments |
| API Audience | See Environments |
Create Client Assertion JWT
Create a JWT with these claims, signed with your private key using RS256:| Claim | Description |
|---|---|
iss | Your client ID (issuer) |
sub | Your client ID (subject) |
aud | Token endpoint URL |
iat | Issued at time (Unix timestamp) |
exp | Expiration time (max 5 minutes from iat) |
jti | Unique token ID (prevents replay attacks) |
Request Access Token
Token Response
Complete Python Example
Complete Go Example
Using the Access Token
Include the access token in theAuthorization header for all API requests. For account-scoped endpoints (trading, positions, reports), you must also include the x-participant-id header.
REST API
gRPC
Verify your token scopes and ensure
x-participant-id is included for account-scoped endpoints. If you donβt know your participant ID, call GET /v1/whoami or GET /v1/users and put your firm and user into the firms/<YOURFIRM>/users/<USER> format. Note you will have one firm but can have multiple users.Key Rotation
You can rotate your keys at any time:- Generate a new key pair
- Complete a new Onboarding submission with the new public key
- We add the new key to your application
- Update your systems to use the new private key
- Notify us to remove the old public key
Troubleshooting
Common Errors
| Error | Cause | Solution |
|---|---|---|
invalid_client | JWT signature verification failed | Verify private key matches registered public key |
invalid_client_assertion | Malformed JWT or wrong claims | Check JWT claims (iss, sub, aud, exp) |
401 Unauthorized | Invalid or expired access token | Request a new access token |
Debugging JWT Claims
If authentication fails, verify your client assertion JWT contains correct claims:- Wrong
aud(must be the token endpoint, not the API) - Expired JWT (exp in the past)
- Reused
jti(must be unique per request)
API Scopes
Your application is granted specific scopes that control which API endpoints you can access. Scopes are included in your access token and validated by the API.Available Scopes
| Scope | Description |
|---|---|
read:marketdata | Access BBO (best bid/offer) and streaming market data |
read:l2marketdata | Access L2 orderbook depth (premium) |
read:instruments | List instruments and metadata |
read:orders | View open orders, preview orders |
write:orders | Create and cancel orders |
read:reports | Search orders/trades/executions, download reports |
read:positions | View account positions and balances |
read:dropcopy | Drop copy subscriptions |
read:accounts | View account info |
read:funding | View funding accounts and transactions |
write:funding | Create deposits and withdrawals |
Scope Requirements by Endpoint
| Endpoint | Method | Required Scope |
|---|---|---|
/v1/trading/orders | POST | write:orders |
/v1/trading/orders/cancel | POST | write:orders |
/v1/trading/open-orders | GET | read:orders |
/v1/report/orders/search | POST | read:reports |
/v1/report/trades/search | POST | read:reports |
/v1/positions | GET | read:positions |
/v1/positions/balance | POST | read:positions |
/v1/positions/balances | POST | read:positions |
/v1/orderbook/{symbol} | GET | read:l2marketdata |
/v1/orderbook/{symbol}/bbo | GET | read:marketdata |
/v1/refdata/symbols | POST | read:instruments |
/v1/refdata/instruments | POST | read:instruments |
/v1/refdata/metadata | POST | read:instruments |
/v1/whoami | GET | read:accounts |
/v1/users | GET | read:accounts |
/v1/users | POST | write:accounts |
/v1/funding/accounts | GET | read:funding |
/v1/aeropay/deposits | POST | write:funding |
/v1/checkout/deposits | POST | write:funding |
/v1/health | GET | (no auth required) |
Checking Your Scopes
Your granted scopes are included in your access token. You can decode the token to see them:If you receive a
403 Forbidden error, check that your application has been granted the required scope for that endpoint. Contact support to request additional scopes.