Skip to main content
Merchant-facing equivalent of POST /client/trading/withdraw. AssetPay sources the listings from the upstream marketplace and delivers them to the supplied tradeUrl. The merchant’s USD wallet is debited. Authentication: Merchant API Key (api-key header) Scope: CORE_ACCESS

Request

Body Parameters

Response

Returns a full Trade object with source: "self". On initiated, each item only carries the data you submitted (itemId, offer.price) — Steam-side fields like name, marketHashName, type, and iconUrl are omitted until they resolve.

How the wallet debit works

The merchant’s available wallet balance must cover totalPrice at the time of the call. The funds are locked immediately; on failure they’re released, on success the sourcing portion settles to HOUSE and the AssetPay fee to HOUSE_FEES.

The initiated approval callback also fires

/secure/buy reuses the same approval pipeline as the client withdraw flow. After the trade is created (status initiated), AssetPay sends an approval callback to your registered callback URL with trade.source === "self". The trade does not proceed until you respond.
  • To auto-approve all your own self-trades, return 2xx whenever trade.source === "self" in your handler.
  • To reject (e.g. dry-run mode or operational kill-switch), respond with 4xx and the trade is failed and the wallet lock is released.
  • Self-trade buys still require an active callback URL on the merchant account — calling this endpoint without one fails immediately with MERCHANT_NO_CALLBACK_URL (1705).
This is different from /secure/sell, where there is no merchant-approval step at all. For /secure/buy, your callback handler must explicitly approve self-trades — there is no built-in bypass.

Rate Limits

Errors

Same set as POST /client/trading/withdraw. Common: MERCHANT_BALANCE_LOW (12), MERCHANT_NO_CALLBACK_URL (1705), LISTING_NOT_FOUND (14), PRICE_CHANGED (11), INVALID_TRADEURL (13).