GuidesResources
Errors
The shape of REST API error responses, what each status code means, and every error code with its fix.
Every REST API error has the same JSON shape, whatever the endpoint.
{
"success": false,
"code": 400,
"error": "create_order_insufficient_collateral_allowance",
"message": "Insufficient collateral: USDT allowance is less than the total bid amount.",
"timestamp": "2026-11-04T20:37:19.030930831Z",
"trace": "f81a7973a8d080f6723e5d3fb705604a"
}| Field | Meaning |
|---|---|
success | Always false for an error. |
code | The HTTP status code. |
error | A stable code to match on in your client. For a 400 it names the exact problem, like the codes below. For any other status it names the status, like unauthorized. |
message | A description for people. It can carry details, such as the minimum a value has to reach. Do not match on it. |
timestamp | When the error happened, in RFC 3339. |
trace | An ID that identifies the request in our logs. Include it when you report a problem. |
Status codes
| Status | error | Meaning |
|---|---|---|
| 400 | A specific code | The request is invalid. The error code says why. |
| 401 | unauthorized | The API key or JWT is missing, invalid or expired, or a JWT does not belong to the wallet the request acts for. |
| 403 | forbidden | The request is not allowed, for example from a restricted region or for a blocked wallet. |
| 404 | not_found | The resource does not exist. |
| 429 | too_many_requests | You went over a rate limit. See Rate limits. |
| 500 | internal_server_error | Something failed on our side. Retry later, and report it with the trace if it persists. |
| 502 | bad_gateway | An upstream service failed. Retry later. |
| 503 | service_unavailable | The service or feature is unavailable for now. Retry later. |
General codes
error | Cause | Fix |
|---|---|---|
bad_request | The request is invalid in a way no specific code covers. | Read the message. |
invalid_cursor | The after cursor is malformed. | Pass the cursor from the previous page unchanged. |
activity_invalid_input | The input to an activity endpoint is invalid. | Check the request against the endpoint's reference. |
activity_lock_rejected | One or more activity selections fail the activity's lock rules. | Read the message for the selection that failed. |
activity_state_conflict | The activity's current state does not allow the request. | Check the activity's state first. |
Order codes
These come from Create an order. Place orders explains each rule.
Order fields
error | Cause | Fix |
|---|---|---|
create_order_invalid_numeric_value | pricePerShare, makerAmount or takerAmount is not an integer string. pricePerShare is in wei, so "0.4" is invalid. | Send integers in wei, such as "400000000000000000" for 0.40. |
create_order_invalid_fee_rate_bps | feeRateBps is above 10000. | Use the market's feeRateBps. |
create_order_invalid_nonce | nonce is negative or too large. | Use 0, as the SDK does. |
create_order_invalid_slippage_bps | slippageBps is above 10000. | Use a value from 0 to 10000. |
create_order_invalid_signature_hex | signature is not valid hex, or is too long. | Send the signature the SDK returns. |
create_order_price_out_of_range | pricePerShare is not between 0 and 1 (exclusive). | Use a price above 0 and below 1e18. |
create_order_price_field_zero | The amount that sets the price is zero: makerAmount for a buy, takerAmount for a sell. | Compute the amounts with the SDK's order amount helpers. |
create_order_amount_field_zero | makerAmount or takerAmount is zero. | Use non-zero amounts. |
create_order_price_field_precision_invalid | For a LIMIT order, the price-setting amount has digits below 1e10 wei. | Compute the amounts with the SDK's getLimitOrderAmounts. |
create_order_price_precision_too_high | The price has more decimals than the market's decimalPrecision. | Round the price to decimalPrecision decimals. |
create_order_limit_amounts_mismatch | A LIMIT order's amounts do not match pricePerShare. | Compute the amounts with getLimitOrderAmounts, and send the pricePerShare it returns. |
create_order_market_amounts_mismatch | A MARKET order's signed average price is more than 1% better for you than pricePerShare. | Compute the amounts with the SDK's getMarketOrderAmounts. |
create_order_slippage_non_market | slippageBps is set on a LIMIT order. | Leave slippageBps out, or set it to 0. |
create_order_min_order_value_not_met | A buy is worth less than 1 USDT. | Increase the order's size. |
create_order_min_order_size_not_met | A sell has fewer shares than the minimum: 1 share for a LIMIT order, 0.01 for a MARKET order. | Increase the order's size. |
create_order_expiry_too_soon | The order expires in less than 2 minutes. | Set the expiration at least 2 minutes ahead. |
create_order_expiry_too_far | The order expires after 2100-01-01. | Use an earlier expiration. |
create_order_maker_signer_mismatch | maker and signer differ. | Set both to the wallet's address. For a Predict account, use the account's address. |
create_order_fill_or_kill_not_supported | isFillOrKill is set on a LIMIT order. | Use it only on MARKET orders. |
create_order_post_only_not_supported | isPostOnly is set on a MARKET order. | Use it only on LIMIT orders. |
create_order_reserved_balance_policy_invalid | reservedBalancePolicy is set on a LIMIT order. | Use it only on MARKET orders. |
create_order_fee_rate_too_low | feeRateBps is below the market's fee, less any referral discount. | Sign the market's feeRateBps. See Fees. |
create_order_hash_mismatch | The hash you sent does not match the order. | Send the hash the SDK computes, or leave it out. |
create_order_duplicate_order | An order with this hash already exists. | Build a new order. The SDK gives each order a new salt. |
Market and exchange state
error | Cause | Fix |
|---|---|---|
create_order_market_token_not_found | No market has this tokenId, or the market is hidden, as when its tradingStatus is CANCEL_ONLY. | Use an outcome's onChainId from a market that is trading. |
create_order_market_not_trading | The market is paused or resolved. | Check the market's status and tradingStatus. |
create_order_trading_disabled | Matching is off for the market, and only post-only LIMIT orders are accepted. | Wait for tradingStatus to be OPEN, or send a post-only order. |
create_order_market_orders_disabled | MARKET orders are not accepted in the market right now. | Use a LIMIT order, or wait. |
create_order_exchange_paused | The exchange contract is paused. | Wait until trading resumes. |
create_order_max_orders_per_market_exceeded | Your wallet has the maximum number of open LIMIT orders in this market. | Remove some orders first. See Cancel orders. |
create_order_unsupported_wallet | The signing wallet is a smart contract the exchange does not support. | Sign with an EOA or a Predict account. |
Funds and approvals
The API checks your balance and allowance against the new order plus your other open orders on the same outcome and side in the same market.
error | Cause | Fix |
|---|---|---|
create_order_insufficient_collateral_balance | Your USDT balance does not cover your open buys plus this one. | Deposit USDT, or remove open buys. |
create_order_insufficient_collateral_allowance | Your USDT allowance to the exchange does not cover your open buys plus this one. | Set your approvals. See Approvals. |
create_order_insufficient_shares_balance | You hold fewer shares than your open sells plus this one. | Sell fewer shares, or remove open sells. |
create_order_exchange_not_approved | The exchange is not approved to move your outcome tokens. | Set your approvals. |
create_order_neg_risk_adapter_not_approved | In a negative-risk market, the adapter is not approved to move your outcome tokens. | Set your approvals for negative-risk markets. |
On-chain checks
The API asks the exchange contract whether the order is valid. These codes carry the contract's reason. If the contract's answer comes after the API has responded, the order is cancelled instead of rejected (see the note at the end of this page).
error | Cause | Fix |
|---|---|---|
create_order_contract_invalid_signature | The signature does not match the order and signer. | Sign the order's typed data for the right exchange. Check isNegRisk and isYieldBearing. |
create_order_contract_invalid_signature_length | The signature has the wrong length. | Send the signature the SDK returns. |
create_order_contract_order_expired | The order has expired. | Build a new order with a later expiration. |
create_order_contract_fee_too_high | feeRateBps is above the exchange's cap of 1000. | Sign the market's feeRateBps. |
create_order_contract_invalid_token_id | The exchange does not know this token. | Use an outcome's onChainId from the market. |
create_order_contract_order_filled_or_cancelled | The order was already filled, or cancelled on-chain. | Build a new order. |
create_order_contract_invalid_nonce | The order's nonce does not match the wallet's nonce on the exchange. | Sign the order with the wallet's current nonce on that exchange. It is 0, the SDK's default, unless the wallet has raised it on-chain. |
create_order_contract_paused | The exchange contract is paused. | Wait until trading resumes. |
A 201 from Create an order does not guarantee the order stays open. Some checks finish after the response. When one fails, the order is cancelled and you get a wallet event. See Order lifecycle.