# Place one trade on many accounts

URL: https://docs.fxapis.com/api-reference/waves/place-one-trade-on-many-accounts

> Place one trade on many accounts. A multi-account order: one trade placed on many accounts at once.

`POST https://api.fxapis.com/v1/execution-waves`

A multi-account order: one trade placed on many accounts at once. Every account is brought online first, then the orders are sent together — at `executeAt`, or as soon as every account is online.

**A multi-account order is not all-or-nothing once sent, and cannot be.** There is no transaction across a hundred brokers: accounts fill at different prices, some are rejected for margin, some go unanswered. So it never reports a single success or failure — it reports a result for each account, and `summary` counts what landed. An account whose result is `unresolved` must not be resent; poll its order.

`dispatchSpreadMs` is the gap between the first account's order being sent and the last. It is the number worth watching: as it grows, your accounts are getting different prices.

**`barrierPolicy`** decides what happens when some accounts are not online in time:

- `release-ready` — trade on the accounts that are online, skip the rest. A partial entry beats a late one.
- `all-or-nothing` — trade on none unless all are online. Note this is about *sending*: a broker can still reject an account's order after it was sent.
- `wait` — keep waiting past `executeAt` until every account is online, up to `expiresAt`.

Authentication: `Authorization: Bearer <API key>`.

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `idempotency-key` | header | string | no | 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. |

#### Request body (application/json, required)

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `accountIds` | string (uuid)[] | yes | The accounts to trade on, one order each. An account listed twice is traded once. |
| `symbol` | string | no | As the brokers name it. Every account trades this exact symbol, so use it when all the accounts are at brokers that name it the same way. Example: `"EURUSD"` |
| `instrument` | string | no | Instead of `symbol`: an instrument from `GET /v1/instruments`. Each account trades its own broker's symbol for it (`XAUUSD.a` at one broker, `GOLD` at another), resolved once, when the order is made, and shown on each leg. Refused whole with `INSTRUMENT_UNAVAILABLE` when any account cannot trade it; `details` names each account and why. Example: `"XAUUSD"` |
| `side` | "buy" \| "sell" | yes |  |
| `volume` | string | yes | Lots per account, unless a weight overrides it. Example: `"0.01"` |
| `weights` | object | no | Per-account volume, keyed by account id. For accounts that differ in equity. |
| `stopLoss` | string | no | Example: `"1.12900"` |
| `takeProfit` | string | no | Example: `"1.14200"` |
| `comment` | string | no | Example: `"signal 42"` |
| `label` | string | no | Example: `"London open — EURUSD long"` |
| `clientWaveId` | string | no | Example: `"signal-42"` |
| `barrierPolicy` | "release-ready" \| "all-or-nothing" \| "wait" | no | What to do when some accounts are not online in time. `release-ready` trades on the ones that are; `all-or-nothing` trades on none unless all are; `wait` keeps waiting past executeAt until expiresAt. |
| `executeAt` | string (date-time) | no | When the orders should be sent. Omit to send as soon as every account is online — accounts still logging in are waited for up to 60 seconds, then the barrier policy decides. |
| `expiresAt` | string (date-time) | no | Stop waiting for accounts that are not online after this. |

#### Responses

- `201`
- `400`
- `401`
- `402`
- `403`
- `404`
- `422`

Failures return `{ "error": { "code", "message" } }`; every code is listed at https://docs.fxapis.com/errors.

#### 201 response fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object | no |  |
| `data.id` | string (uuid) | no |  |
| `data.label` | null \| string | no |  |
| `data.clientWaveId` | null \| string | no |  |
| `data.symbol` | null \| string | no | The symbol every account trades. Null when the order named an `instrument`; each leg then shows its own. |
| `data.instrument` | null \| string | no | The instrument the order named instead of a symbol, if it did. |
| `data.side` | "buy" \| "sell" | no |  |
| `data.baseVolume` | null \| string | no |  |
| `data.state` | "planned" \| "preparing" \| "armed" \| "releasing" \| "settled" \| "cancelled" \| "abandoned" | no |  |
| `data.stateDetail` | null \| string | no |  |
| `data.barrierPolicy` | "release-ready" \| "all-or-nothing" \| "wait" | no |  |
| `data.executeAt` | null \| string (date-time) | no |  |
| `data.expiresAt` | null \| string (date-time) | no |  |
| `data.preparedAt` | null \| string (date-time) | no |  |
| `data.releasedAt` | null \| string (date-time) | no |  |
| `data.settledAt` | null \| string (date-time) | no |  |
| `data.dispatchSpreadMs` | null \| integer | no | The gap between the first account's order being sent and the last, in milliseconds. As it grows, your accounts are getting different prices. |
| `data.summary` | object | no | What landed. Deliberately not a success flag — a multi-account order is not all-or-nothing once sent. |
| `data.summary.total` | integer | no |  |
| `data.summary.filled` | integer | no |  |
| `data.summary.rejected` | integer | no |  |
| `data.summary.skipped` | integer | no |  |
| `data.summary.unresolved` | integer | no | Accounts whose result we are still confirming with the broker. Do not resend these. |
| `data.legs` | object[] | no | One entry per account: the order placed there and how it went. |
| `data.legs[].accountId` | string (uuid) | no |  |
| `data.legs[].orderId` | null \| string (uuid) | no | The ordinary order placed on this account. Query it like any other. |
| `data.legs[].symbol` | string | no | The broker symbol this account trades. Example: `"XAUUSD.a"` |
| `data.legs[].volume` | null \| string | no |  |
| `data.legs[].state` | "pending" \| "preparing" \| "ready" \| "dispatched" \| "filled" \| "rejected" \| "skipped" \| "unresolved" | no | `pending`/`preparing`: being brought online. `ready`: online and waiting. `dispatched`: sent, awaiting the broker. `filled`, `rejected`: the broker's answer. `skipped`: never sent. `unresolved`: sent, and we are confirming the result with the broker — do not resend. |
| `data.legs[].stateDetail` | null \| string | no |  |
| `data.legs[].sentAt` | null \| string (date-time) | no |  |
| `data.legs[].settledAt` | null \| string (date-time) | no |  |
| `data.createdAt` | string (date-time) | no |  |