RMT.GG/Dokumen pengembang penjual
v1

API Penjual

Automatisasi daftar, penuhi penjualan, dan alirkan peristiwa pesanan. Termasuk webhook keluar dan endpoint cadangan untuk pengisian ulang inventaris on-demand setelah pembayaran.

REST Open API

Autentikasi Bearer /api/v1 untuk penawaran dan pesanan, dengan header penemuan dan batasan laju.

Webhook keluar

Pengiriman HTTPS (atau Discord) yang ditandatangani untuk peristiwa siklus hidup pesanan dan penawaran.

Cadangkan / isi ulang

Minta stok COMPLEX dari server Anda setelah pembayaran ketika inventaris lokal kurang.

Apa yang bisa Anda bangun

API Terbuka Penjual ditujukan untuk penjual yang ingin mendapatkan pemberitahuan Discord, sinkronisasi stok, otomatisasi gaya Zapier, atau kantor belakang kustom di atas RMT.GG.

  • Kelola penawaran
    Buat draf, perbarui bidang aman, terbitkan, dan arsipkan melalui /api/v1/offers.
  • Penuhi penjualan
    Daftar dan periksa pesanan penjual, lalu tandai sebagai terkirim dengan URL bukti opsional.
  • Tetap di bawah batas
    Setiap kunci dibatasi pada 300 permintaan per menit. Respons menyertakan header X-RateLimit-*.
  • Reaksi secara real-time
    Langganan peristiwa pesanan dan penawaran, atau isi ulang inventaris COMPLEX dengan webhook cadangan.

Mulai cepat

Aktifkan akses pengembang, buat kunci, lalu panggil penemuan untuk mencetak katalog langsung.

  1. 1Buka Pengaturan → Pengembang dan aktifkan akses (mandiri, tanpa menunggu persetujuan).
  2. 2Buat kunci API dan salin rahasia sekali (rmt_sk_live_…). Simpan di pengelola rahasia Anda.
  3. 3Panggil GET /api/v1 dengan Authorization: Bearer untuk mengonfirmasi lingkup, kuota, dan operasi.
GET/api/v1

Dokumen penemuan

Mengembalikan lingkup, kuota, peristiwa webhook, dan katalog operasi lengkap. Setiap kunci API yang valid berfungsi.

Contoh permintaan

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

Contoh respons

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 */ ]
}

Autentikasi

Kirim kunci rahasia langsung Anda di setiap permintaan /api/v1. Utamakan hanya HTTPS. Jangan pernah menyematkan kunci di klien publik atau bundel browser.

Header yang disukai

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

Header alternatif

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

Putar saat kebocoran

Jika kunci bocor, cabut di pengaturan Pengembang dan buat yang baru. Perbarui otomatisasi Anda sebelum mencabut jika Anda sedang aktif.

Lingkup

Setiap kunci API membawa lingkup yang mengatur endpoint. Lingkup yang hilang mengembalikan 403 SCOPE_MISSING.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Daftar dan dapatkan penawaran Anda.
  • offers:write: Buat, perbarui, terbitkan, dan hapus penawaran.
  • orders:read: Daftar dan dapatkan pesanan penjual.
  • orders:write: Tandai pesanan terkirim.
  • webhooks:manage: Dikhususkan untuk pengelolaan webhook API Terbuka di masa depan. Konfigurasikan endpoint di pengaturan Pengembang hari ini.

Lingkup kunci default

Kunci baru menerima offers:read, offers:write, orders:read, dan orders:write. CRUD webhook keluar tetap di UI Pengaturan (autentikasi sesi).

API Penawaran

Identifikasi penawaran menerima slug URL publik atau id numerik. Respons menghilangkan id internal dan sellerId.

Apa yang tidak bisa diubah oleh PATCH saat ini

Baris stok, harga opsi, media, dan atribut dikelola di editor penjual (atau endpoint di masa depan), bukan melalui PATCH saat ini.

GET/api/v1/offers
offers:read

Daftar penawaran Anda

