Place limit order
appIdbearerAuthx-app-id<token>Your application ID. Required on app-tier and user-tier routes. Omitted on routes that authenticate with x-app-api-key only.
AuthorizationBearer <JWT>JWT access token from POST /auth/verify. Required with x-app-id on user routes. On the smart-route quote it is optional and turns a preview into an executable quote.
application/json- body
venue*stringVenue to place the limit order on.
"kalshi""polymarket""limitless""predict""pred""tiprun""myriad""hyperliquid""novig""prophetx""betdex""lighter"venueMarketOutcomeId*stringOutcome to trade, on that venue.
side*stringbuy or sell.
"buy""sell"limitPriceRaw*stringLimit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).
^[1-9][0-9]*$sizeRaw*stringOrder size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
^[1-9][0-9]*$timeInForce*stringGTC good till cancelled; GTD good till expiresAt; FOK fill in full now or cancel; FAK / IOC fill what you can now, cancel the rest; ALO add liquidity only (Hyperliquid's post-only). Venues support different subsets.
"GTC""GTD""FOK""FAK""IOC""ALO"postOnly?booleanOnly rest on the book; reject instead of taking liquidity.
expiresAt?stringExpiry time, for GTD orders.
date-timeclientOrderId?stringIdempotency key. Your own id for this limit order, unique per user: a repeat is rejected with 409 rather than placing a second order, so retry a timed-out request with the same value and, on 409, read the order back with GET /execution/orders?clientOrderId=. Not copied to externalId, which stays null on limit orders.
1 <= length <= 128approveMode?stringSelf-custody, cross-chain fills only: how the token approval a bridge needs is made. sponsored (default): the wallet does not send the approve itself; it signs a one-time EIP-7702 authorization per chain, over a raw digest (not EIP-191 or EIP-712), which many wallets cannot produce. user_broadcast: the user sends the approve transaction from their wallet and pays its gas, on every bridge. Pick based on what the wallet software supports. Neither mode makes bridging free: quote with deepEstimate and read feeBreakdown.bridgeFees and feeBreakdown.setupCosts.
"sponsored""user_broadcast"fundingAddresses?array<>Self-custody: other linked EVM wallets this order may spend from. Same rules as the fill body, except Solana entries are not accepted here.
signingAddress?stringLinked account EOA for self-custody; omit for managed custody. Polymarket supports GTC/GTD buys and sells, at or above the market's minimum size, and requires a previously set-up deposit wallet, which makes every order; a legacy Polymarket Safe can top up a buy's pUSD or a sell's shares by moving them into that deposit wallet first (one extra Safe signature), and legacy proxy wallets are not supported. Hyperliquid supports GTC/ALO buys and sells, whole contracts and a 0.00001 price tick, without expiresAt. Hyperliquid order actions are signed by the EOA or its approved client-held agg agent; sufwan-local-test never holds an agent key. Placement returns quoteId: poll execution status and answer pendingSignatures using each request's signerAddress. Placement is pending until signatures and venue submission finish. Self-custody buys do not reserve managed balances. Funding uses supported balances across chains and the pinned deposit wallet. On a buy, fundingAddresses may add other wallets linked to the same account; their balances fund the order only by bridging in, never on the venue's own chain. Polymarket CLOB credentials are derived in memory per order or signed cancel and never stored; cancelling requires a fresh cancelSignature. Hyperliquid cancellation requires a fresh signed cancel action. An account referenced by an order cannot be disconnected, including after that order becomes terminal.
42 <= length <= 42200
application/json- response
orderId*stringOrder id.
quoteId?stringExecution quote ID for polling GET /execution/status and submitting the user's signatures to POST /execution/fill/:quoteId/signatures. Present for funded buy orders.
status*OrderStatusOrder lifecycle status. In flight: pending (accepted, funds being checked), signing, pending_bridge (funds moving to the venue's chain), submitting, submitted (sent to the venue, awaiting confirmation). Resting limit orders: open, partially_filled_open, cancel_pending (cancel requested, awaiting the venue). Terminal: filled, partial_fill (the unfilled rest will not fill; see partialFillReason), failed, expired, cancelled.
"pending""signing""pending_bridge""submitting""submitted""open""partially_filled_open""cancel_pending""filled""partial_fill""failed""expired""cancelled"venue*stringVenue the order was placed on.
"kalshi""polymarket""limitless""predict""pred""tiprun""myriad""hyperliquid""novig""prophetx""betdex""lighter"venueOrderId?stringThe venue's own order id, once known.
reservedCostRaw?stringCash held for a managed buy. null for sells and self-custody. USD in 6-decimal atomic units, as an integer string (1000000 = $1.00).
limitPriceRaw*stringLimit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).
limitSizeRaw*stringOrder size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
filledSizeRaw*stringShares filled so far. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
remainingSizeRaw*stringShares not yet filled. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).
curl -X POST 'https://api.t.sufwankhalid.com/execution/limit-orders' \ -H 'Content-Type: application/json' \ -d '{ "venue": "polymarket", "venueMarketOutcomeId": "cmf3q8z2m00a4mw0lr5t1k7yc", "side": "buy", "limitPriceRaw": "450000", "sizeRaw": "20000000", "timeInForce": "GTC", "clientOrderId": "limit-7f3a2c"}'{ "orderId": "cmf3r1a2b00c4mw0lq8y7e3uj", "status": "pending", "venue": "polymarket", "venueOrderId": null, "reservedCostRaw": "9000000", "limitPriceRaw": "450000", "limitSizeRaw": "20000000", "filledSizeRaw": "0", "remainingSizeRaw": "20000000"}