# Checking the status of many steam trades by project_id identifier

`GET /v1/check-many-project-id`

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `api` | query | string | required | Your [WAXPEER API](https://waxpeer.com/profile/user) |
| `id` | query | string | required | Your unique ID passed in /buy-one-p2p-name or /buy-one-p2p (for multiple ids pass it like this id=1&id=2&id=3, max 100 at once) |

## Example (curl)

```bash
curl -X GET 'https://api.waxpeer.com/v1/check-many-project-id?api=%7B%7BAPI_KEY%7D%7D&id=12345'
```

## Example response

```json
{
  "success": true,
  "msg": "Invalid ID",
  "trades": [
    {
      "id": 1,
      "price": 140,
      "name": "Nova | Sand Dune (Field-Tested)",
      "status": 4,
      "project_id": "My_custom_project_identifier_asgd6ad8sg68gasgas8d",
      "custom_id": "224bdce2-as44-5ae6-be3g-1a80500de23s",
      "trade_id": "3547735377",
      "done": false,
      "for_steamid64": "76561198338314XXX",
      "reason": "Buyer failed to accept",
      "seller_name": "turboTrade",
      "seller_avatar": "https://avatars.akamai.steamstatic.com/fef49e7fa7e1997310d705b2a6158ff8dc1cdfeb_medium.jpg",
      "seller_steam_joined": 1589314982,
      "seller_steam_level": 45,
      "send_until": 1566796475,
      "last_updated": 1566796111,
      "counter": 10,
      "is_released": false,
      "release_date": "2025-07-28T10:30:00.000Z",
      "penalties": {
        "rollback_fee": 3000,
        "rollback_penalty": 1500,
        "total_penalty": 4500
      },
      "stage": 11,
      "unlock_at": 1783166400
    }
  ]
}
```

## Responses

- `200` Returns information about withdraw

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `success` | boolean | optional |  |
| `msg` | string | optional | Usually null, but if something went wrong, you will get error message here and you need to retry the request |
| `trades` | array<object> | optional |  |
| `trades.id` | number | optional | Waxpeer id of trade obtained during executing buy request |
| `trades.price` | number | optional | Item price (1000 = 1$) |
| `trades.name` | string | optional | Item name |
| `trades.status` | number | optional | Status of the trade:   6->Declined and refunded  5->Completed  4->Trade sent and can be accepted  2->Waiting for seller to confirm trade on mobile  1->Processing and creating the trade  0->Waiting for user to buy more items and if the user doesn't buy more items then the status will automatically change with in a certain period |
| `trades.project_id` | string | optional | Project_id identifier (string [50]) |
| `trades.custom_id` | string | optional | Our system identifier (You can ignore) |
| `trades.trade_id` | string | optional | Recorded Steam trade id |
| `trades.done` | boolean | optional | Weather the trade is complete |
| `trades.for_steamid64` | string | optional | Your partners Steam id64 |
| `trades.reason` | string | optional | When the trade failed, we provide the reason: 'Buyer failed to accept', 'Seller failed to accept', 'Invalid buyer tradelink' |
| `trades.seller_name` | string | optional | Sellers name |
| `trades.seller_avatar` | string | optional | Sellers avatar |
| `trades.seller_steam_joined` | number | optional | When seller joined Steam (May be different if the item is purchased as a gift) |
| `trades.seller_steam_level` | number | optional | Sellers steam lvl (May be different if the item is purchased as a gift or seller upgraded lvl after last login) |
| `trades.send_until` | number | optional | Epoch seconds. Delivery deadline. On a trade-locked reservation this is the same clock as unlock_at. If the item is not delivered by then, the trade fails and you are refunded in full. |
| `trades.last_updated` | number | optional | Time when our system last checked the trade |
| `trades.counter` | number | optional | Our system counter (You can ignore) |
| `trades.is_released` | boolean | optional | Indicates whether the funds have been released after the 7-day hold period. When false with release_date present, the buyer has accepted the item but funds are on hold until release_date |
| `trades.release_date` | string | optional | The timestamp when funds will be released from hold and the trade will transition to final status. Only present when is_released is false and buyer has accepted the item |
| `trades.penalties` | object | optional | Rollback penalty information. Only present when the user is the buyer of a trade that was rolled back due to buyer fault (invalid tradelink, etc.) and rollback penalties were actually charged to the buyer's account |
| `trades.penalties.rollback_fee` | number | optional | 20% of item price charged as rollback fee |
| `trades.penalties.rollback_penalty` | number | optional | 10% of item price charged as additional penalty |
| `trades.penalties.total_penalty` | number | optional | Combined total (rollback_fee + rollback_penalty) |
| `trades.stage` | number | optional | 11: reserved, waiting for the Steam trade lock to expire. Any other value: the lock has expired and delivery is in progress. null on a regular trade that does not use this stage. |
| `trades.unlock_at` | number | optional | Epoch seconds when the Steam trade lock ends. Same format as send_until. null on a regular trade. After unlock_at, a webhook whose stage is not 11 means delivery has started. The final webhook has done: true — the item was delivered, or the webhook has a failure reason and you are refunded in full. |


## 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).
