Перейти к содержимому
Skinsty API

Документация API

Авторизация, каталог предметов, покупка и продажа, события WebSocket, статусы сделок и баланс. Параметры и JSON-примеры для интеграции со Skinsty.

Базовый URLhttps://api-market.skinsty.comПримеры запросов и ответов • JSON

Примеры отражают текущий API. Методы с отметкой «Требуется авторизация» принимают Bearer JWT или cookie access_token. API-ключи, Full_list и отдельный курсорный API пока недоступны; их статус указан в соответствующих разделах.

Быстрый старт

  1. Для приватных методов передайте Authorization: Bearer <access_token>; браузер может использовать cookie access_token.
  2. Запросите POST /market с обязательным provider. Для точного названия используйте exactMarketName с полным market hash name, включая износ и вариант.
  3. Продолжайте выдачу по meta.hasNext, увеличивая page и передавая возвращённые dbOffset, skinvendOffset, groupOffset.
  4. Проверьте listing ID через POST /market/check и передайте его как sku в POST /market/buy. Сохраните checkoutId и transactionId.
  5. Слушайте offerStateChanged; после переподключения сверяйте сделки через POST /market/trading.

Значения иллюстративные. Ответы предметов показывают основные поля; дополнительные поля зависят от игры и источника. Даты — ISO 8601, деньги — числа в валюте ответа.

01

Авторизация

Публичный каталог работает без сессии. Для приватных методов используйте пользовательский JWT, полученный при входе в Skinsty.

HTTP: Bearer JWT или cookie

Передайте Authorization: Bearer <access_token>. Браузер может отправлять HttpOnly cookie access_token с credentials: include. Cookie имеет приоритет перед заголовком. X-localization: ru или en выбирает язык. JWT и Steam API key — разные ключи.

API-ключ

Пользовательская авторизация через api_key пока недоступна. Не передавайте Steam API key или внутренний служебный token вместо access_token.

Двухфакторная проверка

Некоторые операции, включая создание автопокупки и торга, дополнительно проверяют двухфакторную авторизацию. Если она включена, передавайте код в заголовке X-TwoFactorAuth. Ошибка 499 с сообщением 2fa означает, что проверка не пройдена.

Пример HTTP-запроса
curl 'https://api-market.skinsty.com/market/wallet/balance' \
  -H 'Authorization: Bearer <access_token>' \
  -H 'X-localization: ru'
02

WebSocket: предметы и сделки

Используется Socket.IO на https://api-market.skinsty.com, путь /socket.io. Подписки нужно восстанавливать на каждом connect, включая переподключения.

2.1. Экшены на предметы

Комната broadcast получает marketItemPriceChanged с sku и price. Событие передаёт изменение цены, но не гарантирует отдельный сигнал о каждом новом листинге. Полного потока создания и удаления предметов пока нет; сверяйте наличие через /market и /market/check. При переподключении загрузите актуальное состояние.

2.2. Обновление статусов сделок

Для приватных событий передайте JWT в auth.token или cookie и отправьте join со строкой ID своего пользователя. Сервер выбирает комнату по сессии. offerStateChanged содержит tID, state, displayStatus и сведения о сделке. Обновляйте запись по tID и сверяйте состояние через /market/trading. События не имеют replay-курсора; пропущенные события восстанавливайте HTTP-запросом.

Подключение и повторная подписка
import { io } from 'socket.io-client';

const socket = io('https://api-market.skinsty.com', {
  path: '/socket.io',
  auth: { token: accessToken },
  withCredentials: true
});