Saring dengan archive=active (default), diarsipkan, atau semua.

Parameter

  • archive
    Dalam
    query
    Tipe
    string
    Deskripsi
    One of "active" (default), "archived", or "all".
  • Response: { offers: Offer[], total: number }. Numeric id and sellerId are omitted.

Contoh permintaan

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

Contoh respons

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

Buat penawaran draf

Membuat draf kosong yang dimiliki oleh penjual yang terautentikasi. Tidak ada badan yang diperlukan.

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

Contoh permintaan

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

Contoh respons

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

Dapatkan satu penawaran

Muat dengan slug URL publik atau id numerik. Hubungan (opsi) mungkin disertakan; item stok tidak.

Parameter

  • urlOrIddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Contoh permintaan

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

Perbarui bidang penawaran

Patch subset aman dari bidang daftar. Mengeluarkan offer.updated saat webhook keluar dikonfigurasi.

Parameter

  • urlOrIddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Offer.url slug or Offer.id.
  • title
    Dalam
    body
    Tipe
    string
    Deskripsi
    Listing title.
  • description
    Dalam
    body
    Tipe
    string
    Deskripsi
    Listing description.
  • visibility
    Dalam
    body
    Tipe
    string
    Deskripsi
    PUBLIC | PRIVATE | UNPUBLISHED.
  • categoryId
    Dalam
    body
    Tipe
    number
    Deskripsi
    Catalog category id.
  • offeringId
    Dalam
    body
    Tipe
    number
    Deskripsi
    Catalog offering id.
  • thumbnail
    Dalam
    body
    Tipe
    string
    Deskripsi
    Thumbnail URL or asset reference.
  • offerType
    Dalam
    body
    Tipe
    string
    Deskripsi
    Offer type string used by the listing.
  • listingMode
    Dalam
    body
    Tipe
    string
    Deskripsi
    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.

Contoh permintaan

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

Badan permintaan

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

Hapus atau arsipkan

Aturan hapus/arsip yang sama seperti UI penjual.

Parameter

  • urlOrIddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Contoh permintaan

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

Contoh respons

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

Terbitkan penawaran

Menerbitkan draf (atau mengubah visibilitas). Gagal dengan 400 jika bidang daftar yang diperlukan tidak lengkap.

Parameter

  • urlOrIddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Offer.url slug or Offer.id.
  • visibility
    Dalam
    body
    Tipe
    string
    Deskripsi
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

Contoh permintaan

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 Pesanan

Pesanan terikat pada akun penjual Anda. Detail penagihan pembeli mungkin disunting sesuai dengan aturan privasi marketplace-of-record.

GET/api/v1/orders
orders:read

Daftar pesanan penjual

Mendukung batas, offset, status, q, dan urutkan (terbaru, terlama, total_tinggi, total_rendah).

Parameter

  • limit
    Dalam
    query
    Tipe
    number
    Deskripsi
    Page size.
  • offset
    Dalam
    query
    Tipe
    number
    Deskripsi
    Pagination offset.
  • status
    Dalam
    query
    Tipe
    string
    Deskripsi
    Filter by order status (for example PAID, DELIVERED, COMPLETED).
  • q
    Dalam
    query
    Tipe
    string
    Deskripsi
    Search query (reference / related text).
  • sort
    Dalam
    query
    Tipe
    string
    Deskripsi
    newest | oldest | total_high | total_low.
  • Response: { orders: Order[], total: number }.

Contoh permintaan

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

Dapatkan satu pesanan

Mengembalikan pesanan dengan item baris. Gunakan uid pesanan publik.

Parameter

  • uiddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Contoh permintaan

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

Tandai terkirim

Pemenuhan manual. Baris COMPLEX harus sepenuhnya terlampir saat diperlukan. Mengeluarkan order.delivered.

Parameter

  • uiddiperlukan
    Dalam
    path
    Tipe
    string
    Deskripsi
    Order.uid.
  • evidence
    Dalam
    body
    Tipe
    string[]
    Deskripsi
    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.

