Skip to content

Get Prices

POST /api/v1/merchant/get-prices

Fetches best prices for items by market hash name — no Steam inventory lookup required. Used in the hash-name integration flow as the first step before creating a deposit.

By default, this endpoint also creates a draft trade record (status: new) that locks in for 5 minutes. You then commit the trade with Create Deposit by Hash Name using the returned id.

Request

Headers

HeaderRequiredDescription
X-Api-KeyYour merchant API key
Content-Typeapplication/json

Body

ParameterTypeRequiredDescription
gamestringGame code: csgo, rust, dota2, tf2
marketHashNamesstring[]Item market hash names. Min 1, max 2000 entries
no_deposit_intentbooleanWhen true, only fetches prices and does not create a trade record. Default false

Response

json
{
  "success": true,
  "message": "Prices fetched successfully",
  "data": {
    "id": 742,
    "total": 2,
    "sum": 45.50,
    "items": [
      {
        "name": "AK-47 | Redline (Field-Tested)",
        "price": 22.75,
        "originalPrice": 23.10
      },
      {
        "name": "AWP | Asiimov (Field-Tested)",
        "price": 22.75,
        "originalPrice": 23.10
      }
    ]
  }
}

Response Fields

FieldTypeDescription
idintegerInternal trade ID — pass to create-deposit-by-hash-name. Omitted when no_deposit_intent=true
totalintegerNumber of priced items returned
sumnumberTotal of all price values (USD)
itemsarrayPriced items
items[].namestringMarket hash name (echoed)
items[].pricenumberFinal price after multipliers (USD) — what the merchant will pay out
items[].originalPricenumberRaw price before multipliers (USD)

INFO

The id field is the trade ID. When you call create-deposit-by-hash-name, you must reuse this id and supply your own merchant_tx_id at that step (it is not captured here).

Quote validity

The trade record is valid for 5 minutes. If you call create-deposit-by-hash-name after that window, the request will fail with an inventory_reload validation error and you must call get-prices again.

no_deposit_intent

Use no_deposit_intent: true for price discovery (e.g., showing a quote on your UI before the user commits). No trade record is created and no id is returned. When you're ready to actually deposit, call get-prices again with no_deposit_intent: false (or omit the field) to lock in the price.

Empty Inventory

If we can't price the requested items, the trade record (if any) is automatically deleted and the response returns total: 0, sum: 0, items: null. No id is included.

Example

bash
curl -X POST https://api.skinslink.com/api/v1/merchant/get-prices \
  -H "X-Api-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "game": "csgo",
    "marketHashNames": [
      "AK-47 | Redline (Field-Tested)",
      "AWP | Asiimov (Field-Tested)"
    ]
  }'

Price-only quote (no trade record)

bash
curl -X POST https://api.skinslink.com/api/v1/merchant/get-prices \
  -H "X-Api-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "game": "csgo",
    "marketHashNames": ["AK-47 | Redline (Field-Tested)"],
    "no_deposit_intent": true
  }'

Errors

StatusMessageCause
400invalid request bodyMalformed JSON
400validation errorMissing or invalid fields (see data array — e.g. marketHashNames exceeds 2000, game not in allowed set)
401missing authorization headerX-Api-Key header not provided
401invalid API keyAPI key not found or inactive
403merchant account is disabledMerchant account deactivated
403IP not whitelisted: <ip>Request IP not in merchant's allowed list
408timeout errorUpstream pricing service timed out — retry
500integration service errorInventory service returned a 5xx error — retry
500internal errorUnexpected server error — retry
502bad gatewayUpstream service unreachable — retry

→ For domain-specific validation codes, see Errors.