POST
/orderPost a new order
Creates a new order in the order book
- Base URL
- https://clob.polymarket.com
- Auth
- L2 API credentials (key, secret, passphrase)POLY_API_KEY, POLY_ADDRESS, POLY_SIGNATURE, POLY_PASSPHRASE, POLY_TIMESTAMP
- Rate limit
- 5,000 req / 10s (500 per second)sustained 120,000 req / 10 min
- Limit applies to
- POST /order
Things to know
Trading endpoints carry two Cloudflare limits: a burst of 5,000 req / 10s and a sustained 120,000 req / 10 min. Separate per-signer token buckets, sized by 30-day volume, apply on top.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| order | object | yes | Order payload submitted to the CLOB API. In CLOB V2, `expiration` remains in the POST /order wire body for GTD/order-expiry handling, but it is not part of the EIP-712 signed order struct. |
| owner | string | yes | UUID of the API key owner |
| orderType | string | no | Time in force |
| deferExec | boolean | no | Whether to defer execution |
| postOnly | boolean | no | Whether the order must rest on the book and not match immediately. Only supported for GTC and GTD orders. |
Example
curl -X POST "https://clob.polymarket.com/order" \
-H "Content-Type: application/json" \
-H "POLY_API_KEY: $POLY_API_KEY" \
-H "POLY_ADDRESS: $POLY_ADDRESS" \
-H "POLY_SIGNATURE: $POLY_SIGNATURE" \
-H "POLY_PASSPHRASE: $POLY_PASSPHRASE" \
-H "POLY_TIMESTAMP: $POLY_TIMESTAMP" \
-d '{
"order": {},
"owner": "<owner>"
}'L2 requests are signed with HMAC-SHA256 using your API secret, and the timestamp is part of the signature, so keep the machine's clock accurate. A missing credential or a stale signature both come back as Unauthorized/Invalid api key. The Python SDK signs for you.
Response fields
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the order was successfully processed |
| orderID | string | Unique identifier for the order (order hash) |
| status | string | Status of the order after processing |
| makingAmount | string | Amount the maker is providing in fixed-math with 6 decimals |
| takingAmount | string | Amount the taker is providing in fixed-math with 6 decimals |
| transactionsHashes | string[] | Array of transaction hashes (present when status is 'matched') |
| tradeIDs | string[] | Array of trade IDs (present when status is 'matched') |
| errorMsg | string | Error message (empty on success) |
Responses
| Status | Meaning |
|---|---|
| 200 | Order successfully processed |
| 400 | Bad request - Invalid order payload or validation error |
| 401 | Unauthorized - Invalid API key or authentication failed |
| 500 | Internal server error |
| 503 | Service unavailable - Trading disabled or cancel-only mode |
Errors this endpoint returns
- 400Invalid order payload
- 400the order owner has to be the owner of the API KEY
- 400the order signer address has to be the address of the API KEY
- 400'{address}' address banned
- 400'{address}' address in closed only mode
- 503Trading is currently cancel-only. New orders are not accepted, but cancels are allowed.
- 503post-only mode: only post-only orders and cancels are allowed
Related endpoints
- DELETE /order CLOB API
- POST /orders CLOB API
- DELETE /orders CLOB API
From Polymarket's published OpenAPI spec and rate-limit tables, synced 2026-10-04.