# Close a position

URL: https://docs.fxapis.com/api-reference/trading/close-a-position

> Close a position. Closes a position in whole, or partly if you send a volume.

`POST https://api.fxapis.com/v1/accounts/{id}/positions/{positionId}/close`

Closes a position in whole, or partly if you send a `volume`.

**Send an `Idempotency-Key`.** It matters more here than on an opening order: a retried close does not close twice, it opens an opposing position, and the account ends up with exposure nobody chose.

The three failure modes are the same as for an opening order, and `ORDER_UNRESOLVED` means the same thing — **do not resend**, poll the order. An unresolved close is the case where you might believe you are flat and not be.

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

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string (uuid) | yes |  |
| `positionId` | path | string | yes | The broker's position ticket. |
| `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 |
| --- | --- | --- | --- |
| `volume` | string | no | Lots to close, as a string. Omit to close the whole position. Example: `"0.01"` |
| `deviationPoints` | integer | no | Example: `20` |
| `comment` | string | no | Example: `"take profit early"` |
| `clientOrderId` | string | no | Example: `"sig-42-user-7-close"` |

#### Responses

- `201`
- `400`
- `401`
- `403`
- `404`
- `409`
- `422`
- `503`

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.accountId` | string (uuid) | no |  |
| `data.clientOrderId` | null \| string | no | Your own reference, echoed back. |
| `data.symbol` | string | no | The broker symbol traded. |
| `data.instrument` | null \| string | no | The instrument the order named, when it named one; `symbol` is what it was traded as. Example: `"XAUUSD"` |
| `data.side` | "buy" \| "sell" | no |  |
| `data.type` | "market" \| "limit" \| "stop" \| "stop_limit" | no |  |
| `data.intent` | "open" \| "close" \| "modify" \| "cancel" | no | What this order was for. A close is an order, with the same record and the same failed/unknown distinction as an open — `modify` covers moving a stop, which changes what the account risks. |
| `data.brokerPositionId` | null \| string | no | The broker's position ticket. On a close or a stop change, the position it acted on. On an opening order, the position it opened — pass it to `POST /v1/accounts/{id}/positions/{positionId}/close`. Set when the order fills if the terminal reports it; for an order filled by an older terminal, or a pending order that fills later, once the broker's deal history for it has been read. Null until known. |
| `data.volume` | null \| string | no | Requested volume, in lots. |
| `data.stopLoss` | null \| string | no | Absolute price, not a distance. |
| `data.takeProfit` | null \| string | no | Absolute price, not a distance. |
| `data.state` | "accepted" \| "validating" \| "sending" \| "working" \| "completed" \| "filled" \| "partially_filled" \| "rejected" \| "failed" \| "unknown" \| "cancelled" \| "expired" | no |  |
| `data.stateDetail` | null \| string | no |  |
| `data.needsReconciliation` | boolean | no | True while we are confirming the result with the broker. Never resend such an order; poll it. |
| `data.retcode` | null \| integer | no | The broker's own MT5 return code, unmodified. 10009 is a completed request. |
| `data.retcodeText` | null \| string | no |  |
| `data.brokerOrderId` | null \| string | no | The broker's ticket. What their statement shows. |
| `data.brokerDealId` | null \| string | no |  |
| `data.filledVolume` | null \| string | no | What actually filled, which can be less than requested. |
| `data.filledPrice` | null \| string | no | What it actually filled at, which is rarely the requested price. |
| `data.sentAt` | null \| string (date-time) | no |  |
| `data.settledAt` | null \| string (date-time) | no | When an answer arrived. |
| `data.reconciledAt` | null \| string (date-time) | no | Set when a result was confirmed with the broker after the fact. |
| `data.createdAt` | string (date-time) | no |  |