Docs
Trading

Positions on an account

GET
/v1/accounts/{id}/positions

What we last saw, with observedAt saying when. The broker is authoritative and this is a snapshot, not a ledger — observedAt is here so you can tell a current view from a stale one rather than having to assume.

Open positions only, unless includeClosed=true.

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

Query Parameters

includeClosed?string

true also returns positions we have seen closed, with closedAt set.

Default"false"

Value in

  • "true"
  • "false"

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/v1/accounts/497f6eca-6276-4993-bfeb-53cbbbba6f08/positions"
{  "data": [    {      "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",      "accountId": "3d07c219-0a88-45be-9cfc-91e9d095a1e9",      "brokerPositionId": "string",      "symbol": "string",      "side": "buy",      "volume": null,      "openPrice": null,      "currentPrice": null,      "stopLoss": null,      "takeProfit": null,      "swap": null,      "profit": null,      "openedAt": null,      "observedAt": "2019-08-24T14:15:22Z",      "closedAt": null    }  ]}

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: - **`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.

An account's full deal history GET

Everything the broker recorded against this account, **including deals no order of yours caused** — a stop loss firing, a swap charge, a deposit, or somebody trading the same login from the MetaTrader desktop. That inclusion is the point. A history containing only your own orders would show an account whose balance moves for no visible reason. Ordered by the broker's timestamp, not ours.