# Buy items using item_id and send to specific tradelink

`GET /v1/buy-one-p2p`

Notes about trades and frequently asked questions

The duration of the trade in different situations:

If seller's info is invalid then it can be cancelled immediately and status 6 is set;

If seller's details are valid, but no trade is created, then it will auto-cancel after 6 minutes;

if created or waiting for mobile confirmation then it will auto-cancel after 11 to 15 min (depends on when created);

if trade is waiting for mobile confirmation and connection with the seller was lost then it will auto-cancel after 6 hours.

We recommend adding project_id to purchase so that you can track a trade in case of a timeout or break of purchase request using the /check-many-project-id GET method one minute after the request.

An array of possible messages with purchase errors and other information, such as status, can be seen by opening the response scheme, where:

System busy - trade is cancelled due to tradelink check timeout or heavy load;

buy_csgo - CS:GO purchases are deactivated on the market;

buy_rust - RUST purchases are deactivated on the market.

A trade-locked listing can be bought only by exact item_id and only with allow_trade_locked. The opt-in confirms that you saw unlock_at and accept delayed delivery. Without it the purchase is refused: "trade-locked listing: pass allow_trade_locked=1 to confirm delayed delivery". You are charged in full at purchase time. There is no endpoint to cancel a reservation. A successful hold purchase adds purchase_status "reserved", unlock_at, and send_until (RFC 3339 UTC). Regular purchases omit those fields. GET /v1/buy-one-p2p-name never sells hold items.

Prices are integers. `1000` = `1 USD`.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `api` | query | string | required | Your [WAXPEER API](https://waxpeer.com/profile/user) |
| `project_id` | query | string | optional | Your unique ID (string [50])  Allows to track your trades by project_id via /check-many-project-id |
| `item_id` | query | string | required | Item id from fetching our items |
| `token` | query | string | required | Token parameter from Steam tradelink |
| `price` | query | number | required | Item price (1000 = 1$) |
| `partner` | query | string | required | Partner parameter from Steam tradelink |
| `allow_trade_locked` | query | string | optional | 1: buy a trade-locked listing. Confirms you saw unlock_at and accept delayed delivery. Without it the purchase is refused. |

## Example (curl)

```bash
curl -X GET 'https://api.waxpeer.com/v1/buy-one-p2p?api=%7B%7BAPI_KEY%7D%7D&project_id=my-shop-order-123&item_id=17441538677&token=oFvyi0Ma&price=15000&partner=378049039'
```

## Example response

```json
{
  "success": true,
  "id": 1,
  "msg": "buy_csgo",
  "price": 1000,
  "purchase_status": "reserved",
  "unlock_at": "2026-08-04T12:00:00Z",
  "send_until": "2026-08-05T12:00:00Z"
}
```

## Responses

- `200` successful operation

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `success` | boolean | optional | Weather or not we bought the item |
| `id` | number | optional | Id of the item |
| `msg` | enum | optional | When success is false will let you know the reason.  Ex: buy_csgo Meaning that csgo buying has been disabled |
| `price` | number | optional | Price of the item (1000 = 1$) |
| `purchase_status` | string | optional | reserved on a successful trade-locked purchase. Omitted on a regular purchase. |
| `unlock_at` | string | optional | When the Steam trade lock ends. Delivery starts after this. RFC 3339 UTC. Present only on a trade-locked listing returned with include_hold. Regular listings omit this field. |
| `send_until` | string | optional | Delivery deadline. If the item is not delivered by then, the trade fails and you are refunded in full. RFC 3339 UTC. Present only on a trade-locked listing. Regular listings omit this field. |


## Notes for agents

- Auth is the query parameter `api`, not an Authorization header.
- See [/statuses.md](/statuses.md) for numeric trade status plus `escrow_status` / `release_date`.
- Prefer GET /v2/search-items-by-name over v1.
- Prefer GET /v2/get-items-list over v1 (cursor keyset pagination without the 5000 row cap). Pass next_cursor only while has_more is true.
- Prefer POST /v2/my-history over v1 (faster on long histories, ordered by trade id). On buy rows, price is the amount you paid.
- Trade-locked listings are omitted unless you pass include_hold=1. They then include unlock_at and send_until (RFC 3339 UTC).
- Buy a trade-locked listing only by exact item_id with allow_trade_locked (query 1 on GET /v1/buy-one-p2p, body true on POST /v1/buy). GET /v1/buy-one-p2p-name never sells hold items.
- CSV snapshot: GET /v1/prices/snapshot?format=csv (gzip). include_hold appends unlock_at,send_until. compact and whitemarket are JSON-only.
- Do not use GET /v1/ready-to-transfer-p2p; use the [trade websocket](/websocket.md).
