Включите доступ для разработчиков
Откройте Настройки → Разработчик, включите доступ, затем создайте API ключ и необязательные конечные точки вебхуков.
- Ключи привязаны к вашей учетной записи продавца и могут быть отозваны в любое время.
- Открытый трафик API ограничен 300 запросами в минуту для каждого продавца.
- GET /api/v1 возвращает метаданные обнаружения для доступных ресурсов.
Аутентификация и вызов API
Отправьте Authorization: Bearer с вашим живым секретным ключом. Предпочитайте только HTTPS. Никогда не встраивайте ключи в публичные клиенты.
- offers:read: список и получение предложений.
- offers:write: создание, обновление, публикация и удаление предложений.
- orders:read: список и получение заказов продавца.
- orders:write: пометить заказы как доставленные.
Список недавних заказов
curl -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1/orders
Смените ключи
Если ключ утечет, отозовите его в настройках разработчика и создайте новый. Обновите свою автоматизацию перед отзывом, если вы в прямом эфире.
Открыть карту конечных точек API
Базовый путь - /api/v1. Успешные ответы включают X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset. GET /api/v1 возвращает каталог операций в машинно-читаемом формате, который соответствует этой статье.
- GET /api/v1: обнаружение (любой действительный ключ).
- GET /api/v1/offers: список предложений (offers:read).
- POST /api/v1/offers: создать черновик (offers:write).
- GET /api/v1/offers/:urlOrId: получить предложение (offers:read).
- PATCH /api/v1/offers/:urlOrId: обновить поля предложения (offers:write).
- DELETE /api/v1/offers/:urlOrId: удалить или архивировать (offers:write).
- POST /api/v1/offers/:urlOrId/publish: опубликовать (offers:write).
- GET /api/v1/orders: список продаж (orders:read).
- GET /api/v1/orders/:uid: получить заказ (orders:read).
- POST /api/v1/orders/:uid/deliver: пометить как доставленный (orders:write).
Вывести каталог операций в реальном времени
curl -s -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1 | jq ".operations"
API предложений
Идентификаторы предложений принимают публичный URL-слуг или числовой ID. Ответы не содержат внутренний ID и sellerId. Строки запасов, цены опций, медиа и атрибуты управляются в редакторе продавца (или будущих конечных точках), а не через PATCH пока.
Список активных предложений
curl -H "Authorization: Bearer rmt_sk_live_…" "https://rmt.gg/api/v1/offers?archive=active"
Создать черновик предложения
curl -X POST -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1/offers
Получить одно предложение с отношениями
curl -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1/offers/YOUR_OFFER_URL
Обновить разрешенные поля
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
Разрешенные поля тела PATCH
{
"title": "Обновленное название",
"description": "Описание для покупателя",
"visibility": "PUBLIC",
"categoryId": 12,
"offeringId": 34,
"thumbnail": "https://…",
"offerType": "ACCOUNT",
"listingMode": "STANDARD"
}Опубликовать (по умолчанию PUBLIC)
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"}'Удалить или архивировать
curl -X DELETE -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1/offers/YOUR_OFFER_URL
Требования к публикации
Публикация завершается с ошибкой 400, если обязательные поля списка неполные (та же валидация, что и в редакторе предложений). Успешные обновления могут вызывать webhook offer.updated.
API заказов
Заказы привязаны к вашему аккаунту продавца. Данные о выставлении счетов покупателя могут быть скрыты. Используйте публичный uid заказа (не только непрозрачную ссылку) для получения и доставки.
Список недавних оплаченных продаж
curl -H "Authorization: Bearer rmt_sk_live_…" "https://rmt.gg/api/v1/orders?status=PAID&limit=20&sort=newest"
Получить один заказ с позициями
curl -H "Authorization: Bearer rmt_sk_live_…" https://rmt.gg/api/v1/orders/ORDER_UID
Пометить как доставленный
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
Дополнительное тело доказательства
{
"evidence": [
"https://cdn.example.com/proof-1.png"
]
}Ошибки и лимиты запросов
Ошибки возвращают JSON { error, code? }. Лимит запросов составляет 300 запросов в минуту на каждый API ключ.
- 401 API_KEY_REQUIRED или API_KEY_INVALID.
- 403 SCOPE_MISSING, когда ключу не хватает области конечной точки.
- 404 Не найдено для предложений или заказов, которые вам не принадлежат (то же сообщение в любом случае).
- 429 RATE_LIMITED с заголовками Retry-After и X-RateLimit-*.
- 400 для ошибок валидации (публикация неполная, доставка не разрешена, пустой PATCH).
Обработка 429
Уменьшите частоту запросов, используя Retry-After секунды. Не меняйте ключи, чтобы обойти лимиты; лимит установлен на каждый ключ и одинаков для всех продавцов.
Исходящие вебхуки заказа
Подпишитесь на order.paid, order.delivered, order.completed, order.refunded и order.disputed. Выберите JSON для вашего сервера или Discord для встраивания в каналы. Необязательная подпись использует X-RMT-Timestamp и X-RMT-Signature.
- Формат Discord публикует богатые встраивания с ссылкой на заказ и названием предложения.
- Формат JSON публикует структурированное тело, включая названия предложений и позиции.
- Если вы установили секрет, проверьте HMAC-SHA256 временной метки.body равен шестнадцатеричному v1= подписи.
- История доставки появляется под каждой конечной точкой, чтобы вы могли повторить неудачи.
Пример подписанных заголовков
{
"X-RMT-Event": "order.paid",
"X-RMT-Timestamp": "1710000000",
"X-RMT-Signature": "v1=abc123…"
}Проверьте подписи
Вычислите HMAC-SHA256 по строке timestamp + "." + rawBody, используя ваш секрет конечной точки. Сравните с шестнадцатеричным после v1=.
Эскиз Node.js
import crypto from "crypto";
const expected = crypto
.createHmac("sha256", secret)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
const ok = expected === signature.replace(/^v1=/, "");