Contoh permintaan

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

Badan permintaan

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

Webhook keluar

Konfigurasikan endpoint HTTPS (atau webhook Discord) di Pengaturan → Pengembang. RMT POST saat peristiwa yang dilanggan terjadi.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • Format JSON mengirimkan amplop terstruktur dengan id, tipe, dibuat, dan data.
  • Format Discord mengirimkan embed kaya dengan tautan pesanan atau penawaran.
  • Tanda tangan opsional menggunakan X-RMT-Timestamp dan X-RMT-Signature (skema yang sama seperti cadangan).
  • Riwayat pengiriman muncul di bawah setiap endpoint sehingga Anda dapat mencoba ulang kegagalan. Endpoint otomatis berhenti setelah kegagalan berulang.

Amplop pengiriman 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 */ ]
    }
  }
}

Header pengiriman yang ditandatangani

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

Verifikasi tanda tangan webhook

Ketika rahasia tanda tangan diatur, hitung HMAC-SHA256 atas timestamp + '.' + rawBody dan bandingkan dengan hex setelah v1=.

Gunakan byte badan permintaan mentah, bukan objek JSON yang diserialisasi ulang. Tolak timestamp yang kedaluwarsa (misalnya lebih dari lima menit).

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

Cadangkan webhook (pengisian ulang inventaris)

Untuk daftar COMPLEX (unit unik), RMT dapat POST endpoint HTTPS Anda setelah pembayaran untuk mencetak lisensi, akun, atau kunci berikutnya ketika stok lokal kurang.

Kegagalan aman pembayaran

Jika endpoint Anda habis waktu atau mengembalikan data tidak valid, pesanan tetap PAID. Pembeli dikenakan biaya; Anda melihat kesalahan pada pesanan dan dapat mencoba ulang cadangan atau melampirkan kunci secara manual.

  • Stok lokal selalu diutamakan; webhook hanya mengisi kekurangan.
  • Konfigurasikan default tingkat penawaran, atau ganti per opsi harga, di langkah Item editor penawaran.
  • Hanya HTTPS. Tanda tangan HMAC opsional cocok dengan webhook keluar (X-RMT-Event: reserve.item).
  • Pengujian di editor mengirim dryRun: true. Di halaman pesanan, gunakan Retry reserve setelah memperbaiki endpoint Anda.

Badan POST kanonik (dipangkas)

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
}

Respons kenyamanan

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

Bidang JSON yang dipetakan (dengan jalur responseMap seperti $.license)

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

Jangan panggil cadangan sebelum pembayaran

RMT hanya memanggil endpoint Anda setelah pembayaran berhasil, jadi checkout yang ditinggalkan tidak membakar lisensi.

Kesalahan dan batasan laju

Kesalahan mengembalikan JSON { error, code? }. Lalu lintas API Terbuka dibatasi pada 300 permintaan per menit per kunci API.

  • API_KEY_REQUIRED
    401

    Header Authorization atau X-Api-Key hilang.

  • API_KEY_INVALID
    401

    Kunci tidak dikenal, dicabut, kedaluwarsa, atau akses pengembang dinonaktifkan.

  • SCOPE_MISSING
    403

    Kunci tidak memiliki lingkup yang diperlukan oleh endpoint.

  • RATE_LIMITED
    429

    Terlalu banyak permintaan. Hormati Retry-After dan X-RateLimit-Reset.

  • RESERVE_FAILED
    400

    Webhook cadangan habis waktu, mengembalikan data tidak valid, atau melewatkan bidang yang diperlukan.

Tangani 429

Kurangi penggunaan dengan Retry-After detik. Jangan putar kunci untuk menghindari batas; batasan berlaku per kunci dan datar untuk semua penjual.

Respons yang berhasil menyertakan X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset.

Siap untuk mengotomatisasi?

Aktifkan akses pengembang, buat kunci, dan sambungkan webhook pertama Anda di Pengaturan.