Before you start
To place an order, you’ll need:- An authenticated API session with a valid Bearer token
- An account ID for the customer placing the order
- The instrument ID for the security being traded — you can look these up via the instruments endpoints
- Sufficient cash balance (for buy orders) or position units (for sell orders) in the account
Placing an order
Send aPOST request to /accounts/{account_id}/orders. The request body depends on whether you’re buying or selling.
Buy orders
Buy orders are cash-based — you specify how much money to invest, not how many units to buy. We calculate the quantity based on the current price.Sell orders
Sell orders are unit-based — you specify how many units to sell, not how much cash to receive.Request body
| Field | Type | Required | Description |
|---|---|---|---|
instrument | string | Yes | The ID of the instrument to buy or sell. |
order_type | string | Yes | The order type. Only market is supported. |
side | string | Yes | buy or sell. |
cash_amount | string | Buy orders | The amount to invest before fees. Buy orders are cash-based. Must be greater than 0. |
quantity | string | Sell orders | The number of units to sell. Sell orders are unit-based. Must be greater than 0. |
automatic_rollover | boolean | No | If true, the resulting position will automatically roll over upon maturity. Only applicable to buy orders on instruments that support it. Defaults to false. |
The response
A successful request returns201 Created with the order object:
statusstarts atplaced. See the order lifecycle for how it progresses.positionisnulluntil the order is executed — it gets populated when a trade is recorded.traded_quantityandtraded_notionalare"0"initially and increase as trades execute.feesreflects the total fee amount for this order.net_cash_amountis the amount that actually gets traded (cash amount minus fees).tradesis an empty array until execution happens.purposeis set by us. Orders you place through the API will always haveuser_request.
Order creation is synchronous — we validate the request and return the order immediately. Everything after that (execution, settlement) happens asynchronously. Use webhooks or poll the Retrieve order endpoint to track progress.