RMT.GG/Документация для разработчиков продавцов
v1

API продавца

Автоматизируйте листинги, выполняйте продажи и отслеживайте события заказов. Включает исходящие вебхуки и конечные точки резервирования для пополнения инвентаря по запросу после оплаты.

REST Open API

Аутентификация Bearer /api/v1 для предложений и заказов с заголовками обнаружения и ограничения скорости.

Исходящие вебхуки

Подписанные HTTPS (или Discord) доставки для событий жизненного цикла заказов и предложений.

Резерв / пополнение

Создавайте COMPLEX запасы с вашего сервера после оплаты, когда местного инвентаря недостаточно.

Что вы можете создать

Открытый API продавца предназначен для продавцов, которые хотят получать уведомления в Discord, синхронизацию запасов, автоматизацию в стиле Zapier или кастомный бэк-офис на базе RMT.GG.

  • Управление предложениями
    Создавайте черновики, обновляйте безопасные поля, публикуйте и архивируйте через /api/v1/offers.
  • Выполнение продаж
    Список и проверка заказов продавца, затем отметьте их как доставленные с необязательными URL-адресами доказательств.
  • Оставайтесь в пределах лимита
    Каждый ключ ограничен 300 запросами в минуту. Ответы включают заголовки X-RateLimit-*.
  • Реагируйте в реальном времени
    Подписывайтесь на события заказов и предложений или пополняйте COMPLEX инвентарь с помощью резервных вебхуков.

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

Создайте API-ключ в настройках разработчика, затем вызовите discovery, чтобы распечатать живой каталог.

  1. 1Откройте Настройки → Разработчик (отдельного шага включения нет).
  2. 2Создайте API ключ и скопируйте секрет один раз (rmt_sk_live_…). Храните его в своем менеджере секретов.
  3. 3Вызовите GET /api/v1 с Authorization: Bearer, чтобы подтвердить области, квоты и операции.
GET/api/v1

Документ обнаружения

Возвращает области, квоты, события вебхуков и полный каталог операций. Любой действительный API ключ работает.

Пример запроса

bash
curl -s -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1 | jq .

Пример ответа

json
{
  "name": "RMT Seller Open API",
  "version": "1",
  "basePath": "/api/v1",
  "scopes": ["offers:read", "offers:write", "orders:read", "orders:write", "webhooks:manage"],
  "webhookEvents": ["order.paid", "order.delivered", "…"],
  "operations": [ /* full catalog */ ]
}

Аутентификация

Отправляйте свой живой секретный ключ в каждом запросе /api/v1. Предпочитайте только HTTPS. Никогда не встраивайте ключи в публичные клиенты или пакеты браузера.

Предпочтительный заголовок

http
Authorization: Bearer rmt_sk_live_<prefix>_<secret>

Альтернативный заголовок

http
X-Api-Key: rmt_sk_live_<prefix>_<secret>

Смените при утечке

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

Области

Каждый API ключ имеет области, которые ограничивают конечные точки. Отсутствующая область возвращает 403 SCOPE_MISSING.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Список и получение ваших предложений.
  • offers:write: Создание, обновление, публикация и удаление предложений.
  • orders:read: Список и получение заказов продавца.
  • orders:write: Отметить заказы как доставленные.
  • webhooks:manage: Резервировано для будущего управления вебхуками Open API. Настройте Discord/Telegram в Уведомлениях и JSON вебхуки в настройках разработчика уже сегодня.

Общие области ключей

Новые ключи получают offers:read, offers:write, orders:read и orders:write. CRUD для исходящих вебхуков остается в интерфейсе настроек (аутентификация сессии).

API предложений

Идентификаторы предложений принимают публичный URL-слуг или числовой ID. Ответы не содержат внутренний ID и sellerId.

Что PATCH пока не может изменить

Строки запасов, цены опций, медиа и атрибуты управляются в редакторе продавца (или будущих конечных точках), а не через PATCH сегодня.

GET/api/v1/offers
offers:read

Список ваших предложений

Фильтруйте с archive=active (по умолчанию), archived или all.

Параметры

  • archive
    В
    query
    Тип
    string
    Описание
    One of "active" (default), "archived", or "all".
  • Response: { offers: Offer[], total: number }. Numeric id and sellerId are omitted.

Пример запроса

bash
curl -H "Authorization: Bearer rmt_sk_live_…" \
  "https://rmt.gg/api/v1/offers?archive=active"

Пример ответа

