Skip to content

Integration without UI (API Flow)

Full control over the deposit experience. Fetch inventory, display it on your site, and submit deposits directly.

Flow Overview

Your Platform                     Skinslink
─────────────                     ─────────
     │                                 │
     │  1. POST /merchant/inventory    │
     │ ──────────────────────────────► │
     │                                 │
     │  { items[], total, sum }        │
     │ ◄────────────────────────────── │
     │                                 │
     │  Display items to user,         │
     │  user selects items             │
     │                                 │
     │  2. POST /merchant/create-deposit
     │ ──────────────────────────────► │
     │                                 │
     │  { id, status, trade offer }    │
     │ ◄────────────────────────────── │
     │                                 │
     │  3. Webhook: trade status       │
     │ ◄────────────────────────────── │

Step 1: Fetch User's Inventory

You need the user's Steam trade URL components: partner (trade partner ID) and token (trade token).

Parsing Steam Trade URLs

A Steam trade URL looks like:

https://steamcommunity.com/tradeoffer/new/?partner=378049039&token=qPFEAtZR

Extract partner and token from the query parameters.

bash
curl -X POST https://api.skinslink.com/api/v1/merchant/inventory \
  -H "X-Api-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "game": "csgo",
    "partner": 378049039,
    "token": "qPFEAtZR"
  }'

Response:

json
{
  "success": true,
  "message": "Inventory fetched successfully",
  "data": {
    "items": [
      {
        "id": "38029384123",
        "name": "AK-47 | Redline (Field-Tested)",
        "price": 12.45,
        "image_url": "https://community.cloudflare.steamstatic.com/...",
        "exterior": "Field-Tested",
        "rarity": "Classified",
        "rarity_color": "#d32ce6"
      },
      {
        "id": "38029384124",
        "name": "AWP | Asiimov (Battle-Scarred)",
        "price": 23.80,
        "image_url": "https://community.cloudflare.steamstatic.com/...",
        "exterior": "Battle-Scarred",
        "rarity": "Covert",
        "rarity_color": "#eb4b4b"
      }
    ],
    "total": 2,
    "sum": 36.25,
    "game": "csgo"
  }
}

Parameters

ParameterTypeRequiredDescription
gamestringGame code: csgo, rust, dota2, tf2
partnerintegerSteam trade partner ID
tokenstringSteam trade token (exactly 8 characters)

Performance Note

Inventory fetching involves real-time pricing and may take 1–4 seconds. Cache results on your side when possible.

Step 2: Create Deposit

After the user selects items, submit the deposit with the selected asset_ids:

bash
curl -X POST https://api.skinslink.com/api/v1/merchant/create-deposit \
  -H "X-Api-Key: your-api-key" \
  -H "Content-Type: application/json" \
  -d '{
    "merchant_tx_id": "order-12345",
    "game": "csgo",
    "partner": 378049039,
    "token": "qPFEAtZR",
    "asset_ids": ["38029384123", "38029384124"]
  }'

Response:

json
{
  "success": true,
  "message": "Deposit processing with selected items",
  "data": {
    "id": 42,
    "merchant_tx_id": "order-12345",
    "status": "active",
    "amount": 36.25,
    "bot_name": "Skinslink Bot #3",
    "bot_steam_id": 76561199012345678,
    "trade_offer_id": "6912345678",
    "trade_offer_expiry_at": "2026-02-16T12:30:00Z"
  }
}

Parameters

ParameterTypeRequiredDescription
merchant_tx_idstringYour unique transaction ID
gamestringGame code: csgo, rust, dota2, tf2
partnerintegerSteam trade partner ID
tokenstringSteam trade token
asset_idsstring[]Array of item IDs from the inventory response
result_urlstringWebhook URL — overrides your merchant-level webhook URL for this deposit
success_urlstringURL for successful trades
fail_urlstringURL for failed trades
custom_currencystringCustom currency code (1–4 chars). Requires all 3 currency fields
custom_currency_multipliernumberCurrency multiplier (0.5–2.0)
custom_currency_ratenumberCurrency exchange rate (≥ 0.1)

Step 3: User Accepts Trade Offer

After creating the deposit, a Steam trade offer is sent to the user. The response includes:

  • bot_name / bot_steam_id — Which bot sent the offer
  • trade_offer_id — Steam trade offer ID
  • trade_offer_expiry_at — When the offer expires

Display this information to the user so they can accept the trade in Steam.

Step 4: Track Deposit Status (Optional)

You can track the deposit in two ways:

Listen for status updates via webhooks — Skinslink will POST to your result_url or merchant webhook URL when the trade status changes.

→ See Webhooks for payload format and setup.

Option B: Poll the status endpoint

bash
curl "https://api.skinslink.com/api/v1/merchant/deposit/status?merchant_tx_id=order-12345" \
  -H "X-Api-Key: your-api-key"

→ See Deposit Status for full response format.

Deposit Status Page

Each deposit has a hosted status page that you can redirect users to:

https://skinslink.com/deposit/{tx_id}

The tx_id is the internal transaction ID (not your merchant_tx_id). You can get it from the url field returned by Create Intent, or construct it from the deposit status response.

This page shows the user the current trade status, bot info, and trade offer details — useful if you want to let users track their deposit without building your own status UI.

Trade Statuses

StatusDescription
newDeposit created, not yet processed
pendingTrade offer sent, waiting for user to accept
activeTrade offer accepted by user, being processed
holdItems on Steam trade hold (7-day hold)
completedTrade successful, items received
failedTrade failed (provider error, user declined, items unavailable)
canceledTrade canceled by user or system
revertedPreviously held trade was reversed