Authentication Levels
L1 Authentication
Use the private key of the user’s account to sign messages
L2 Authentication
Use API credentials (key, secret, passphrase) to authenticate requests to the CLOB
L1 Authentication
What is L1?
L1 authentication uses the wallet’s private key to sign an EIP-712 message used in the request header. It proves ownership and control over the private key. The private key stays in control of the user and all trading activity remains non-custodial.What This Enables
Access to L1 methods that create or derive L2 authentication headers.- Create user API credentials
- Derive existing user API credentials
- Sign/create user’s orders locally
CLOB Client
- TypeScript
- Python
REST API
While we highly recommend using our provided clients to handle signing and authentication, the following is for developers who choose NOT to use our Python or TypeScript clients. When making direct REST API calls with L1 authentication, include these headers:| Header | Required? | Description |
|---|---|---|
POLY_ADDRESS | yes | Polygon signer address |
POLY_SIGNATURE | yes | CLOB EIP 712 signature |
POLY_TIMESTAMP | yes | Current UNIX timestamp |
POLY_NONCE | yes | Nonce. Default 0 |
POLY_SIGNATURE is generated by signing the following EIP-712 struct.
EIP-712 Signing Example
EIP-712 Signing Example
Create API Credentials Create new API credentials for user.
L2 Authentication
What is L2?
The next level of authentication is called L2, and it consists of the user’s API credentials (apiKey, secret, passphrase) generated from L1 authentication. These are used solely to authenticate requests made to the CLOB API. Requests are signed using HMAC-SHA256.What This Enables
Access to L2 methods such as posting signed/created orders, viewing open orders, cancelling open orders, getting trades- Cancel or get user’s open orders
- Check user’s balances and allowances
- Post user’s signed orders
CLOB Client
- TypeScript
- Python
Even with L2 authentication headers, methods that create user orders still require the user to sign the order payload.
REST API
While we highly recommend using our provided clients to handle signing and authentication, the following is for developers who choose NOT to use our Python or TypeScript clients. When making direct REST API calls with L2 authentication, include these headers:| Header | Required? | Description |
|---|---|---|
POLY_ADDRESS | yes | Polygon signer address |
POLY_SIGNATURE | yes | HMAC signature for request |
POLY_TIMESTAMP | yes | Current UNIX timestamp |
POLY_API_KEY | yes | User’s API apiKey value |
POLY_PASSPHRASE | yes | User’s API passphrase value |
POLY_SIGNATURE for L2 is an HMAC-SHA256 signature created using the user’s API credentials secret value.
Reference implementations can be found in the Typescript
and Python clients.
Signature Types and Funder
When initializing the L2 client, you must specify your wallet signatureType and the funder address which holds the funds:| Signature Type | Value | Description |
|---|---|---|
| EOA | 0 | Standard Ethereum wallet (MetaMask). Funder is the EOA address and will need POL to pay gas on transactions. |
| POLY_PROXY | 1 | A custom proxy wallet only used with users who logged in via Magic Link email/Google. Using this requires the user to have exported their PK from Polymarket.com and imported into your app. |
| GNOSIS_SAFE | 2 | Gnosis Safe multisig proxy wallet (most common). Use this for any new or returning user who does not fit the other 2 types. |
Troubleshooting
Error: INVALID_SIGNATURE
Error: INVALID_SIGNATURE
Your wallet’s private key is incorrect or improperly formatted.Solution:
- Verify your private key is a valid hex string (starts with “0x”)
- Ensure you’re using the correct key for the intended address
- Check that the key has proper permissions
Error: NONCE_ALREADY_USED
Error: NONCE_ALREADY_USED
The nonce you provided has already been used to create an API key.Solution:
- Use
deriveApiKey()with the same nonce to retrieve existing credentials - Or use a different nonce with
createApiKey()
Error: Invalid Funder Address
Error: Invalid Funder Address
Your funder address is incorrect or doesn’t match your wallet.Solution: Check your Polymarket profile address at polymarket.com/settings.If it does not exist or user has never logged into Polymarket.com, deploy it first before creating L2 authentication.
Lost API credentials but have nonce
Lost API credentials but have nonce
Lost both credentials and nonce
Lost both credentials and nonce
Unfortunately, there’s no way to recover lost API credentials without the nonce. You’ll need to create new credentials: