Docs
Trading

Place a limit, stop or stop-limit order

Esta página aún no está traducida al español; a continuación está la versión en inglés.

POST
/v1/accounts/{id}/orders/pending

A success here means placed and waiting, not filled — the broker answers 10008 PLACED and the order is working until it triggers.

A limit waits for a better price (buy below the market, sell above); a stop waits for a worse one and is how a breakout is traded (buy above, sell below). When fxapis has a recent price for the symbol on this account, the wrong side is refused before anything is sent, with a message naming the order you probably meant; otherwise the broker answers with its own INVALID_PRICE.

Authorization

apiKey
AuthorizationBearer <token>

Authorization: Bearer fx_live_<id>_<secret>.

A key is shown once, at creation. We cannot show it again or recover it for you. Keys carry a label (live or test) in the key itself, so each configuration is easy to tell apart. Both reach real brokers: test with a broker demo account.

Scopes are per key. A key without accounts:write can read accounts and nothing else.

In: header

Path Parameters

id*string
Formatuuid

Header Parameters

idempotency-key?string

Any unique string, usually a UUID. A retry with the same key and body returns the first answer instead of placing a second order; the same key with a different body is refused.

Lengthlength <= 200

Request Body

application/json

Send symbol or instrument, not both.

TypeScript Definitions

Use the request body type in TypeScript.

Send symbol or instrument, not both.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/v1/accounts/497f6eca-6276-4993-bfeb-53cbbbba6f08/orders/pending" \  -H "idempotency-key: 3f0c9a52-8a8e-4f7e-9b0e-6c1d2f5a7b10" \  -H "Content-Type: application/json" \  -d '{    "side": "buy",    "kind": "limit",    "volume": "0.01",    "price": "1.12800"  }'
{  "data": {    "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",    "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",    "clientOrderId": null,    "symbol": "string",    "instrument": "XAUUSD",    "side": "buy",    "type": "market",    "intent": "open",    "brokerPositionId": null,    "volume": null,    "stopLoss": null,    "takeProfit": null,    "state": "accepted",    "stateDetail": null,    "needsReconciliation": true,    "retcode": null,    "retcodeText": null,    "brokerOrderId": null,    "brokerDealId": null,    "filledVolume": null,    "filledPrice": null,    "sentAt": null,    "settledAt": null,    "reconciledAt": null,    "createdAt": "2019-08-24T14:15:22Z"  }}

Move a position's stop loss or take profit POST

**Send `null` to remove a level.** Omitting the field leaves it unchanged — an omitted field silently clearing a stop is how protection disappears without anybody choosing it. Recorded in the order history with intent `modify`, because widening a stop changes what the account risks and belongs beside the trade it protects.

Place a market order POST

Sends a market order and waits for the broker's answer. **Send an `Idempotency-Key` header.** Without one, a request that times out leaves you unable to retry safely: you cannot tell whether the order was placed, and guessing wrong opens a second position. With one, retrying is free — the same key returns the same answer and never places a second order. Three failures are worth telling apart, and the response distinguishes them: - **`NO_PRICE` (422)** — the broker had no current price for the symbol (market closed, or not offered by this broker), so nothing was sent. Retry once it quotes; the same `Idempotency-Key` may be reused. - **`SEND_FAILED` (503)** — nothing reached the broker. Resend only when `retryable` is `true`; it is `false` when the order was taken from this request before it could go (cancelled, say), so look at the order first. - **`ORDER_REJECTED` (422)** — the broker refused it, with a reason and its own return code. `retryable` says whether the reason was transient (a requote, a moved price) or permanent (insufficient margin, a closed market). - **`ORDER_UNRESOLVED` (503)** — we do not know. The order may be live at the broker. It is in `unknown` while we confirm the result with the broker. **Do not resend it**; poll the order instead.