The Deposit Flow
1
Fetch inventory
Call
GET /client/inventory to get the user’s tradeable items with current offer prices.2
User selects items
Display the inventory in your UI. The user picks one or more items to sell.
3
Initiate deposit
Call
POST /client/trading/deposit with the selected items and their offer prices.4
Trade offer sent
AssetPay creates a Steam trade offer for the user. The trade may pass through
pending while the bot confirms the offer, then moves to active, sitting in the user’s Steam inbox awaiting acceptance.5
User accepts
The user accepts the trade offer in Steam. The trade moves to
hold.6
Hold period (CS2 only)
For CS2, Steam enforces a 7-day trade protection period. The trade stays in
hold until it ends. Rust trades skip this step entirely and transition active → completed directly.7
Completed
After the hold period (CS2) or immediately after acceptance (Rust), the trade reaches
completed. You receive a callback and credit the user’s balance.Single-Item Deposit
Multi-Item Deposit
You can deposit multiple items in a single trade. Pass them all in theitems array:
amount defaults to 1. Rust items and items routed to a deposit provider only accept amount: 1; a larger amount is rejected with EXCEEDS_MAX_AMOUNT.
A basket can be split into several trades internally (for example when some items are routed to a deposit provider). Each trade gets its own Steam offer and callbacks; the response is the largest trade, with the others in relatedTrades[], and only that primary trade carries your externalId. See Split baskets.
Request Fields
Rate Limits
Two layers apply to/client/trading/deposit:
- Per-merchant tier throttle (shared across all clients): 500 req/min verified, 5 req/min unverified.
- Per-client guard (scoped per merchant + client Steam ID):
- Max 5 concurrent active deposits (not-yet-accepted:
initiated | pending | active), rejected withTOO_MANY_ACTIVE_TRADES(HTTP 429). - Max 10 deposits per 5-minute rolling window, rejected with
RATE_LIMITED(HTTP 429).
- Max 5 concurrent active deposits (not-yet-accepted:
Response
The response contains the full trade object:Instant Deposits
isInstant defaults to false, so a CS2 deposit is fully held unless you ask for instant credit. Sending isInstant: true fails with INSTANT_DEPOSITS_DISABLED if instant deposits are off for your account. When instant credit applies, AssetPay calculates how much of the deposit value can be credited instantly based on collateral, rather than waiting for the full 7-day hold period. Rust deposits are never split: they carry preCredit equal to totalPrice and pendingCredit 0, and are credited in full on completed.
The split is decided when the deposit is created, so the creation response already includes:
preCredit- the amount credited instantly (USD) once the trade entersholdpendingCredit- the remaining amount held until the hold period endscollateral- breakdown of collateral sources
preCredit from the start and pendingCredit once the trade enters hold (on Rust, once it reaches completed). collateral is only on the creation response; callbacks never include it.
If isInstant is false or omitted, the entire amount waits until completed.
The collateral field in the inventory response tells you the total instant credit available for that user before they start depositing.
External ID
TheexternalId field is your own tracking identifier. Use it to link AssetPay trades back to records in your system.
Balance Handling for Deposits
When to credit:
When NOT to credit:
See the Callbacks guide for full details on processing each event.