Generate Your Key Pairs
Generate an RSA key pair for each environment you need access to. You will share only the public keys with Polymarket during onboarding.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:
REST API
gRPC
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 |
403 Forbidden | IP not allowlisted | Contact support to add your IP |
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 users and account info |
write:accounts | Create/update users, API tokens |
read:funding | View funding accounts and transactions |
write:funding | Create deposits and withdrawals |
read:kyc | View KYC status and referral codes |
write:kyc | Start KYC verification, manage webhooks |
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/kyc/status | GET | read:kyc |
/v1/kyc/verify | POST | write:kyc |
/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.Additional Resources
For more details on Private Key JWT authentication:- Private Key JWT Client Authentication
- Machine-to-Machine Applications
- RFC 7523 - JWT Profile for Client Authentication
Next Steps
Health Check
Verify API connectivity
REST API
Explore the REST API endpoints
gRPC Streaming
Set up real-time data streams
Connection Options
Review connection methods