> ## Documentation Index
> Fetch the complete documentation index at: https://assetpay.gg/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Cancel Buy Item (Self-Trade)

> Request cancellation of a single undelivered item from a merchant buy; the merchant wallet is refunded automatically on success. CS2 and AssetPay only.

Merchant-facing equivalent of [`POST /client/trading/withdraw/{tradeId}/items/{itemId}/cancel`](/docs/api-reference/trading/cancel-withdraw-item). Requests cancellation of a single undelivered item from one of your own **self-trade** buys. AssetPay asks the marketplace supplier to cancel the purchase; on success your merchant wallet is refunded automatically. To cancel the whole order in one call, use [`POST /secure/buy/{tradeId}/cancel`](/docs/api-reference/secure/cancel-buy) instead.

**Authentication:** Merchant API Key (`api-key` header)
**Scope:** `CORE_ACCESS`

<Note>
  CS2 (Assetpay) items only. Rust buys are fulfilled by a polling supplier with no cancel API, and internal-sourced items leave nothing to reverse upstream; both return `TRADE_CANCEL_UNSUPPORTED` (44). Only **self-trade** buys (`source: "self"`) are cancellable through this endpoint.
</Note>

## Request

```http theme={null}
POST https://api.assetpay.gg/secure/buy/{tradeId}/items/{itemId}/cancel
api-key: ap_...
```

### Path Parameters

| Parameter | Type   | Required | Description                                                                                            |
| --------- | ------ | -------- | ------------------------------------------------------------------------------------------------------ |
| `tradeId` | string | Yes      | The buy trade's internal ID, or the `externalId` you supplied at creation.                             |
| `itemId`  | string | Yes      | The item's `id` within that trade, or the per-item `externalId` you supplied at buy time. 1–128 chars. |

## When an item can be cancelled

A cancel is only accepted when **all** of the following hold:

* The item belongs to a **self-trade** (`source: "self"`) **buy** owned by the authenticated merchant.
* The item is a **CS2 (Assetpay)** item that was not sourced from the internal pool.
* The item is **at least 30 minutes old** (measured from when it was created).
* The item is **not** already in a terminal state (`completed`, `failed`, `reverted`, `canceled`).

## Response

```json theme={null}
{
  "requestId": "...",
  "success": true,
  "data": {
    "tradeId": "trade-uuid",
    "itemId": "item-uuid",
    "externalId": "buy_item_a",
    "status": "cancelled"
  }
}
```

`externalId` echoes your own per-item reference and is omitted when you did not supply one.

A `200` only confirms the marketplace **accepted** the cancellation. AssetPay does **not** change the item state inline — the refund and the transition to `canceled` arrive asynchronously through the standard `trade.*` [callback](/docs/guides/callbacks). Poll [`GET /secure/trades/{tradeId}`](/docs/api-reference/secure/get-trade) or rely on callbacks for the final state.

<Note>
  A cancel lands on `canceled`, not `reverted`. `reverted` is for a delivered item that came back afterwards.
</Note>

## Rate Limits

| Merchant Status | Limit             |
| --------------- | ----------------- |
| Verified        | 60 requests / min |
| Unverified      | 10 requests / min |

## Errors

| Code | Key                        | When                                                                                                           |
| ---- | -------------------------- | -------------------------------------------------------------------------------------------------------------- |
| 27   | `TRADE_CANCEL_TOO_SOON`    | The item is younger than 30 minutes. Retry after the 30-minute window.                                         |
| 28   | `TRADE_NOT_CANCELLABLE`    | Not cancellable: not a withdraw-type buy, already in a terminal state, or the marketplace rejected the cancel. |
| 44   | `TRADE_CANCEL_UNSUPPORTED` | The item is Rust or internal-sourced, so there is no supplier cancel to call.                                  |
| 1300 | `FORBIDDEN`                | The trade is not a self-trade owned by the authenticated merchant.                                             |
| 2201 | `ITEM_NOT_FOUND`           | No item matching that `itemId` or `externalId` exists under the given trade.                                   |