json
{
  "offers": [{ "url": "my-offer", "title": "…", "visibility": "PUBLIC", "published": 1 }],
  "total": 1
}
POST/api/v1/offers
offers:write

Создать черновик предложения

Создает пустой черновик, принадлежащий аутентифицированному продавцу. Тело не требуется.

  • No request body required.
  • Response 201: { offer: Offer }.

Пример запроса

bash
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1/offers

Пример ответа

json
{
  "offer": { "url": "draft-abc", "title": null, "visibility": "UNPUBLISHED", "published": 0 }
}
GET/api/v1/offers/:urlOrId
offers:read

Получить одно предложение

Загрузите по публичному URL-слугу или числовому ID. Связи (опции) могут быть включены; запасные предметы не включены.

Параметры

  • urlOrIdобязательно
    В
    path
    Тип
    string
    Описание
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Пример запроса

bash
curl -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1/offers/YOUR_OFFER_URL
PATCH/api/v1/offers/:urlOrId
offers:write

Обновить поля предложения

Обновите безопасный подмножество полей листинга. Вызывает offer.updated, когда настроены исходящие вебхуки.

Параметры

  • urlOrIdобязательно
    В
    path
    Тип
    string
    Описание
    Offer.url slug or Offer.id.
  • title
    В
    body
    Тип
    string
    Описание
    Listing title.
  • description
    В
    body
    Тип
    string
    Описание
    Listing description.
  • visibility
    В
    body
    Тип
    string
    Описание
    PUBLIC | PRIVATE | UNPUBLISHED.
  • categoryId
    В
    body
    Тип
    number
    Описание
    Catalog category id.
  • offeringId
    В
    body
    Тип
    number
    Описание
    Catalog offering id.
  • thumbnail
    В
    body
    Тип
    string
    Описание
    Thumbnail URL or asset reference.
  • offerType
    В
    body
    Тип
    string
    Описание
    Offer type string used by the listing.
  • listingMode
    В
    body
    Тип
    string
    Описание
    Listing mode (for example STANDARD, RANK_BOOST, SESSION).
  • At least one allowed field is required.
  • Emits offer.updated webhook when configured.
  • Stock, options, media, and attributes are not editable via this endpoint yet.

Пример запроса

bash
curl -X PATCH -H "Authorization: Bearer rmt_sk_live_…" \
  -H "Content-Type: application/json" \
  https://rmt.gg/api/v1/offers/YOUR_OFFER_URL \
  -d @body.json

Тело запроса

json
{
  "title": "Updated title",
  "description": "Buyer-facing description",
  "visibility": "PUBLIC",
  "categoryId": 12,
  "offeringId": 34,
  "thumbnail": "https://…",
  "offerType": "ACCOUNT",
  "listingMode": "STANDARD"
}
DELETE/api/v1/offers/:urlOrId
offers:write

Удалить или архивировать

Те же правила удаления/архивирования, что и в интерфейсе продавца.

Параметры

  • urlOrIdобязательно
    В
    path
    Тип
    string
    Описание
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Пример запроса

bash
curl -X DELETE -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1/offers/YOUR_OFFER_URL

Пример ответа

json
{ "ok": true }
POST/api/v1/offers/:urlOrId/publish
offers:write

Опубликовать предложение

Публикует черновик (или изменяет видимость). Не удается с 400, если обязательные поля листинга неполные.

Параметры

  • urlOrIdобязательно
    В
    path
    Тип
    string
    Описание
    Offer.url slug or Offer.id.
  • visibility
    В
    body
    Тип
    string
    Описание
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

Пример запроса

bash
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" \
  -H "Content-Type: application/json" \
  https://rmt.gg/api/v1/offers/YOUR_OFFER_URL/publish \
  -d '{"visibility":"PUBLIC"}'

API заказов

Заказы ограничены вашим аккаунтом продавца. Платежные данные покупателя могут быть скрыты в соответствии с правилами конфиденциальности рынка.

GET/api/v1/orders
orders:read

Список заказов продавца

Поддерживает limit, offset, status, q и sort (новейшие, старейшие, total_high, total_low).

Параметры

  • limit
    В
    query
    Тип
    number
    Описание
    Page size.
  • offset
    В
    query
    Тип
    number
    Описание
    Pagination offset.
  • status
    В
    query
    Тип
    string
    Описание
    Filter by order status (for example PAID, DELIVERED, COMPLETED).
  • q
    В
    query
    Тип
    string
    Описание
    Search query (reference / related text).
  • sort
    В
    query
    Тип
    string
    Описание
    newest | oldest | total_high | total_low.
  • Response: { orders: Order[], total: number }.

