Create a buy order with CS2 filters (v2)
Place an order to buy up to amount copies of one item at up to price each. The order is a JSON body; api stays in the query.
How an order fills. Every listing of the item at or below your price is bought for you automatically, at the listing's price, and sent to your saved tradelink, as POST /v1/buy would. Listings already for sale are checked as soon as the order is placed, new and updated listings as they appear. When several orders want the same listing, the highest price wins, then the oldest order; editing an order keeps its place. Each fill buys one listing and adds 1 to filled; the order closes when filled reaches amount. Trade-locked listings are bought only when allow_trade_locked is true.
Filters (CS2 only). filters limits which copies the order buys: a float range, paint seeds, a Doppler phase, stickers (each optionally in a slot) and a charm (optionally with a pattern range). Leave filters out or send null for a plain order; inside it, leave out what you do not filter on. An unknown key in filters is refused, so a typo never places a plain order at a filtered price. Stickers are matched once the listing's stickers are known; check them on the trade offer.
Limits. amount is 1 to 250 and price a positive whole number (1000 = $1). The unit price must not exceed your balance, all your open orders together (Σ price × (amount − filled)) must not exceed 10 × your balance, and you can have at most 1000 open orders. The price must be at least 30% of the item's Steam average. KYC and a saved tradelink that can receive the game are required. You can place any number of orders for the same item.
Not enough balance. When a fill finds that your balance cannot pay for the listing, the order is cancelled and the listing goes to the next order. The cancellation is in GET /v2/buy-order-history with kind = cancelled and reason = insufficient_funds.
Notifications. A fill and a no-funds cancellation each send one message: to Telegram, else Discord (whichever you marked main goes first), else a mobile push. A fill also sends an email when your notification settings allow it. A run of no-funds cancellations sends one message, not one per order, until your balance changes.
Rate limit. Create, edit and both removals share one budget: 10 requests per 10 seconds per account, on the v1 and v2 paths together. Over it the answer is HTTP 429 with Retry-After and msBeforeNext.
Errors. Refusals are HTTP 200 with {"success": false, "msg": "…", "code": "…"}. Branch on code: it is stable, msg is human text. A missing or wrong API key is HTTP 403.
code |
msg |
When |
|---|---|---|
invalid_request |
Invalid request, or the field at fault (Missing name, Missing id, Missing ids, Invalid game, Invalid skip, Invalid limit, Invalid kind, Invalid sort, Too many items) |
A required field is missing or has the wrong type. A body that is not a JSON object is HTTP 400 with this code. |
invalid_price |
Invalid price |
price is not a positive whole number |
invalid_amount |
Amount must be between 1 and 250 |
amount is not a whole number from 1 to 250 |
invalid_filters |
Invalid filters, Filters are available for CS2 only, Invalid float range, Invalid paint seeds, Invalid phase, Invalid stickers, Invalid charm, Invalid charm pattern, Invalid allow_trade_locked |
A filter is out of range, unknown, or sent for a game other than csgo |
filters_not_editable |
Filters cannot be edited |
An edit sent filters or allow_trade_locked |
item_not_found |
No item found |
No item with this name in this game |
price_too_low |
Please increase your buy order price |
price is below 30% of the item's Steam average |
kyc_required |
You need to pass KYC verification |
Your account needs KYC |
tradelink_required |
Please save your tradelink |
No saved tradelink, or your Steam account cannot receive items of this game |
price_above_balance |
Price exceeds your balance |
price is above your balance |
exposure_limit |
Your open orders exceed 10x your balance |
Your open orders would exceed 10 × your balance |
too_many_orders |
You can have up to 1000 active buy orders |
You already have 1000 open orders |
order_not_found |
Offer not found |
No open order of yours with this id |
too_many_ids |
Too many ids |
More than 1000 ids |
busy |
Please try again |
Another write of your orders held them too long; retry |
error |
Something went wrong |
Any other failure |
Parameters
| Name | Location | Type | Description |
|---|---|---|---|
apirequired | query | string | Your WAXPEER API key |
Request body
| Name | Location | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
namerequired | body | string | Full item market hash name | ||||||||||||||||||||||||||||||||||||||||||||
gameoptional | body | enum | csgo (default), dota2, rust or tf2 enum: csgo, dota2, rust, tf2 | ||||||||||||||||||||||||||||||||||||||||||||
pricerequired | body | integer | Highest price to pay per item, a positive whole number (1000 = $1) | ||||||||||||||||||||||||||||||||||||||||||||
amountrequired | body | integer | How many items to buy, 1 to 250 | ||||||||||||||||||||||||||||||||||||||||||||
allow_trade_lockedoptional | body | boolean | true: also buy trade-locked listings. Default false | ||||||||||||||||||||||||||||||||||||||||||||
filtersoptional | body | object | CS2 only. Which copies to buy; null or absent for any copy | ||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||
{
"name": "AK-47 | Redline (Field-Tested)",
"game": "csgo",
"price": 12500,
"amount": 3,
"allow_trade_locked": false,
"filters": {
"float_min": 0.15,
"float_max": 0.18,
"paint_seeds": [
661,
670
],
"stickers": [
{
"id": 4777,
"slot": 0
},
{
"id": 55
}
]
}
}Responses
200 Successful operation or refusal
| Name | Type | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
successoptional | boolean | Whether the operation succeeded | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
orderoptional | object | The placed order | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
msgoptional | string | Why the request was refused (only when success is false) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
codeoptional | enum | Stable refusal code (only when success is false) enum: invalid_request, invalid_price, invalid_amount, invalid_filters, filters_not_editable, item_not_found, price_too_low, kyc_required, tradelink_required, price_above_balance, exposure_limit, too_many_orders, order_not_found, too_many_ids, busy, error | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{
"success": true,
"order": {
"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
}
]
},
"created": "2026-10-19T10:00:00Z",
"last_update": "2026-10-19T10:05:00Z"
}
}400 Body is not a JSON object
| Name | Type | Description |
|---|---|---|
successoptional | boolean | Whether the operation succeeded |
msgoptional | string | Why the request was refused (only when success is false) |
codeoptional | enum | Stable refusal code (only when success is false) enum: invalid_request, invalid_price, invalid_amount, invalid_filters, filters_not_editable, item_not_found, price_too_low, kyc_required, tradelink_required, price_above_balance, exposure_limit, too_many_orders, order_not_found, too_many_ids, busy, error |
{
"success": false,
"msg": "Invalid request",
"code": "invalid_request"
}429 Too many requests. Rate limit exceeded
| Name | Type | Description |
|---|---|---|
successoptional | boolean | Whether the operation succeeded |
msgoptional | string | Why the request was refused (only when success is false) |
msBeforeNextoptional | number | Milliseconds before next allowed request |
{
"success": false,
"msg": "string",
"msBeforeNext": 0
}