Catalog
Two endpoints on this page: paginated listing and exact-name search. For the bulk snapshot
see Full dump.
All require Authorization: Bearer mer_live_… (Authentication).
List items
GET /api/v1/merchant/itemsCursor-paginated. Provider economics (provider_id, provider_price, markup) are not
exposed — only the price you pay.
Query parameters
| Name | Type | Default | Notes |
|---|---|---|---|
cursor | string | — | Pass next_cursor from a previous response. |
limit | int | 50 | 1–200. |
market_hash_name | string | — | Exact match on the canonical Steam name. |
min_price | number | — | USD, ≤ 2 decimals. |
max_price | number | — | |
category | string | — | rifle / knife / sticker / case / etc. Exact match. |
exterior | string | — | Factory New, Field-Tested, etc. Exact match. |
rarity | string | — | covert, classified, etc. Exact match. |
min_float | number | — | 0.0–1.0. |
max_float | number | — | |
delivery_type | enum | — | instant / manual. Unknown values are ignored. |
sort | enum | price_asc | price_asc / price_desc. Unknown → 400 MERCHANT_INVALID_SORT. |
Example
curl "https://api.tradeon.market/api/v1/merchant/items?limit=2&max_price=50&sort=price_asc" \
-H "Authorization: Bearer mer_live_…"{
"items": [
{
"id": "8e42bb9c-2e11-4d40-9d51-6e5d2d4b2cf1",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"image_url": "https://cdn.tradeon.market/items/ak47-redline-ft.png",
"price": 18.40,
"exterior": "Field-Tested",
"exterior_code": "FT",
"float": 0.2451,
"paint_seed": 462,
"paint_index": 316,
"inspect_url": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20...",
"asset_id": "38947116503",
"steam_id": null,
"class_id": "9385506221",
"instance_id": "188530139",
"is_stat_trak": false,
"is_souvenir": false,
"has_stickers": false,
"stickers_count": 0,
"category": "rifle",
"weapon_type": "AK-47",
"rarity": "classified",
"rarity_color": "#d32ce6",
"delivery_type": "instant",
"estimated_delivery_minutes": 2
}
],
"next_cursor": "eyJQcmljZSI6MTguNCwiSWQiOiI4ZTQyYmI5Yy0yZTExLTRkNDAtOWQ1MS02ZTVkMmQ0YjJjZjEifQ=="
}next_cursor is null when you have reached the end. The cursor is opaque — pass it back
unchanged (Conventions → Pagination).
Search by name
GET /api/v1/merchant/items/search?market_hash_name=...“Find me a copy of this skin under $X with float in [Y, Z]”. Indexed lookup, sub-50 ms.
Query parameters
| Name | Type | Required | Notes |
|---|---|---|---|
market_hash_name | string | yes | Exact Steam name match. |
max_price | number | no | USD. |
min_float | number | no | 0.0–1.0. |
max_float | number | no | |
delivery_type | enum | no | instant / manual. |
limit | int | no | 1–50, default 10. |
Example
curl "https://api.tradeon.market/api/v1/merchant/items/search?market_hash_name=AWP%20%7C%20Asiimov%20(Field-Tested)&max_price=80&limit=3" \
-H "Authorization: Bearer mer_live_…"{
"results": [
{
"id": "0a61fcb4-7c5f-4a93-91d2-1e1f0a8a8a3a",
"market_hash_name": "AWP | Asiimov (Field-Tested)",
"price": 73.20,
"float": 0.2199,
"is_stat_trak": false,
"is_souvenir": false,
"has_stickers": false,
"stickers_count": 0,
"delivery_type": "instant",
"estimated_delivery_minutes": 2
}
]
}Errors
| HTTP | code | When |
|---|---|---|
| 400 | MERCHANT_INVALID_QUERY | market_hash_name missing. |
| 400 | MERCHANT_INVALID_SORT | sort not one of price_asc, price_desc (/items only). |
CatalogItem schema
| Field | Type | Notes |
|---|---|---|
id | uuid | Use as item_id in POST /merchant/buy. |
market_hash_name | string | Canonical Steam name. |
image_url | string | null | CDN URL. |
price | decimal (USD) | The price you pay if you buy now (subject to max_price). |
exterior / exterior_code | string | null | e.g. "Field-Tested" / "FT". |
float | decimal | null | 0.0–1.0. |
paint_seed | int | null | Pattern index. Skins only. |
paint_index | int | null | Paint kit index. Skins only. Returned by most providers; null otherwise. |
inspect_url | string | null | Steam in-game inspect link. Available for most items; null otherwise. Describes the item while in the supplier’s stock — it is not a stable key, may change on re-sync. |
asset_id | string | null | Steam asset ID in the supplier’s stock. Supplier-side and volatile — Steam mints a new asset ID on every trade, so this identifies the item while it sits in the supplier’s inventory, not after delivery. Returned for most items; null otherwise. String (can exceed 2⁵³). |
steam_id | string | null | Steam64 of the account holding the item in the supplier’s stock (a bot/seller account) — not the final buyer, and not your account. Returned for a minority of items (only some suppliers expose the holder); null otherwise. String. |
class_id | string | null | Steam economy class ID. Shared across all items of the same name/wear; stable per definition. Returned for most items; null otherwise. String. |
instance_id | string | null | Steam economy instance ID. Returned for most items; null otherwise. String. |
is_stat_trak | bool | |
is_souvenir | bool | |
has_stickers | bool | |
stickers_count | int | |
category | string | null | e.g. rifle, knife. |
weapon_type | string | null | e.g. AK-47. |
rarity / rarity_color | string | null | |
delivery_type | string | Indicative dispatch speed bucket. |
estimated_delivery_minutes | int | null | Indicative — bot scheduling and CS2 trade-cooldowns can extend it. |
Supplier-side identifiers.
asset_id,steam_id,class_idandinstance_iddescribe the item as it sits in the supplier’s stock, before delivery. They are not your inventory coordinates: on every trade Steam assigns a freshasset_idand the item leaves the holding account, so treatasset_id/steam_idas volatile snapshot values useful for identifying a listing pre-purchase — not as stable keys.class_id/instance_idare stable Steam economy identifiers for the item definition. Coverage varies by source; expectnulland do not depend on any single field being present.