Sync with Waxpeer session to auto-fill API key

Create a buy order with CS2 filters (v2)

POST/v2/create-buy-order

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
Prices are integers. 1000 = $1.00 USD.

Parameters

NameLocationTypeDescription
api
required
querystring

Request body

NameLocationTypeDescription
name
required
bodystring

Full item market hash name

game
optional
bodyenum

csgo (default), dota2, rust or tf2

enum: csgo, dota2, rust, tf2

price
required
bodyinteger

Highest price to pay per item, a positive whole number (1000 = $1)

amount
required
bodyinteger

How many items to buy, 1 to 250

allow_trade_locked
optional
bodyboolean

true: also buy trade-locked listings. Default false

filters
optional
bodyobject

CS2 only. Which copies to buy; null or absent for any copy

float_min
optional
bodynumber

Lowest float, 0 to 1

float_max
optional
bodynumber

Highest float, 0 to 1, not below float_min

paint_seeds
optional
bodyarray<integer>

1 to 50 paint seeds (patterns), each 0 to 1000

phase
optional
bodyenum

Doppler phase: Phase 1 to Phase 4, Ruby, Sapphire, Emerald or Black Pearl

enum: Phase 1, Phase 2, Phase 3, Phase 4, Ruby, Sapphire, Emerald, Black Pearl

stickers
optional
bodyarray<object>

1 to 5 stickers the item must have

id
required
bodyinteger

Sticker id

slot
optional
bodyinteger

Sticker slot 0 to 4; absent = any slot

charm_id
optional
bodyinteger

Charm id

charm_pattern_min
optional
bodyinteger

Lowest charm pattern, 0 to 100000

charm_pattern_max
optional
bodyinteger

Highest charm pattern, 0 to 100000, not below charm_pattern_min

Example
{
  "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

NameTypeDescription
success
optional
boolean

Whether the operation succeeded

order
optional
object

The placed order

id
optional
integer

Order id

name
optional
string

Full item market hash name

game
optional
string

csgo (default), dota2, rust or tf2

price
optional
integer

Highest price to pay per item, a positive whole number (1000 = $1)

amount
optional
integer

How many items to buy, 1 to 250

filled
optional
integer

How many items were bought so far

allow_trade_locked
optional
boolean

true: also buy trade-locked listings. Default false

filters
optional
object

CS2 only. Which copies to buy; null or absent for any copy

float_min
optional
number

Lowest float, 0 to 1

float_max
optional
number

Highest float, 0 to 1, not below float_min

paint_seeds
optional
array<integer>

1 to 50 paint seeds (patterns), each 0 to 1000

phase
optional
enum

Doppler phase: Phase 1 to Phase 4, Ruby, Sapphire, Emerald or Black Pearl

enum: Phase 1, Phase 2, Phase 3, Phase 4, Ruby, Sapphire, Emerald, Black Pearl

stickers
optional
array<object>

1 to 5 stickers the item must have

id
required
integer

Order id

slot
optional
integer

Sticker slot 0 to 4; absent = any slot

charm_id
optional
integer

Charm id

charm_pattern_min
optional
integer

Lowest charm pattern, 0 to 100000

charm_pattern_max
optional
integer

Highest charm pattern, 0 to 100000, not below charm_pattern_min

by
optional
string

Waxpeer user ID (found in /user)

created
optional
string

When the order was placed (RFC 3339)

last_update
optional
string

When the order last changed (RFC 3339)

msg
optional
string

Why the request was refused (only when success is false)

code
optional
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

Response
{
  "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

NameTypeDescription
success
optional
boolean

Whether the operation succeeded

msg
optional
string

Why the request was refused (only when success is false)

code
optional
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

Response
{
  "success": false,
  "msg": "Invalid request",
  "code": "invalid_request"
}

429 Too many requests. Rate limit exceeded

NameTypeDescription
success
optional
boolean

Whether the operation succeeded

msg
optional
string

Why the request was refused (only when success is false)

msBeforeNext
optional
number

Milliseconds before next allowed request

Response
{
  "success": false,
  "msg": "string",
  "msBeforeNext": 0
}