socket.on('marketItemPriceChanged', ({ sku, price }) => {
  updateListingPrice(sku, price);
});
socket.on('offerStateChanged', event => {
  refreshTrade(event.tID);
});
socket.on('connect', () => {
  socket.emit('join', 'broadcast');
  socket.emit('join', String(currentUserId));
  refreshCatalog();
  refreshTrades();
});
marketItemPriceChanged · DTO события
{
  "sku": "listing_id",
  "price": 42.5
}
offerStateChanged · DTO события (основные поля)
{
  "tID": "transaction_id",
  "sku": "listing_id",
  "id": "transaction_record_id",
  "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
  "tradeOfferId": "1234567890",
  "type": "buy",
  "recipientUserId": 123,
  "state": "NeedBuyerApprove",
  "displayStatus": "waiting_buyer",
  "status": "Pending",
  "provider": "CSGO",
  "price": 42.5,
  "total": 42.5,
  "amount": 42.5,
  "currency": "USD",
  "name": {
    "first": "AK-47",
    "second": "Redline"
  },
  "icon": "https://cdn.skinsty.com/example-item.png",
  "createdAt": "2026-10-28T09:00:00.000Z",
  "updatedAt": "2026-10-28T09:01:00.000Z",
  "expiredAt": "2026-10-28T09:10:00.000Z",
  "cancelActor": null,
  "cancelPhase": null,
  "cancelReason": null
}
03

Каталог и точное название

Список предложений с фильтрами и последовательной загрузкой. В интеграции всегда передавайте provider. Поиск — только по полному названию через exactMarketName.

Точное совпадение

Используйте exactMarketName: «AK-47 | Redline (Field-Tested)». Учитывайте регистр, StatTrak™, Souvenir и износ. nameSearch и /market/search — подсказки интерфейса сайта; для точного поиска в интеграции они не подходят.

Загрузка как по курсору

page начинается с 1, take — от 1 до 150. Следующий запрос: page + 1 и dbOffset / skinvendOffset / groupOffset из meta предыдущего ответа, если они присутствуют. Сохраняйте provider, take, сортировку и фильтры. При смене фильтров начните с page: 1 без offsets. Завершайте при hasNext: false. Текущая выдача не является неизменяемым снимком: удаляйте дубликаты по id.

Следующий запрос по meta примера ниже
{
  "provider": "CSGO",
  "exactMarketName": "AK-47 | Redline (Field-Tested)",
  "page": 2,
  "take": 1,
  "dbOffset": 1,
  "skinvendOffset": 0,
  "sort": {
    "price": "ASC"
  },
  "price": {
    "from": 10,
    "to": 150
  }
}
Вложенные DTO фильтров · пример запроса
{
  "provider": "CSGO",
  "exactMarketName": "AK-47 | Redline (Field-Tested)",
  "page": 1,
  "take": 24,
  "price": {
    "from": 10,
    "to": 150
  },
  "float": {
    "from": 0.15,
    "to": 0.38
  },
  "sort": {
    "price": "ASC"
  },
  "stickers": {
    "values": [],
    "match": "all",
    "exact": false,
    "positions": []
  },
  "variant": "normal"
}
Методы 3.1

Возвращает список предметов на маркете. Поддерживает фильтры цены, float, стикеров, редкости, статуса и сортировки.

POSThttps://api-market.skinsty.com/market
Публичный метод
ПараметрОбязательныйТипОписание
providerДаCSGO | DOTA2 | Rust | TF2Провайдер; всегда указывайте явно.
exactMarketNameНетstringПолное оригинальное название с точным совпадением.
pageНетinteger ≥ 1Шаг последовательной загрузки, начало: 1.
takeНетinteger 1…150Размер выдачи, по умолчанию 10.
dbOffset / skinvendOffset / groupOffsetНетinteger ≥ 0Продолжение из meta предыдущего ответа; не вычисляйте самостоятельно.
price / floatНет{ from?: number; to?: number }Границы цены или float.
sortНетMarketSortRequestDtoНапример { "price": "ASC" }.
stickersНетMarketStickerFilterDtovalues, match: all | any, exact и позиции slot/value.
variant / gemPresenceНетstringvariant: all | normal | statTrack | souvenir; gemPresence: present | absent (Dota 2).
DTO запроса · JSON · MarketFilterRequestDto
{
  "provider": "CSGO",
  "page": 1,
  "take": 1,
  "exactMarketName": "AK-47 | Redline (Field-Tested)",
  "price": {
    "from": 10,
    "to": 150
  },
  "sort": {
    "price": "ASC"
  }
}
DTO ответа · JSON · RPageDto<RSSellItemDto>
{
  "data": [
    {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": true,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": []
    }
  ],
  "meta": {
    "page": 1,
    "take": 1,
    "itemsCount": 2,
    "planItemsCount": 2,
    "countWithoutGroup": 2,
    "pagesCount": 2,
    "hasPrev": false,
    "hasNext": true,
    "dbOffset": 1,
    "skinvendOffset": 0
  }
}
Методы 3.2