Пример запроса

bash
curl -H "Authorization: Bearer rmt_sk_live_…" \
  "https://rmt.gg/api/v1/orders?status=PAID&limit=20&sort=newest"
GET/api/v1/orders/:uid
orders:read

Получить один заказ

Возвращает заказ с позициями. Используйте публичный uid заказа.

Параметры

  • uidобязательно
    В
    path
    Тип
    string
    Описание
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Пример запроса

bash
curl -H "Authorization: Bearer rmt_sk_live_…" \
  https://rmt.gg/api/v1/orders/ORDER_UID
POST/api/v1/orders/:uid/deliver
orders:write

Отметить как доставленный

Ручное выполнение. COMPLEX строки должны быть полностью прикреплены, когда это требуется. Вызывает order.delivered.

Параметры

  • uidобязательно
    В
    path
    Тип
    string
    Описание
    Order.uid.
  • evidence
    В
    body
    Тип
    string[]
    Описание
    Optional array of evidence URLs (screenshots, transfer proofs).
  • Response: { success: true, order }.
  • COMPLEX inventory lines must be fully attached before deliver when the product requires it.
  • Emits order.delivered webhook when configured.

Пример запроса

bash
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" \
  -H "Content-Type: application/json" \
  https://rmt.gg/api/v1/orders/ORDER_UID/deliver \
  -d @evidence.json

Тело запроса

json
{
  "evidence": [
    "https://cdn.example.com/proof-1.png"
  ]
}

Исходящие вебхуки

Настройте HTTPS конечные точки (или вебхуки Discord) в Настройки → Разработчик. RMT отправляет POST, когда срабатывают подписанные события.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • Формат JSON отправляет структурированный конверт с id, типом, созданием и данными.
  • Формат Discord отправляет богатые вложения с ссылками на заказы или предложения.
  • Необязательная подпись использует X-RMT-Timestamp и X-RMT-Signature (та же схема, что и резерв).
  • История доставки отображается под каждой конечной точкой, чтобы вы могли повторно попытаться выполнить неудачи. Конечные точки автоматически приостанавливаются после повторных неудач.

Конверт доставки JSON

json
{
  "id": "whd_…",
  "type": "order.paid",
  "created": "2026-07-23T12:00:00.000Z",
  "data": {
    "order": {
      "uid": "ord_…",
      "reference": "RMT-…",
      "status": "PAID",
      "url": "https://rmt.gg/orders/ord_…",
      "items": [ /* line items with offer names */ ]
    }
  }
}

Подписанные заголовки доставки

json
{
  "X-RMT-Event": "order.paid",
  "X-RMT-Delivery": "whd_…",
  "X-RMT-Timestamp": "1710000000",
  "X-RMT-Signature": "v1=abc123…"
}

Проверка подписей вебхуков

Когда установлена секретная подпись, вычислите HMAC-SHA256 по timestamp + '.' + rawBody и сравните с шестнадцатеричным значением после v1=.

Используйте байты сырого тела запроса, а не повторно сериализованный объект JSON. Отклоняйте устаревшие временные метки (например, старше пяти минут).

  • Читать сырые байты тела точно так, как они получены. Не парсить JSON и не сериализовать заново перед хешированием.
  • Используйте значение заголовка X-RMT-Timestamp в качестве префикса временной метки (та же строка, без переработки).
  • Сравните с безопасной проверкой на равенство по времени. Отклоняйте запросы с отсутствующими или несовпадающими подписями, когда настроен секрет.
  • При желании отклоняйте временные метки старше нескольких минут, чтобы ограничить повторные запросы. Та же схема применяется к событиям reserve.item и исходящих заказов.

Эскиз Node.js

javascript
import crypto from "node:crypto";

// secret = the signing secret you saved on RMT (never sent in the request)
// rawBody = exact POST body string (do not JSON.parse then re-stringify)
const timestamp = req.headers["x-rmt-timestamp"];
const signatureHeader = req.headers["x-rmt-signature"]; // "v1=<hex>"

const expected = crypto
  .createHmac("sha256", secret)
  .update(`${timestamp}.${rawBody}`)
  .digest("hex");
const provided = String(signatureHeader ?? "").replace(/^v1=/, "");
const ok =
  expected.length === provided.length &&
  crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(provided));

