Skip to main content
Merchant-facing equivalent of POST /client/trading/withdraw/quick. Instead of naming specific listings, you pass an itemId, a per-unit ceiling, and an amount — AssetPay buys the cheapest available listings at or below your ceiling and delivers them to the supplied tradeUrl. The merchant’s USD wallet is debited. Available for CS2 and Rust. Other games are rejected with QUICK_BUY_UNSUPPORTED_GAME (32). For Rust, phase and delivery: "instant" are not available (CS2-only options). Authentication: Merchant API Key (api-key header) Scope: CORE_ACCESS

Request

Body Parameters

* Provide either itemId or marketHashName.

Response

Returns a full Trade object with source: "self". As with the client quick withdrawal, items contains one pre-filled row per requested unit (carrying the ceiling price + delivery, same minimal shape as a standard buy item) and totalPrice is the worst-case lock (amount × maxPrice). Each row is bound to a real listing as fills arrive; unfilled rows go to failed and the unfilled / below-ceiling remainder is refunded — all asynchronously via the trade webhook. Once settled, totalPrice reflects the actual spend.

How the wallet debit works

The merchant’s available wallet balance must cover the worst-case lock (amount × maxPrice) at the time of the call. The funds are locked immediately; on each fill the sourcing portion settles to HOUSE and the AssetPay fee to HOUSE_FEES, and the unfilled units plus any below-ceiling savings are released back to your balance.

The initiated approval callback also fires

/secure/buy/quick reuses the same approval pipeline as the client quick withdrawal. After the trade is created (status initiated), AssetPay sends an approval callback with trade.source === "self". The trade does not proceed until you respond — note the callback carries the pre-filled rows (each at the ceiling price) and the worst-case totalPrice, since the actual fills aren’t known yet.
  • To auto-approve your own self-trades, return 2xx whenever trade.source === "self".
  • To reject, respond with 4xx; the trade is failed and the wallet lock is released.
  • Self-trade quick buys still require an active callback URL — without one the call fails immediately with MERCHANT_NO_CALLBACK_URL (1705).

Rate Limits

Errors

Same set as POST /client/trading/withdraw/quick. Common: QUICK_BUY_UNSUPPORTED_GAME (32, unsupported game), MERCHANT_BALANCE_LOW (12), MERCHANT_NO_CALLBACK_URL (1705), INVALID_TRADEURL (13), INSUFFICIENT_STOCK (42, Rust: nothing sourceable at or below maxPrice), VALIDATION_FAILED (1001).