Buy in bulk
POST/v1/market/items/{slug}/buy
Buys up to 100 of an item's cheapest lots in one go, each at its own price and none dearer than max_price_cents, through the same filters as the listings. If fewer match, fewer are bought; if the balance doesn't cover them all, none are. Each lot becomes a deal of its own. The same Idempotency-Key answers with the same deals.
Request
Path parameters
slugstringrequiredThe item's slug, from a market card.
Headers
Idempotency-KeystringrequiredAny unique string for this purchase. Use a new one for each purchase, and the same one when you retry.
Request body
max_price_centsintegerrequiredThe most one lot may cost, in US cents.
quantityintegerrequiredHow many lots to buy, from 1 to 100.
filterobjectrequiredWhich lots count, as the filters of the listings. An empty field narrows nothing.
Fields of filter
phasestringThe phase of a Doppler or Gamma Doppler.
stickersstringwith or without.
One of
withwithoutfloat_minnumberThe lowest float.
float_maxnumberThe highest float.
paint_seedintegerOne paint seed.
curl -X POST 'https://api.rockvel.store/v1/market/items/ak-47-redline-field-tested/buy' \
-H "Authorization: Bearer $ROCKVEL_KEY" \
-H 'Idempotency-Key: 3c7e9a41-5d2b-4f86-b0e3-91a6d4c8f257' \
-H 'Content-Type: application/json' \
-d '{"max_price_cents":3300,"quantity":3,"filter":{"stickers":"with"}}'Answer 201
A list of objects with these fields.
idstringThe deal's id.
numberstringThe deal's short number, the end of its id. Both sides see it, and the trade offer's message names it.
rolestringYour side of the deal.
One of
buyersellerstatusstringWhere the deal stands.
One of
paidsentprotectedsettledcancelledfailedrolled_backdisputedreasonstringoptionalWhy it ended up here, when there is a reason.
item_slugstringThe item's slug.
itemobjectThe item as the lot showed it.
Fields of item
asset_idstringSteam's id of this very item. It changes when the item changes hands.
namestringName as Steam shows it.
market_hash_namestringName on the Steam market. A market card has one for each.
image_urlstringSteam's icon of the item.
kindstringWhat sort of item it is.
One of
weaponknifeglovesagentstickerpatchcharmgraffitimusic_kitcontainercollectibleotherraritystringoptionalRarity in Steam's words.
exteriorstringoptionalExterior as a code: FN, MW, FT, WW or BS.
stattrakbooleanoptionalThe item is StatTrak.
souvenirbooleanoptionalThe item is a Souvenir.
marketablebooleanSteam lets this item be sold on its own market.
floatnumberoptionalFloat value, from 0 to 1. Left out for items without one.
paint_seedintegeroptionalPaint seed, from 0 to 1000.
kill_countintegeroptionalStatTrak's count of kills.
paint_indexintegeroptionalThe paint's number in the game.
def_indexintegeroptionalThe weapon's number in the game.
phasestringoptionalThe phase of a Doppler or Gamma Doppler.
name_tagstringoptionalThe name tag on the item.
inspect_linkstringoptionalOpens the item in the game.
highlight_urlstringoptionalVideo of a souvenir charm's moment.
stickersobject[]optionalStickers on the item, and patches on an agent.
Fields of stickers
idintegeroptionalIts number in the game.
namestringIts name.
image_urlstringoptionalIts picture.
slotintegerWhich place on the item it takes.
wearnumberoptionalHow scraped it is, 0 for intact.
scalenumberoptionalIts scale, as the game places it.
rotationnumberoptionalIts rotation, as the game places it.
offset_xnumberoptionalIts offset along x, as the game places it.
offset_ynumberoptionalIts offset along y, as the game places it.
offset_znumberoptionalIts offset along z, as the game places it.
tint_idintegeroptionalIts tint's number in the game.
patternintegeroptionalThe pattern of a charm.
highlightintegeroptionalThe moment on a souvenir charm.
keychainsobject[]optionalCharms on the item.
Fields of keychains
idintegeroptionalIts number in the game.
namestringIts name.
image_urlstringoptionalIts picture.
slotintegerWhich place on the item it takes.
wearnumberoptionalHow scraped it is, 0 for intact.
scalenumberoptionalIts scale, as the game places it.
rotationnumberoptionalIts rotation, as the game places it.
offset_xnumberoptionalIts offset along x, as the game places it.
offset_ynumberoptionalIts offset along y, as the game places it.
offset_znumberoptionalIts offset along z, as the game places it.
tint_idintegeroptionalIts tint's number in the game.
patternintegeroptionalThe pattern of a charm.
highlightintegeroptionalThe moment on a souvenir charm.
tagsobject[]optionalAll the labels Steam gives the item.
Fields of tags
categorystringThe label's kind, such as Collection.
namestringThe label itself.
notesstring[]optionalSteam's lines about this item: its match, its date of issue, what a container holds.
referenceobjectoptionalA hint for your price: the cheapest lot of this name on lis-skins, of this phase for a Doppler. Float, pattern and stickers do not count in it. Only in your inventory and stall, and left out when lis-skins has no such lot.
Fields of reference
price_centsintegerThe price in US cents.
offersintegerHow many lots of this name, or this phase, lis-skins has.
price_centsintegerThe price in US cents.
fee_centsintegerThe seller's fee: 1.5% of the price, rounded up to a cent.
offer_idstringoptionalThe Steam offer, once there is one.
groupstringThe same for deals that go to the buyer in one trade offer: the offer's id once there is one, before that a key that says nothing of the two sides.
actionsstring[]What you can do with the deal now.
One of
sendcancelclose_offerdisputepartnerobjectoptionalThe other side of the deal: its Steam ID always, and in the list of deals also what Steam shows of them.
Fields of partner
steam_idstringTheir SteamID64.
namestringoptionalTheir name on Steam now.
avatar_urlstringoptionalTheir avatar on Steam now.
member_sincedate-timeoptionalWhen their Steam account was made, unless the profile is private.
levelintegeroptionalTheir Steam level now, for the other side of a deal under way, unless the profile is private. Check it in Steam Guard: an account made up to look like them cannot copy it.
service_yearsintegeroptionalTheir Years of Service badge on Steam, as Steam counts it, with the level.
service_xpintegeroptionalThe XP of that badge.
paid_atdate-timeWhen the lot was bought.
sent_atdate-timeoptionalWhen the buyer could first accept the offer.
accepted_atdate-timeoptionalWhen the item changed hands.
finished_atdate-timeoptionalWhen the deal ended.
deadline_atdate-timeoptionalWhen the deal moves on by itself.
buyer_cancels_atdate-timeoptionalWhen the buyer can cancel. Left out once that time has come.
[
{
"id": "019a4c1e-6f3a-7c21-9d40-5b2e8f1a7c03",
"number": "",
"role": "buyer",
"status": "paid",
"item_slug": "ak-47-redline-field-tested",
"item": {
"asset_id": "54267934219",
"name": "AK-47 | Redline (Field-Tested)",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"image_url": "https://community.akamai.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGIGz3UqlXOLrxM-vMGmW8VNxu5Dx60noTyLwlcK3wiFO0POlPPNSI_-RHGavzOtyufRkASq2lkxx4W-HnNyqJC3FZwYoC5p0Q7FfthW6wdWxPu-371Pdit5HnyXgznQeHYY5wyA",
"kind": "weapon",
"rarity": "Classified Rifle",
"exterior": "FT",
"marketable": true,
"float": 0.2613,
"paint_seed": 412,
"paint_index": 282,
"def_index": 7,
"inspect_link": "steam://run/730//+csgo_econ_action_preview%2006168DEAFD92CC071E0E26F0072E0536023EE1",
"stickers": [
{
"id": 1693,
"name": "Sticker | Crown (Foil)",
"slot": 1,
"wear": 0.08
}
],
"tags": [
{ "category": "Type", "name": "Rifle" },
{ "category": "Weapon", "name": "AK-47" },
{
"category": "Collection",
"name": "The Phoenix Collection"
},
{
"category": "Quality",
"name": "Classified Rifle"
},
{
"category": "Exterior",
"name": "Field-Tested"
}
]
},
"price_cents": 3250,
"fee_cents": 49,
"group": "b7e41c09d2a6",
"actions": [],
"paid_at": "2026-11-02T09:41:17Z",
"deadline_at": "2026-11-02T21:41:17Z",
"buyer_cancels_at": "2026-11-02T10:11:17Z"
}
]Refusals
| Status | Code | When |
|---|---|---|
| 402 | not_enough_money | The balance doesn't cover the price. |
| 403 | banned | This account can't start anything new on Rockvel. |
| 409 | no_trade_url | Set your trade link first. |
| 409 | none_match | No lot matches the price and filters now. |
| 422 | bad_lot | The list is empty, a price is outside 3 to 100000000 cents, or a filter is outside its range. |
| 422 | too_many_lots | More than 100 items in one request. |
Any route can also answer with the statuses on the Errors page.