# Open buy orders by item name, or your own (v2)

`GET /v2/buy-orders`

Public list (no own): open orders for up to 50 item names in one game (default csgo), highest price first, then oldest. Only orders whose owner can pay for one item are listed. Each order has by (the owner&#39;s user id) and no dates. 100 orders per page, skip up to 2000. Answers are cached for 1 second.


Filtered orders are listed with their filters and allow_trade_locked: an order with filters buys only matching copies, so compare them with your item before you treat its price as an offer for it. filters is null on a plain order.


Your orders (own=1): all your open orders, funded or not, newest first, with created, last_update and the total count. game and name narrow the list when given. 100 per page, skip up to 10000.


Errors. Refusals are HTTP 200 with {"success": false, "msg": "…", "code": "…"}. Branch on code: it is stable, msg is human text. Codes this method answers: invalid_request, error. The full list is on [POST /v2/create-buy-order](/api/buy-order/create-buy-order-v2). A missing or wrong API key is HTTP 403; the write rate limit is HTTP 429.

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `api` | query | string | required | Your [WAXPEER API key](https://waxpeer.com/profile/user?tab=security) |
| `name` | query | array<string> | optional | Item name; repeat for several (up to 50). Required without own |
| `own` | query | enum | optional | 1: return your own open orders |
| `game` | query | enum | optional | csgo, dota2, rust or tf2. Public list: default csgo. own=1: all games by default |
| `skip` | query | integer | optional | Orders to skip (100 per page). Up to 2000, or 10000 with own=1 |

## Example (curl)

```bash
curl -X GET 'https://api.waxpeer.com/v2/buy-orders?api=%7B%7BAPI_KEY%7D%7D&name=AK-47+%7C+Redline+%28Field-Tested%29&own=0&game=csgo&skip=0'
```

## Example response

```json
{
  "success": true,
  "orders": [
    {
      "id": 123,
      "name": "AK-47 | Redline (Field-Tested)",
      "game": "csgo",
      "price": 12500,
      "amount": 3,
      "filled": 1,
      "allow_trade_locked": false,
      "filters": {
        "float_min": 0.15,
        "float_max": 0.18,
        "paint_seeds": [
          661,
          670
        ],
        "stickers": [
          {
            "id": 4777,
            "slot": 0
          },
          {
            "id": 55
          }
        ]
      },
      "by": "1247ffd5-f437-4a30-9953-10eda7df6e17"
    },
    {
      "id": 98,
      "name": "AK-47 | Redline (Field-Tested)",
      "game": "csgo",
      "price": 11000,
      "amount": 10,
      "filled": 0,
      "allow_trade_locked": true,
      "filters": null,
      "by": "5f0c2a1e-7d3b-4c61-9a8e-2b7f1c9d4e05"
    }
  ]
}
```

## Responses

- `200` Successful operation or refusal

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `success` | boolean | optional | Whether the operation succeeded |
| `orders` | array<object> | optional | Open orders |
| `orders.id` | integer | optional | Identifier |
| `orders.name` | string | optional | Item name; repeat for several (up to 50). Required without own |
| `orders.game` | string | optional | csgo, dota2, rust or tf2. Public list: default csgo. own=1: all games by default |
| `orders.price` | integer | optional | Item price in integer format (1000 = $1.00 USD) |
| `orders.amount` | integer | optional | Number of items |
| `orders.filled` | integer | optional | How many items were bought so far |
| `orders.allow_trade_locked` | boolean | optional | true: the order also buys trade-locked listings |
| `orders.filters` | object | optional | CS2 only. Which copies the order buys; null on a plain order. Unset filters are omitted, and an unknown key is refused. |
| `orders.filters.float_min` | number | optional | Lowest float, 0 to 1 |
| `orders.filters.float_max` | number | optional | Highest float, 0 to 1, not below float_min |
| `orders.filters.paint_seeds` | array<integer> | optional | 1 to 50 paint seeds (patterns), each 0 to 1000 |
| `orders.filters.phase` | enum | optional | Doppler phase name (e.g. Phase 1, Ruby, Emerald) |
| `orders.filters.stickers` | array<object> | optional | Applied stickers data |
| `orders.filters.stickers.id` | integer | required | Identifier |
| `orders.filters.stickers.slot` | integer | optional | Sticker slot 0 to 4; absent = any slot |
| `orders.filters.charm_id` | integer | optional | Charm id |
| `orders.filters.charm_pattern_min` | integer | optional | Lowest charm pattern, 0 to 100000 |
| `orders.filters.charm_pattern_max` | integer | optional | Highest charm pattern, 0 to 100000 |
| `orders.by` | string | optional | Owner user id (public list only) |
| `orders.created` | string | optional | Creation timestamp |
| `orders.last_update` | string | optional | When the order last changed. Not in the public list |
| `count` | integer | optional | Total of your open orders (own=1 only) |
| `msg` | string | optional | Why the request was refused (only when success is false) |
| `code` | enum | optional | Stable refusal code (only when success is false) |


## Notes for agents

- Auth is the query parameter `api`, not an Authorization header.
- See [/statuses.md](/statuses.md) for numeric trade status plus `is_released` / `release_date`. `escrow_status` is site-only.
- 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.
- POST /v2/my-history: status (number or array) and reason (string or array) filters need start and end at most 31 days apart. Every trade has reason, reversed_by (buyer / seller / null) and penalties (null when nothing was charged)
- POST /v1/check-availability: up to 1000 item_ids in a JSON body (send strings). Each listing for sale returns its CSV snapshot fields plus float, paint_index, phase, sticker_names, read live. include_hold / include_manual as on the CSV
- Socket.IO game item events carry inspect (Steam inspect link, null when none) and delivery (instant / regular / hold / manual)
- Buy orders: use the /v2 routes. POST /v2/create-buy-order takes a JSON body (name, game, price, amount 1 to 250, allow_trade_locked, and CS2 filters: float_min/float_max, paint_seeds, phase, stickers (id, slot), charm_id, charm_pattern_min/max); api stays in the query. Orders fill automatically from listings at or below the price.
- Buy-order refusals are HTTP 200 `success: false` + `msg` + `code`: branch on `code` (price_above_balance, exposure_limit when open orders would exceed 10 × balance, too_many_orders at 1000 open, invalid_amount, invalid_filters, …). Create, edit and both removals share 10 writes per 10 seconds (HTTP 429).
- The v1 buy-order paths are deprecated and answer with the v2 contract; successful v1 answers also keep v1 field names (`offers` next to `orders`, `id`, `count`, `item_name`). Public lists include filtered orders: compare `filters` with the item before reading an order price as an offer for it. In GET /v2/buy-order-history, kind=cancelled with reason=insufficient_funds means the balance could not pay.
- 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). Shared header `item_id,name,price,auto,inspect,unlock_at,send_until,class_id,instance_id,steam_id,merchant,delivery`. include_hold=1 adds trade-locked rows (fills unlock_at/send_until; delivery=hold). include_manual=1 adds 12h manual P2P rows (delivery=manual; merchant empty on those rows). compact is JSON-only.
- Do not use GET /v1/ready-to-transfer-p2p; use the [trade websocket](/websocket.md).
