# List copy executions

URL: https://docs.fxapis.com/api-reference/copy-trading/list-copy-executions

> List copy executions. The copy-trading log: what each master change (and each drift correction or stop-out close) did on each follower, newest first…

`GET https://api.fxapis.com/v1/copy/executions`

The copy-trading log: what each master change (and each drift correction or stop-out close) did on each follower, newest first — executed, skipped, failed or still pending — with the reason, in words, and the follower's order. Paginated by cursor.

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

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `strategyId` | query | string (uuid) | no |  |
| `subscriptionId` | query | string (uuid) | no |  |
| `followerAccountId` | query | string (uuid) | no |  |
| `status` | query | "executed" \| "skipped" \| "failed" \| "pending" | no |  |
| `reason` | query | "too_late" \| "price_moved" \| "follower_offline" \| "below_min_volume" \| "no_stop_loss" \| "stale_figures" \| "symbol_unmapped" \| "symbol_blocked" \| "limit_exceeded" \| "not_enough_margin" \| "market_closed" \| "feature_not_included" \| "quota_exceeded" \| "broker_rejected" \| "unresolved" \| "netting_not_supported" \| "internal_error" \| "follower_changed" | no |  |
| `since` | query | string (date-time) | no | Only executions created at or after this moment. |
| `limit` | query | integer | no | Default: `50`. |
| `cursor` | query | string | no | The previous page's `nextCursor`. |

#### Responses

- `200`
- `400`
- `401`
- `403`

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

#### 200 response fields

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | object[] | no |  |
| `data[].id` | string (uuid) | no |  |
| `data[].strategyId` | string (uuid) | no |  |
| `data[].subscriptionId` | null \| string (uuid) | no | Null once the subscription was deleted. |
| `data[].followerAccountId` | string (uuid) | no |  |
| `data[].status` | "executed" \| "skipped" \| "failed" \| "pending" | no | `pending` while in flight, or while a close waits for its follower to come back online. |
| `data[].reason` | "too_late" \| "price_moved" \| "follower_offline" \| "below_min_volume" \| "no_stop_loss" \| "stale_figures" \| "symbol_unmapped" \| "symbol_blocked" \| "limit_exceeded" \| "not_enough_margin" \| "market_closed" \| "feature_not_included" \| "quota_exceeded" \| "broker_rejected" \| "unresolved" \| "netting_not_supported" \| "internal_error" \| "follower_changed" \| null | no | Why it was skipped or failed: - `too_late`: The change was seen too long ago to copy (late.maxDelaySeconds). - `price_moved`: The price moved further from the master's than late.maxDeviationPoints allows. - `follower_offline`: The follower was offline and could not be brought online in time. - `below_min_volume`: The sized volume was below the follower's minimum, and limits.minLots is skip. - `no_stop_loss`: risk_percent sizing needs a stop loss, and the master's trade had none. - `stale_figures`: The follower's balance or equity could not be read recently enough to size the trade. - `symbol_unmapped`: The master's symbol has no match on the follower; add it to symbols.map. - `symbol_blocked`: The symbol is blocked, or not on the allow list, in this subscription's settings. - `limit_exceeded`: A limit stopped it: the subscription's maxLots or maxOpenPositions, or the creating key's limits. - `not_enough_margin`: The follower did not have the margin for it. - `market_closed`: The market was closed. - `feature_not_included`: The workspace's plan does not include copy trading. - `quota_exceeded`: The workspace's plan quota was used up. - `broker_rejected`: The follower's broker refused it. - `unresolved`: Sent, with no answer from the broker yet: never resent, and settled once the broker's records are read. - `netting_not_supported`: A netting account: copy trading copies between hedging accounts only. - `internal_error`: Something on fxapis's side failed, not at the broker; the follower's order may not have been sent. Check the follower's positions. - `follower_changed`: The follower's position was changed outside copying (part closed by hand), so its link now follows what it holds. |
| `data[].detail` | null \| string | no | In words: the broker's answer, or why. |
| `data[].orderId` | null \| string (uuid) | no | The follower's order. Fetch it with GET /v1/orders/{id}. |
| `data[].requestedVolume` | null \| string | no |  |
| `data[].latencyMs` | null \| integer | no | From the master change being seen to the follower's order being sent. Broker execution time is extra. |
| `data[].createdAt` | string (date-time) | no |  |
| `data[].updatedAt` | string (date-time) | no |  |
| `data[].signal` | object | no |  |
| `data[].signal.id` | string (uuid) | no |  |
| `data[].signal.kind` | "open" \| "close" \| "reduce" \| "modify" \| "drift" | no |  |
| `data[].signal.correction` | "open" \| "close" \| "reduce" \| "modify" \| "stop_out" \| "rebase" \| null | no | On a drift signal: what it corrected. `stop_out` closes a position for a risk limit or a deletion; `rebase` follows a position changed on the follower (no order). |
| `data[].signal.masterPositionId` | string | no |  |
| `data[].signal.symbol` | string | no | The master's symbol. |
| `data[].signal.side` | "buy" \| "sell" | no |  |
| `data[].signal.volumeBefore` | null \| string | no |  |
| `data[].signal.volumeAfter` | null \| string | no |  |
| `data[].signal.price` | null \| string | no |  |
| `data[].signal.stopLoss` | null \| string | no |  |
| `data[].signal.takeProfit` | null \| string | no |  |
| `data[].signal.detectedAt` | string (date-time) | no |  |
| `page` | object | no |  |
| `page.hasMore` | boolean | no |  |
| `page.nextCursor` | null \| string | no | Pass as `cursor` to continue. |