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).