Trading

Place limit order

POST
/execution/limit-orders

Authorization

appIdbearerAuth
headerx-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.

headerAuthorizationBearer <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.

Request Body

application/json
  1. body
venue*string

Venue to place the limit order on.

Value in"kalshi""polymarket""limitless""predict""pred""tiprun""myriad""hyperliquid""novig""prophetx""betdex""lighter"
venueMarketOutcomeId*string

Outcome to trade, on that venue.

side*string

buy or sell.

Value in"buy""sell"
limitPriceRaw*string

Limit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).

Match^[1-9][0-9]*$
sizeRaw*string

Order size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).

Match^[1-9][0-9]*$
timeInForce*string

GTC 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.

Value in"GTC""GTD""FOK""FAK""IOC""ALO"
postOnly?boolean

Only rest on the book; reject instead of taking liquidity.

expiresAt?string

Expiry time, for GTD orders.

Formatdate-time
clientOrderId?string

Idempotency 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.

Length1 <= length <= 128
approveMode?string

Self-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.

Value in"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?string

Linked 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.

Length42 <= length <= 42

Response Body

200

application/json
  1. response
orderId*string

Order id.

quoteId?string

Execution 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*OrderStatus

Order 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.

Value in"pending""signing""pending_bridge""submitting""submitted""open""partially_filled_open""cancel_pending""filled""partial_fill""failed""expired""cancelled"
venue*string

Venue the order was placed on.

Value in"kalshi""polymarket""limitless""predict""pred""tiprun""myriad""hyperliquid""novig""prophetx""betdex""lighter"
venueOrderId?string

The venue's own order id, once known.

reservedCostRaw?string

Cash 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*string

Limit price. Price per share scaled by 1e6, as an integer string (530000 = 0.53).

limitSizeRaw*string

Order size. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).

filledSizeRaw*string

Shares filled so far. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).

remainingSizeRaw*string

Shares not yet filled. Shares in 6-decimal atomic units, as an integer string (1000000 = 1 share).

Example Request
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"}'
Example Response
{  "orderId": "cmf3r1a2b00c4mw0lq8y7e3uj",  "status": "pending",  "venue": "polymarket",  "venueOrderId": null,  "reservedCostRaw": "9000000",  "limitPriceRaw": "450000",  "limitSizeRaw": "20000000",  "filledSizeRaw": "0",  "remainingSizeRaw": "20000000"}