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 инвентарь с помощью резервных вебхуков.

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

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

  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. Настройте конечные точки в настройках разработчика сегодня.

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

Новые ключи получают 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. Отклоняйте устаревшие временные метки (например, старше пяти минут).

Эскиз Node.js

javascript
import crypto from "node:crypto";

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

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

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

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

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

  • Локальный запас всегда предпочтителен; вебхук заполняет только нехватку.
  • Настройте уровень предложения по умолчанию или переопределите для каждого ценового варианта на этапе предметов редактора предложений.
  • Только 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
{
  "entries": [
    { "name": "License", "value": "AAAA-BBBB-CCCC" }
  ]
}

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

json
{
  "license": "AAAA-BBBB-CCCC",
  "email": "[email protected]",
  "password": "temporary-pass"
}

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

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.

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

Включите доступ для разработчиков, создайте ключ и подключите ваш первый вебхук в Настройках.