if (!ok) {
  // Reject: 401 Unauthorized
}

Резервировать вебхуки (пополнение инвентаря)

Для COMPLEX (уникальных единиц) предложений RMT может отправить POST на вашу HTTPS конечную точку после оплаты, чтобы создать следующую лицензию, аккаунт или ключ, когда местного запаса недостаточно.

Ошибки, безопасные для оплаты

Если ваша конечная точка истекает или возвращает недействительные данные, заказ остается ОПЛАЧЕННЫМ. Покупатель оплачивается; вы видите ошибку в заказе и можете повторно попытаться зарезервировать или вручную прикрепить ключи.

Как это настроить

  1. Создайте СЛОЖНОЕ предложение с полями предметов (например, Лицензия).
  2. На шаге Предметы включите конечную точку инвентаря по запросу и вставьте ваш публичный HTTPS URL.
  3. При желании установите секрет подписи, чтобы RMT отправлял X-RMT-Timestamp и X-RMT-Signature при каждом вызове.
  4. Запустите тест (или вставьте пример JSON), сопоставьте пути ответа с полями предметов, затем сохраните.
  5. Опубликуйте объявление. Покупатели могут приобретать с пустым локальным запасом; ключи создаются после оплаты.
  • Локальный запас всегда предпочтителен; вебхук заполняет только нехватку.
  • Настройте уровень предложения по умолчанию или переопределите для каждого ценового варианта на этапе предметов редактора предложений.
  • Только HTTPS. Необязательная HMAC подпись соответствует исходящим вебхукам (X-RMT-Event: reserve.item).
  • Тест в редакторе отправляет dryRun: true. На странице заказа используйте Повторить резервирование после исправления вашей конечной точки.

Каноническое тело POST (усеченное)

json
{
  "id": "rsv_…",
  "type": "reserve.item",
  "order": { "uid": "ord_…", "reference": "RMT-…", "url": "https://rmt.gg/orders/ord_…" },
  "offer": { "url": "my-offer", "title": "Game key", "pageUrl": "https://rmt.gg/offers/my-offer" },
  "option": { "id": 1, "name": "Standard" },
  "fields": [{ "id": 10, "name": "License", "type": "text", "required": true }],
  "quantity": 1
}

Заголовки запроса (когда установлен секрет подписи)

json
{
  "Content-Type": "application/json",
  "X-RMT-Event": "reserve.item",
  "X-RMT-Delivery": "rsv_…",
  "X-RMT-Timestamp": "1710000000",
  "X-RMT-Signature": "v1=abc123…"
}

Удобный ответ

json
{
  "entries": [
    { "name": "License", "value": "AAAA-BBBB-CCCC" }
  ]
}

Сопоставленные поля JSON (с путями responseMap, такими как $.license)

json
{
  "license": "AAAA-BBBB-CCCC",
  "email": "buyer-account@example.com",
  "password": "temporary-pass"
}

Как проверить секрет подписи

Если вы установили секрет в предложении, каждый POST запроса резервирования подписан. Пересчитайте HMAC-SHA256(секрет, временная метка + '.' + сырое тело) и сравните с X-RMT-Signature после удаления префикса v1=. Сам секрет никогда не включается в запрос.

Смотрите полный пример проверки

Не вызывайте резервирование до оплаты

RMT вызывает вашу конечную точку только после успешной оплаты, поэтому заброшенные покупки не сжигают лицензии.

Ошибки и лимиты скорости

Ошибки возвращают JSON { error, code? }. Трафик Open API ограничен до 300 запросов в минуту на каждый API ключ.

  • API_KEY_REQUIRED
    401

    Отсутствует заголовок Authorization или X-Api-Key.

  • API_KEY_INVALID
    401

    Ключ неизвестен, отозван, истек или доступ разработчика приостановлен.

  • SCOPE_MISSING
    403

    Ключ не имеет области, требуемой конечной точкой.

  • RATE_LIMITED
    429

    Слишком много запросов. Уважайте Retry-After и X-RateLimit-Reset.

  • RESERVE_FAILED
    400

    Резервный вебхук истек, вернул недействительные данные или пропустил обязательные поля.

Обрабатывайте 429

Уменьшите скорость, используя Retry-After секунды. Не меняйте ключи, чтобы обойти лимиты; лимит установлен на ключ и одинаков для всех продавцов.

Успешные ответы включают X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset.

Готовы автоматизировать?

Создайте ключ в настройках разработчика и подключите Discord или Telegram в разделе Уведомления.