Возвращает сгруппированный список предметов для компактной витрины.

POSThttps://api-market.skinsty.com/market-group
Публичный метод
ПараметрОбязательныйТипОписание
providerДаCSGO | DOTA2 | Rust | TF2Провайдер; всегда указывайте явно.
groupНетbooleanГруппировка предложений; /market-group группирует независимо от этого флага.
DTO запроса · JSON · MarketFilterRequestDto
{
  "provider": "CSGO",
  "page": 1,
  "take": 24,
  "group": true
}
DTO ответа · JSON · RPageDto<RSSellItemGroupDto>
{
  "data": [
    {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": true,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": [],
      "groups": [
        {
          "id": "listing_id",
          "sku": "listing_id",
          "catalogSku": "catalog_sku",
          "originalMarketName": "AK-47 | Redline (Field-Tested)",
          "marketSlug": "ak-47-redline-field-tested",
          "marketName": {
            "first": "AK-47",
            "second": "Redline"
          },
          "provider": "CSGO",
          "price": 42.5,
          "marketPrice": 45,
          "image": "https://cdn.skinsty.com/example-item.png",
          "preview": "https://cdn.skinsty.com/example-item.png",
          "count": 1,
          "tradable": true,
          "marketable": true,
          "isInMarket": true,
          "isCatalog": false,
          "float": 0.21,
          "stickers": [],
          "keychains": [],
          "gems": [],
          "attributes": [],
          "props": []
        }
      ]
    }
  ],
  "meta": {
    "page": 1,
    "take": 24,
    "itemsCount": 1,
    "planItemsCount": 1,
    "countWithoutGroup": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
Методы 3.3

Список доступных фильтров для выбранного провайдера.

GEThttps://api-market.skinsty.com/filters?provider=CSGO
Публичный метод
ПараметрОбязательныйТипОписание
providerДаstringПровайдер, для которого нужны фильтры.

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · Query
{
  "provider": "CSGO"
}
DTO ответа · JSON · RFilterDto[]
[
  {
    "id": "filter_id",
    "provider": {
      "id": 1,
      "sku": "CSGO",
      "type": "CSGO",
      "name": {
        "en": "CS2",
        "ru": "CS2"
      },
      "icon": ""
    },
    "status": "Active",
    "filterGroup": [],
    "type": "Price",
    "order": 1,
    "sku": "price",
    "icon": null,
    "filterAttributes": []
  }
]
04

Full_list: полный каталог файлом

Отдельная файловая выгрузка полного каталога пока недоступна. URL Full_list и DTO файла ещё не опубликованы.

Планируемая выгрузка

Полный список предложений планируется публиковать JSON-файлом отдельно для каждого provider и обновлять раз в 5–10 минут. После запуска выгрузки изменения между снимками можно будет применять по событиям. Сейчас используйте последовательные запросы /market с сохранением continuation offsets.

05

RPS и API-ключ

RPS — число запросов в секунду. Общий подтверждённый лимит на пользовательский api_key в текущем API не опубликован.

Статус лимита

Для отдельного внешнего API целевой ориентир — 5 RPS на api_key, суммарно по всем методам и клиентам с этим ключом. Этот контракт ещё не включён. Не воспринимайте его как действующую квоту текущего API.

Поведение клиента

Используйте очередь запросов и кеширование. При 429 остановите повторы на время Retry-After, если он присутствует; иначе увеличивайте задержку между попытками. После таймаута покупки сначала проверяйте checkout, повтор выполняйте с тем же Idempotency-Key.

06

Карточка предмета

Получение конкретного предмета, похожих предложений и минимальных цен для автопокупки.

Методы 6.1

Возвращает карточку предмета. Можно передать itemId, если нужен конкретный листинг.

GEThttps://api-market.skinsty.com/item/:sku?id=:itemId
Публичный метод
ПараметрОбязательныйТипОписание
skuДаstringSKU предмета или группы.
idНетstringID конкретного листинга.
exactНет"1"Не подменять выбранное предложение другим листингом.

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · Path + query
{
  "sku": "ak-47-redline-field-tested",
  "id": "listing_id",
  "exact": "1"
}
DTO ответа · JSON · RSSellItemDto
{
  "id": "listing_id",
  "sku": "listing_id",
  "catalogSku": "catalog_sku",
  "originalMarketName": "AK-47 | Redline (Field-Tested)",
  "marketSlug": "ak-47-redline-field-tested",
  "marketName": {
    "first": "AK-47",
    "second": "Redline"
  },
  "provider": "CSGO",
  "price": 42.5,
  "marketPrice": 45,
  "image": "https://cdn.skinsty.com/example-item.png",
  "preview": "https://cdn.skinsty.com/example-item.png",
  "count": 1,
  "tradable": true,
  "marketable": true,
  "isInMarket": true,
  "isCatalog": false,
  "float": 0.21,
  "stickers": [],
  "keychains": [],
  "gems": [],
  "attributes": [],
  "props": []
}
Методы 6.2

Возвращает похожие предметы с учетом фильтров и пагинации.

POSThttps://api-market.skinsty.com/similar-items/:sku
Публичный метод
DTO запроса · JSON · MarketFilterRequestDto
{
  "provider": "CSGO",
  "page": 1,
  "take": 12
}
DTO ответа · JSON · RPageDto<RSSellItemDto>
{
  "data": [
    {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": true,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": []
    }
  ],
  "meta": {
    "page": 1,
    "take": 12,
    "itemsCount": 1,
    "planItemsCount": 1,
    "countWithoutGroup": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
Методы 6.3

Минимальная цена на маркете и в автопокупке для выбранного предмета.

GEThttps://api-market.skinsty.com/market/trade/prices/:sku
Требуется авторизация

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · Path
{
  "sku": "listing_id"
}
DTO ответа · JSON · { marketPrice: number; autoBuyPrice: number }
{
  "marketPrice": 42.5,
  "autoBuyPrice": 40
}
07

Покупка предметов

Перед покупкой проверьте доступность предметов, затем создайте операцию покупки и отслеживайте активные обмены.

Стандартная покупка

Поле sku в /market/check и /market/buy — ID конкретного предложения из каталога, а не название предмета. Передавайте массив объектов. /market/buy возвращает checkoutId и результаты по каждому предмету: accepted | partial | retry_required | rejected. Успешный checkout ещё не означает завершение Steam-обмена. Используйте Idempotency-Key для повтора одной и той же покупки.

Покупка через очередь

Для POST /market/checkout используйте один UUID в заголовках X-Checkout-Id и Idempotency-Key. Сохраните checkoutId ответа и проверяйте GET /market/checkout/:checkoutId. Статусы обработки: queued | processing | completed | rejected | failed. result появляется после обработки и содержит RPurchaseCheckoutDto.

Заголовки покупки
{
  "Content-Type": "application/json",
  "Authorization": "Bearer <access_token>",
  "Idempotency-Key": "unique-purchase-id"
}
Заголовки покупки через очередь
{
  "Content-Type": "application/json",
  "Authorization": "Bearer <access_token>",
  "X-Checkout-Id": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
  "Idempotency-Key": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb"
}
Методы 7.1

Проверяет, доступны ли предметы перед покупкой.

POSThttps://api-market.skinsty.com/market/check
Требуется авторизация
ПараметрОбязательныйТипОписание
skuДаstringSKU покупаемого предмета.
DTO запроса · JSON · ItemRequestDto[]
[
  {
    "sku": "listing_id"
  }
]
DTO ответа · JSON · RSSellItemAvailableDto[]
[
  {
    "sku": "listing_id",
    "available": true
  }
]
Методы 7.2

Создает покупку и запускает очередь трейда.

POSThttps://api-market.skinsty.com/market/buy
Требуется авторизация
ПараметрОбязательныйТипОписание
skuДаstringSKU предмета. Перед покупкой желательно проверить через /market/check.
DTO запроса · JSON · ItemRequestDto[]
[
  {
    "sku": "listing_id"
  }
]
DTO ответа · JSON · RPurchaseCheckoutDto
{
  "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
  "status": "accepted",
  "acceptedItems": [
    {
      "sku": "listing_id",
      "available": true,
      "transactionId": "transaction_id",
      "offerGroupId": "offer_group_id"
    }
  ],
  "unavailableItems": []
}
Методы 7.3

Ставит покупку в очередь и возвращает HTTP 202; итог проверяйте по checkoutId.

POSThttps://api-market.skinsty.com/market/checkout
Требуется авторизация
ПараметрОбязательныйТипОписание
X-Checkout-Id / Idempotency-KeyНетUUID (headers)Если заданы оба заголовка, их значения должны совпадать. При повторе используйте ту же пару UUID.
DTO запроса · JSON · ItemRequestDto[]
[
  {
    "sku": "listing_id"
  }
]
DTO ответа · JSON · RPurchaseCheckoutSubmissionDto
{
  "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
  "status": "queued",
  "queuedItems": [
    {
      "sku": "listing_id",
      "available": true
    }
  ],
  "unavailableItems": []
}
Методы 7.4

Состояние обработки покупки после постановки в очередь.

GEThttps://api-market.skinsty.com/market/checkout/:checkoutId
Требуется авторизация
ПараметрОбязательныйТипОписание
checkoutIdДаstringИдентификатор покупки.

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · Path
{
  "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb"
}
DTO ответа · JSON · RPurchaseCheckoutStateDto
{
  "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
  "status": "completed",
  "result": {
    "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
    "status": "accepted",
    "acceptedItems": [
      {
        "sku": "listing_id",
        "available": true,
        "transactionId": "transaction_id",
        "offerGroupId": "offer_group_id"
      }
    ],
    "unavailableItems": []
  }
}
08

Инвентарь и продажа

Методы для загрузки инвентаря пользователя, выставления предметов на маркет и снятия их с продажи.

Методы 8.1

Возвращает предметы Steam-инвентаря пользователя с фильтрами и пагинацией.

POSThttps://api-market.skinsty.com/inventory
Требуется авторизация
ПараметрОбязательныйТипОписание
providerДаstringИгра, для которой загружается инвентарь.
statusНетstring | string[]Статус предметов в инвентаре или на продаже.
DTO запроса · JSON · MarketFilterRequestDto
{
  "provider": "CSGO",
  "page": 1,
  "take": 24
}
DTO ответа · JSON · RPageDto<RSSellItemDto>
{
  "data": [
    {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": false,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": [],
      "isOwn": true
    }
  ],
  "meta": {
    "page": 1,
    "take": 24,
    "itemsCount": 1,
    "planItemsCount": 1,
    "countWithoutGroup": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
Методы 8.2

Запускает обновление инвентаря из Steam.

GEThttps://api-market.skinsty.com/inventory/steam-fetch?provider=CSGO
Требуется авторизация

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · Query
{
  "provider": "CSGO"
}
DTO ответа · JSON · Inventory refresh result
{
  "status": "queued",
  "retryAfter": 20
}
Методы 8.3

Выставляет предметы или меняет цену уже выставленных предложений. Требуется активное расширение.

POSThttps://api-market.skinsty.com/inventory/item-to-market
Требуется авторизация
ПараметрОбязательныйТипОписание
items[].itemIdДаstringID предмета из инвентаря.
items[].priceНетnumberЦена продажи.
DTO запроса · JSON · ItemMarketsRequestDto
{
  "items": [
    {
      "itemId": "inventory_item_id",
      "price": 25.5
    }
  ]
}
DTO ответа · JSON · { all: number; market: number }
{
  "all": 1,
  "market": 1
}
Методы 8.4

Снимает выбранные предметы с продажи.

POSThttps://api-market.skinsty.com/inventory/remove-item-from-market
Требуется авторизация
DTO запроса · JSON · ItemMarketsRequestDto
{
  "items": [
    {
      "itemId": "inventory_item_id"
    }
  ]
}
DTO ответа · JSON · boolean
true
09

Статусы сделок

state описывает этап Steam-обмена, displayStatus — состояние для отображения, status — финансовый статус транзакции. Эти значения не взаимозаменяемы.

Этапы и отмены

state: Created, NeedSellerApprove, NeedBuyerApprove, InEscrow, Success, Timeout, Canceled, Finished. displayStatus: created, processing, waiting_seller, waiting_buyer, buyer_declined, seller_declined, declined, trade_error, on_hold, success, buyer_canceled_after_hold, seller_canceled_after_hold, timeout. При отмене учитывайте cancelActor (buyer | seller | system), cancelPhase (before_transfer | after_transfer) и cancelReason.

Финансовый статус

status: Pending | Hold | SUCCESS | FAILED. InEscrow / on_hold означает удержание, а не окончательный расчёт. Возврат и штраф могут приходить отдельными полями returnedAmount, netReturnedAmount, penaltyAmount и compensationAmount.

Методы 9.1

Активные и недавно завершённые сделки пользователя.

POSThttps://api-market.skinsty.com/market/trading
Требуется авторизация
ПараметрОбязательныйТипОписание
typeНетpurchase | saleТип истории; не BUY / SELL.
DTO запроса · JSON · TxnFilterDto
{}
DTO ответа · JSON · RWaitDto[]
[
  {
    "tID": "transaction_id",
    "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
    "tradeOfferId": "1234567890",
    "type": "buy",
    "name": {
      "first": "AK-47",
      "second": "Redline"
    },
    "price": 42.5,
    "currency": "USD",
    "icon": "https://cdn.skinsty.com/example-item.png",
    "state": "NeedBuyerApprove",
    "displayStatus": "waiting_buyer",
    "cancelActor": null,
    "cancelPhase": null,
    "cancelReason": null,
    "createdAt": "2026-10-28T09:00:00.000Z",
    "expiredAt": "2026-10-28T09:10:00.000Z",
    "item": {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": true,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": []
    }
  }
]
Методы 9.2

Активные обмены без недавно завершённых.

GEThttps://api-market.skinsty.com/market/trade/active
Требуется авторизация

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · No body
{}
DTO ответа · JSON · RTradeDto[]
[
  {
    "tID": "transaction_id",
    "checkoutId": "e1d74ed0-a842-4fc0-b64d-cbfda50ca4bb",
    "tradeOfferId": "1234567890",
    "type": "buy",
    "name": "AK-47 | Redline (Field-Tested)",
    "price": 42.5,
    "currency": "USD",
    "icon": "https://cdn.skinsty.com/example-item.png",
    "state": "NeedBuyerApprove",
    "displayStatus": "waiting_buyer",
    "cancelActor": null,
    "cancelPhase": null,
    "cancelReason": null,
    "createdAt": "2026-10-28T09:00:00.000Z",
    "expiredAt": "2026-10-28T09:10:00.000Z",
    "item": {
      "id": "listing_id",
      "sku": "listing_id",
      "catalogSku": "catalog_sku",
      "originalMarketName": "AK-47 | Redline (Field-Tested)",
      "marketSlug": "ak-47-redline-field-tested",
      "marketName": {
        "first": "AK-47",
        "second": "Redline"
      },
      "provider": "CSGO",
      "price": 42.5,
      "marketPrice": 45,
      "image": "https://cdn.skinsty.com/example-item.png",
      "preview": "https://cdn.skinsty.com/example-item.png",
      "count": 1,
      "tradable": true,
      "marketable": true,
      "isInMarket": true,
      "isCatalog": false,
      "float": 0.21,
      "stickers": [],
      "keychains": [],
      "gems": [],
      "attributes": [],
      "props": []
    },
    "proposePrice": 42.5,
    "status": "Pending",
    "updatedAt": "2026-10-28T09:01:00.000Z"
  }
]
10

Баланс, пополнения и выводы

Текущий баланс и история только пополнений и выводов. Покупки, продажи и сделки отслеживайте в разделе статусов сделок.

Доступный и замороженный баланс

amount — доступный баланс. frozenPurchases — резерв покупок; frozenSales — выручка на удержании; frozenReferrals — реферальные начисления на удержании; frozenWithdrawals — резерв выводов с комиссиями. Их сумма равна frozenTotal. reserved включает покупки и выводы, hold — продажи и реферальные начисления; frozenItems — сумма покупок, продаж и реферальных начислений. Эти агрегаты не нужно прибавлять к категориям. Для истории заморозок отправляйте type: frozen и необязательный frozenCategory: purchase, sale, referral или withdrawal; для выводов — type: withdrawal.

История выводов · DTO запроса
{
  "type": "withdrawal",
  "page": 1,
  "take": 20,
  "sort": {
    "createdAt": "DESC"
  }
}
Методы 10.1

Текущий баланс пользователя.

GEThttps://api-market.skinsty.com/market/wallet/balance
Требуется авторизация

Тело запроса не требуется. Параметры ниже передаются в URL.

Параметры URL · JSON · No body
{}
DTO ответа · JSON · RWalletBalanceDto
{
  "amount": 120.5,
  "currency": "USD",
  "reserved": 35,
  "hold": 20,
  "frozenPurchases": 25,
  "frozenSales": 18,
  "frozenReferrals": 2,
  "frozenTotal": 55,
  "frozenItems": 45,
  "frozenWithdrawals": 10
}
Методы 10.2

История пополнений или выводов с обязательным выбором типа в интеграции.

POSThttps://api-market.skinsty.com/market/wallet/history
Требуется авторизация
ПараметрОбязательныйТипОписание
typeДаreplenishment | withdrawalПополнения или выводы. Значения REFILL / WITHDRAW не используются.
page / takeНетintegerНомер страницы от 1; размер от 1 до 150.
transactionStatusНетPending | Hold | SUCCESS | FAILEDТочный регистр значения статуса.
from / toНетISO 8601 stringДиапазон дат.
sortНет{ createdAt: "ASC" | "DESC" }Порядок по времени.
DTO запроса · JSON · TxnFilterPageDto
{
  "type": "replenishment",
  "page": 1,
  "take": 20,
  "sort": {
    "createdAt": "DESC"
  }
}
DTO ответа · JSON · RPageDto<RTransactionDto>
{
  "data": [
    {
      "tID": "deposit_transaction_id",
      "type": "refill",
      "amount": 50,
      "commission": 0,
      "total": 50,
      "description": "Deposit",
      "status": "SUCCESS",
      "message": "",
      "currency": "USD",
      "paymentService": "payment_provider",
      "amountBefore": 70.5,
      "resolvedAt": "2026-10-28T09:00:00.000Z",
      "expiredAt": "2026-10-28T09:00:00.000Z"
    }
  ],
  "meta": {
    "page": 1,
    "take": 20,
    "itemsCount": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
11

Запросы на покупку и торг

Автопокупка, список запросов пользователя и предложения торга по предметам.

Методы 11.1

Создает запрос на покупку предмета по заданным фильтрам и цене.

POSThttps://api-market.skinsty.com/market/trade/new
Требуется авторизация
ПараметрОбязательныйТипОписание
providerДаstringПровайдер предмета.
priceДа{ from: number; to: number }Диапазон цены для запроса.
countToBuyДаnumberКоличество предметов для покупки.
DTO запроса · JSON · TradeRequestDto
{
  "provider": "CSGO",
  "exactMarketName": "AK-47 | Redline (Field-Tested)",
  "price": {
    "from": 10,
    "to": 35
  },
  "countToBuy": 1
}
DTO ответа · JSON · boolean
true
Методы 11.2

Список запросов на покупку текущего пользователя.

POSThttps://api-market.skinsty.com/market/trade/list
Требуется авторизация
DTO запроса · JSON · TradeFilterDto
{
  "page": 1,
  "take": 20,
  "price": "DESC"
}
DTO ответа · JSON · RPageDto<RAutoTradeDto>
{
  "data": [
    {
      "id": "autobuy_id",
      "countToBuy": 1,
      "countBought": 0,
      "price": 35,
      "currency": "USD",
      "active": true,
      "createdAt": "2026-10-28T09:00:00.000Z",
      "item": {
        "id": "listing_id",
        "sku": "listing_id",
        "catalogSku": "catalog_sku",
        "originalMarketName": "AK-47 | Redline (Field-Tested)",
        "marketSlug": "ak-47-redline-field-tested",
        "marketName": {
          "first": "AK-47",
          "second": "Redline"
        },
        "provider": "CSGO",
        "price": 42.5,
        "marketPrice": 45,
        "image": "https://cdn.skinsty.com/example-item.png",
        "preview": "https://cdn.skinsty.com/example-item.png",
        "count": 1,
        "tradable": true,
        "marketable": true,
        "isInMarket": true,
        "isCatalog": false,
        "float": 0.21,
        "stickers": [],
        "keychains": [],
        "gems": [],
        "attributes": [],
        "props": []
      },
      "minMarketPrice": 42.5,
      "minAutoBuyPrice": 30,
      "maxAutoBuyPrice": 35
    }
  ],
  "meta": {
    "page": 1,
    "take": 20,
    "itemsCount": 1,
    "planItemsCount": 1,
    "countWithoutGroup": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
Методы 11.3

Создает предложение торга по предмету на продаже.

POSThttps://api-market.skinsty.com/market/bargain/new
Требуется авторизация
ПараметрОбязательныйТипОписание
itemIdДаstringID предмета на маркете.
priceДаnumberПредлагаемая цена.
DTO запроса · JSON · ItemMarketRequestDto
{
  "itemId": "market_item_id",
  "price": 18.75
}
DTO ответа · JSON · boolean
true
Методы 11.4

Входящие предложения торга по предметам пользователя.

POSThttps://api-market.skinsty.com/market/bargain/income
Требуется авторизация
DTO запроса · JSON · BargainFilterDto
{}
DTO ответа · JSON · RPageDto<RBargainDealDto>
{
  "data": [
    {
      "gameType": "CSGO",
      "sku": "listing_id",
      "item": {
        "id": "listing_id",
        "sku": "listing_id",
        "catalogSku": "catalog_sku",
        "originalMarketName": "AK-47 | Redline (Field-Tested)",
        "marketSlug": "ak-47-redline-field-tested",
        "marketName": {
          "first": "AK-47",
          "second": "Redline"
        },
        "provider": "CSGO",
        "price": 42.5,
        "marketPrice": 45,
        "image": "https://cdn.skinsty.com/example-item.png",
        "preview": "https://cdn.skinsty.com/example-item.png",
        "count": 1,
        "tradable": true,
        "marketable": true,
        "isInMarket": true,
        "isCatalog": false,
        "float": 0.21,
        "stickers": [],
        "keychains": [],
        "gems": [],
        "attributes": [],
        "props": []
      },
      "itemPrice": 42.5,
      "currency": "USD",
      "proposes": 1,
      "status": "Pending"
    }
  ],
  "meta": {
    "page": 1,
    "take": 10,
    "itemsCount": 1,
    "planItemsCount": 1,
    "countWithoutGroup": 1,
    "pagesCount": 1,
    "hasPrev": false,
    "hasNext": false
  }
}
Методы 11.5

Принимает предложение торга. Требует активное расширение браузера.

POSThttps://api-market.skinsty.com/market/bargain/accept
Требуется авторизация
DTO запроса · JSON · ItemRequestDto
{
  "sku": "item_sku",
  "userId": "123"
}
DTO ответа · JSON · boolean
true

Типовые ошибки

400 Bad Request

некорректные параметры, расширение офлайн или предмет недоступен.

401 Unauthorized

JWT отсутствует, истёк или сессия недействительна.

403 Forbidden

действие ограничено правилами безопасности или баном.

404 Not Found

предмет или checkout не найден.

408 Request Timeout

истекло время ожидания покупки. Проверьте состояние checkout перед повтором.

429 Too Many Requests

превышено ограничение запросов. Снизьте частоту и выдержите Retry-After, если заголовок присутствует; иначе увеличивайте задержку между попытками.

499 (Skinsty 2FA)

требуется корректный код двухфакторной проверки в X-TwoFactorAuth. Это прикладной код Skinsty.

500 Internal Server Error

непредвиденная ошибка сервера. Повторяйте запрос с увеличивающейся задержкой. После ошибки покупки сначала проверьте checkout; при повторе используйте прежний Idempotency-Key.

502 Bad Gateway

шлюз получил некорректный ответ от сервиса. Повторите запрос с задержкой. Ошибка может прийти от прокси, поэтому тело ответа не обязательно содержит JSON.

503 Service Unavailable

сервис временно недоступен, например при прогреве каталога или технических работах. Выдержите Retry-After, если он передан; иначе увеличивайте задержку между попытками.

504 Gateway Timeout

шлюз не дождался ответа сервиса. Результат операции может быть неизвестен. Для покупки сначала проверьте checkout; при повторе используйте прежний Idempotency-Key.