RMT.GG/出品者開発者ドキュメント
v1

出品者API

リスティングを自動化し、販売を履行し、注文イベントをストリームします。支払い後のオンデマンド在庫補充のためのアウトバウンドWebhookと予約エンドポイントを含みます。

RESTオープンAPI

オファーと注文のためのBearer認証付き/api/v1、ディスカバリーとレート制限ヘッダー付き。

アウトバウンドWebhook

注文とオファーのライフサイクルイベントのための署名されたHTTPS(またはDiscord)配信。

予約 / 補充

ローカル在庫が不足している場合、支払い後にサーバーからCOMPLEXストックをミントします。

構築できるもの

出品者オープンAPIは、Discordアラート、在庫同期、Zapierスタイルの自動化、またはRMT.GGの上にカスタムバックオフィスを望む出品者のためのものです。

  • オファーを管理
    ドラフトを作成し、安全なフィールドを更新し、公開し、/api/v1/offers経由でアーカイブします。
  • 販売を履行
    出品者の注文をリストし、検査し、オプションの証拠URLで配達済みとしてマークします。
  • 制限内に留まる
    各キーは、300リクエスト/分に制限されています。レスポンスにはX-RateLimit-*ヘッダーが含まれます。
  • リアルタイムで反応
    注文とオファーのイベントにサブスクライブするか、予約WebhookでCOMPLEX在庫を補充します。

クイックスタート

開発者アクセスを有効にし、キーをミントし、ディスカバリーを呼び出してライブカタログを印刷します。

  1. 1設定 → 開発者を開き、アクセスを有効にします(セルフサービス、承認待ちなし)。
  2. 2APIキーを作成し、シークレットを一度コピーします(rmt_sk_live_…)。シークレットマネージャーに保存します。
  3. 3GET /api/v1を呼び出し、Authorization: Bearerでスコープ、クォータ、操作を確認します。
GET/api/v1

ディスカバリードキュメント

スコープ、クォータ、Webhookイベント、および完全な操作カタログを返します。任意の有効な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: 将来のオープンAPIWebhook管理のために予約されています。今日、開発者設定でエンドポイントを構成してください。

デフォルトキーのスコープ

新しいキーはoffers:read、offers:write、orders:read、およびorders:writeを受け取ります。アウトバウンドWebhookのCRUDは設定UI(セッション認証)に残ります。

オファー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

1つのオファーを取得

公開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

オファーフィールドを更新

リスティングフィールドの安全なサブセットをPATCHします。アウトバウンドWebhookが構成されている場合、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

削除またはアーカイブ

出品者UIと同じ削除/アーカイブルールです。

パラメータ

  • 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(newest、oldest、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

1つの注文を取得

行アイテムを含む注文を返します。公開注文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"
  ]
}

アウトバウンドWebhook

設定 → 開発者でHTTPSエンドポイント(またはDiscord Webhook)を構成します。サブスクライブされたイベントが発火するとRMTがPOSTします。

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • JSON形式は、id、type、created、およびdataを含む構造化された封筒を投稿します。
  • 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…"
}

Webhook署名の確認

署名シークレットが設定されている場合、timestamp + '.' + rawBodyに対してHMAC-SHA256を計算し、v1=の後の16進数と比較します。

生のリクエストボディバイトを使用し、再シリアライズされたJSONオブジェクトは使用しません。古いタイムスタンプ(例えば5分以上前)は拒否します。

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));

Webhookを予約(在庫補充)

COMPLEX(ユニークユニット)リスティングの場合、RMTは支払い後に次のライセンス、アカウント、またはキーをミントするためにあなたのHTTPSエンドポイントにPOSTできます。ローカル在庫が不足している場合。

支払い安全な失敗

エンドポイントがタイムアウトするか無効なデータを返すと、注文はPAIDのままです。バイヤーは請求され、注文にエラーが表示され、予約を再試行するか手動でキーを添付できます。

  • ローカル在庫が常に優先され、Webhookは不足分のみを補充します。
  • オファーエディタのアイテムステップで、オファーレベルのデフォルトを構成するか、価格オプションごとに上書きします。
  • HTTPSのみ。オプションのHMAC署名はアウトバウンドWebhookと一致します(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フィールド(レスポンスマップパスは$.licenseのようになります)

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

支払い前に予約を呼び出さないでください

RMTは支払いが成功した後にのみエンドポイントを呼び出すため、放棄されたチェックアウトはライセンスを消費しません。

エラーとレート制限

エラーはJSON { error, code? }を返します。オープンAPIトラフィックは、APIキーごとに300リクエスト/分に制限されています。

  • 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

    予約Webhookがタイムアウトした、無効なデータを返した、または必須フィールドが不足していました。

429を処理する

Retry-After秒を使用してバックオフします。制限を回避するためにキーをローテーションしないでください。制限はキーごとであり、すべての出品者に対してフラットです。

成功したレスポンスにはX-RateLimit-Limit、X-RateLimit-Remaining、およびX-RateLimit-Resetが含まれます。

自動化の準備はできましたか?

開発者アクセスを有効にし、キーを作成し、設定で最初のWebhookを接続します。