Skip to content

Purchase Status ​

GET /api/v1/merchant/purchase/status

Retrieves the current status of a purchase. Look up by internal id or your merchant_tx_id.

Request ​

Headers ​

HeaderRequiredDescription
X-Api-Key✅Your merchant API key
Accept—application/json

Query Parameters ​

ParameterTypeRequiredDescription
idinteger✅*Purchase ID
merchant_tx_idstring✅*Your transaction ID

* At least one of id or merchant_tx_id is required.

Response ​

json
{
  "success": true,
  "message": "Purchase status fetched successfully",
  "data": {
    "id": 178,
    "merchant_tx_id": "order-12345",
    "status": "completed",
    "steam_id": "76561198338314767",
    "steam_name": "PlayerOne",
    "steam_avatar_url": "https://avatars.steamstatic.com/...",
    "amount": 45.99,
    "trade_offer_id": "6912345678",
    "date": "2026-03-24T10:30:00Z",
    "item": {
      "id": "38029384123",
      "name": "AK-47 | Redline (Field-Tested)",
      "price": 45.99,
      "image_url": "https://steamcommunity-a.akamaihd.net/economy/image/class/730/..."
    }
  }
}

Response Fields ​

FieldTypeDescription
idintegerPurchase ID
merchant_tx_idstringYour transaction ID (only present if provided at creation)
statusstringCurrent purchase status
fail_reasonstring | nullFailure reason (present when status is failed, canceled or reverted, see Fail Reasons)
steam_idstringUser's Steam ID (64-bit, as string)
steam_namestringUser's Steam display name (only present if available)
steam_avatar_urlstringUser's Steam avatar URL (only present if available)
amountnumberPurchase amount (USD)
trade_offer_idstringSteam trade offer ID (only present if available)
hold_end_datestringWhen the hold ends (ISO 8601). Set once the purchase enters hold and kept on later statuses
datestringPurchase creation timestamp (ISO 8601)
itemobjectPurchased item details (only present if available)
item.idstringCatalogue item ID (the id you bought by), not a Steam asset ID. See Available Items
item.namestringItem market name
item.pricenumberItem price (USD)
item.image_urlstringSteam CDN image URL

INFO

Optional fields (merchant_tx_id, fail_reason, steam_name, steam_avatar_url, trade_offer_id, hold_end_date, item) are omitted from the response when not available — they will not appear as null.

Examples ​

By merchant_tx_id ​

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

By internal ID ​

bash
curl "https://api.skinslink.com/api/v1/merchant/purchase/status?id=178" \
  -H "X-Api-Key: your-api-key" \
  -H "Accept: application/json"

Purchase Statuses ​

StatusDescriptionFinal?
newPurchase created, not yet processedNo
pendingProcessing, awaiting trade offer creationNo
activeTrade offer sent, waiting for user to acceptNo
holdItem delivered and under Steam trade protection until hold_end_date. See HoldNo
completedPurchase successful, item delivered ✅Yes
failedPurchase failed (see fail_reason) ❌Yes
canceledPurchase canceledYes
revertedPreviously held purchase was reversedYes

TIP

For real-time updates, use Webhooks instead of polling.

Hold ​

  • CS2 — every delivered item is under Steam's 7-day trade protection, during which the trade can still be reversed. The purchase stays in hold until hold_end_date, then moves to completed within about a minute. If the item turns out not to be protected, the purchase completes right away without a hold.
  • Rust — may enter hold for up to 1 hour before completing.
  • Dota 2, TF2 — usually complete without a hold.

A purchase reversed during the hold ends as reverted, and its amount returns to your balance.

Fail Reasons ​

When status is failed, canceled or reverted, fail_reason explains why. In each of these cases the full purchase amount returns to your available balance.

ValueStatusDescription
canceled_by_usercanceledThe user declined the trade offer
buyer_too_slowcanceled, failedThe user did not accept the trade offer in time
skinslink_too_slowcanceled, failedThe item was not sent in time
timeout_errorcanceled, failedThe trade timed out before completing
canceled_by_skinslinkcanceledCanceled by Skinslink
trade_url_errorfailed, canceledThe trade could not be sent to the user's trade link (invalid or changed link, or the account cannot trade)
user_revertedrevertedThe user reversed the trade during the hold
skinslink_revertedrevertedThe trade was reversed by Skinslink during the hold

Purchases rejected at creation (insufficient_balance, price_changed, item_not_available, …) are listed in Create Purchase. Other values may appear — treat any unknown fail_reason as a generic failure.

Errors ​

StatusMessageCause
400validation errorNeither id nor merchant_tx_id provided
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 whitelist
404not found errorNo purchase matches the given ID