RMT.GG/Satıcı geliştirici belgeleri
v1

Satıcı API

Listelemeleri otomatikleştir, satışları yerine getir ve sipariş olaylarını akışla. Ödeme sonrası talep üzerine envanter yenileme için dışa dönük webhook'lar ve rezerv uç noktaları içerir.

REST Açık API

Teklifler ve siparişler için Bearer kimlik doğrulamalı /api/v1, keşif ve hız sınırlama başlıkları ile.

Dışa dönük webhook'lar

Sipariş ve teklif yaşam döngüsü olayları için imzalı HTTPS (veya Discord) teslimatları.

Rezerve / yenile

Yerel envanter azaldığında, ödeme sonrası sunucunuzdan COMPLEX stok oluştur.

Neler inşa edebilirsiniz

Satıcı Açık API, Discord bildirimleri, stok senkronizasyonu, Zapier tarzı otomasyon veya RMT.GG üzerinde özel bir arka ofis isteyen satıcılar içindir.

  • Teklifleri yönetin
    Taslaklar oluşturun, güvenli alanları güncelleyin, yayınlayın ve /api/v1/offers üzerinden arşivleyin.
  • Satışları yerine getirin
    Satıcı siparişlerini listeleyin ve inceleyin, ardından isteğe bağlı kanıt URL'leri ile teslim edildi olarak işaretleyin.
  • Limitin altında kalın
    Her anahtar dakikada 300 istekle sınırlıdır. Yanıtlar X-RateLimit-* başlıklarını içerir.
  • Gerçek zamanlı tepki verin
    Sipariş ve teklif olaylarına abone olun veya rezerv webhook'ları ile COMPLEX envanteri yenileyin.

Hızlı başlangıç

Geliştirici erişimini etkinleştirin, bir anahtar oluşturun ve ardından canlı kataloğu yazdırmak için keşif çağrısı yapın.

  1. 1Ayarlar → Geliştirici'yi açın ve erişimi etkinleştirin (kendi kendine hizmet, onay beklemeden).
  2. 2Bir API anahtarı oluşturun ve gizli anahtarı bir kez kopyalayın (rmt_sk_live_…). Bunu gizli yöneticinizde saklayın.
  3. 3Kapsamları, kotaları ve işlemleri doğrulamak için Authorization: Bearer ile GET /api/v1 çağrısı yapın.
GET/api/v1

Keşif belgesi

Kapsamları, kotaları, webhook olaylarını ve tam işlemler kataloğunu döner. Herhangi bir geçerli API anahtarı çalışır.

Örnek istek

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

Örnek yanıt

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

Kimlik Doğrulama

Her /api/v1 isteğinde canlı gizli anahtarınızı gönderin. Sadece HTTPS tercih edin. Anahtarları kamuya açık istemcilerde veya tarayıcı paketlerinde asla gömülü olarak kullanmayın.

Tercih edilen başlık

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

Alternatif başlık

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

Sızıntı durumunda döndürün

Bir anahtar sızarsa, Geliştirici ayarlarında iptal edin ve yenisini oluşturun. Canlıysanız iptal etmeden önce otomasyonunuzu güncelleyin.

Kapsamlar

Her API anahtarı, uç noktaları kontrol eden kapsamları taşır. Eksik kapsam 403 SCOPE_MISSING döner.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Tekliflerinizi listeleyin ve alın.
  • offers:write: Teklifleri oluşturun, güncelleyin, yayınlayın ve silin.
  • orders:read: Satıcı siparişlerini listeleyin ve alın.
  • orders:write: Siparişleri teslim edildi olarak işaretleyin.
  • webhooks:manage: Gelecekteki Açık API webhook yönetimi için ayrılmıştır. Bugün Geliştirici ayarlarında uç noktaları yapılandırın.

Varsayılan anahtar kapsamları

Yeni anahtarlar offers:read, offers:write, orders:read ve orders:write alır. Dışa dönük webhook CRUD, Ayarlar UI'sında kalır (oturum kimlik doğrulaması).

Teklifler API

Teklif tanımlayıcıları, genel url slug'ını veya sayısal kimliği kabul eder. Yanıtlar içsel id ve sellerId'yi içermez.

PATCH'in henüz değiştiremeyeceği şeyler

Stok satırları, seçenek fiyatları, medya ve özellikler satıcı düzenleyicisinde (veya gelecekteki uç noktalar) yönetilir, bugün PATCH ile değil.

GET/api/v1/offers
offers:read

Tekliflerinizi listeleyin

archive=active (varsayılan), arşivlenmiş veya tüm ile filtreleyin.

Parametreler

  • archive
    İçinde
    query
    Tür
    string
    Açıklama
    One of "active" (default), "archived", or "all".
  • Response: { offers: Offer[], total: number }. Numeric id and sellerId are omitted.

Örnek istek

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

Örnek yanıt

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

Bir taslak teklif oluştur

Kimlik doğrulaması yapılmış satıcıya ait boş bir taslak oluşturur. Gövde gerekli değildir.

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

Örnek istek

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

Örnek yanıt

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

Bir teklifi al

Genel url slug'ı veya sayısal kimlik ile yükleyin. İlişkiler (seçenekler) dahil edilebilir; stok öğeleri dahil değildir.

Parametreler

  • urlOrIdgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Örnek istek

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

Teklif alanlarını güncelle

Listeleme alanlarının güvenli bir alt kümesini PATCH yapın. Dışa dönük webhook'lar yapılandırıldığında offer.updated yayar.

Parametreler

  • urlOrIdgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Offer.url slug or Offer.id.
  • title
    İçinde
    body
    Tür
    string
    Açıklama
    Listing title.
  • description
    İçinde
    body
    Tür
    string
    Açıklama
    Listing description.
  • visibility
    İçinde
    body
    Tür
    string
    Açıklama
    PUBLIC | PRIVATE | UNPUBLISHED.
  • categoryId
    İçinde
    body
    Tür
    number
    Açıklama
    Catalog category id.
  • offeringId
    İçinde
    body
    Tür
    number
    Açıklama
    Catalog offering id.
  • thumbnail
    İçinde
    body
    Tür
    string
    Açıklama
    Thumbnail URL or asset reference.
  • offerType
    İçinde
    body
    Tür
    string
    Açıklama
    Offer type string used by the listing.
  • listingMode
    İçinde
    body
    Tür
    string
    Açıklama
    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.

Örnek istek

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

İstek gövdesi

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

Sil veya arşivle

Satıcı UI'si ile aynı sil/arşiv kuralları.

Parametreler

  • urlOrIdgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Örnek istek

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

Örnek yanıt

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

Bir teklifi yayınla

Bir taslağı (veya görünürlüğü değiştirir) yayınlar. Gerekli listeleme alanları eksikse 400 ile başarısız olur.

Parametreler

  • urlOrIdgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Offer.url slug or Offer.id.
  • visibility
    İçinde
    body
    Tür
    string
    Açıklama
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

Örnek istek

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"}'

Siparişler API

Siparişler, satıcı hesabınıza özgüdür. Alıcı fatura detayları, kayıtlı pazar gizlilik kuralları altında gizlenebilir.

GET/api/v1/orders
orders:read

Satıcı siparişlerini listele

limit, offset, durum, q ve sıralama (en yeni, en eski, toplam_yüksek, toplam_düşük) destekler.

Parametreler

  • limit
    İçinde
    query
    Tür
    number
    Açıklama
    Page size.
  • offset
    İçinde
    query
    Tür
    number
    Açıklama
    Pagination offset.
  • status
    İçinde
    query
    Tür
    string
    Açıklama
    Filter by order status (for example PAID, DELIVERED, COMPLETED).
  • q
    İçinde
    query
    Tür
    string
    Açıklama
    Search query (reference / related text).
  • sort
    İçinde
    query
    Tür
    string
    Açıklama
    newest | oldest | total_high | total_low.
  • Response: { orders: Order[], total: number }.

Örnek istek

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

Bir siparişi al

Satır öğeleri ile siparişi döner. Genel sipariş uid'sini kullanın.

Parametreler

  • uidgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Örnek istek

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

Teslim edildi olarak işaretle

Manuel yerine getirme. COMPLEX satırları gerekli olduğunda tamamen eklenmelidir. order.delivered yayar.

Parametreler

  • uidgerekli
    İçinde
    path
    Tür
    string
    Açıklama
    Order.uid.
  • evidence
    İçinde
    body
    Tür
    string[]
    Açıklama
    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.

Örnek istek

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

İstek gövdesi

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

Dışa dönük webhook'lar

Ayarlar → Geliştirici'de HTTPS uç noktalarını (veya Discord webhook'larını) yapılandırın. Abone olunan olaylar tetiklendiğinde RMT POST yapar.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • JSON formatı, id, type, created ve data ile yapılandırılmış bir zarf gönderir.
  • Discord formatı, sipariş veya teklif bağlantıları ile zengin gömülü içerikler gönderir.
  • İsteğe bağlı imzalama, X-RMT-Timestamp ve X-RMT-Signature kullanır (rezerv ile aynı şemayı takip eder).
  • Teslimat geçmişi, her uç noktanın altında görünür, böylece hataları yeniden deneyebilirsiniz. Uç noktalar, tekrar eden hatalardan sonra otomatik olarak duraklatılır.

JSON teslimat zarfı

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

İmzalı teslimat başlıkları

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

Webhook imzalarını doğrula

Bir imzalama gizli anahtarı ayarlandığında, timestamp + '.' + rawBody üzerinde HMAC-SHA256 hesaplayın ve v1= sonrası hex ile karşılaştırın.

Yeniden serileştirilmiş bir JSON nesnesi değil, ham istek gövdesi baytlarını kullanın. Eski zaman damgalarını reddedin (örneğin, beş dakikadan daha eski).

Node.js taslağı

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'ları rezerve et (envanter yenileme)

COMPLEX (benzersiz birim) listelemeleri için, RMT, yerel stok azaldığında ödeme sonrası bir sonraki lisansı, hesabı veya anahtarı oluşturmak için HTTPS uç noktanıza POST yapabilir.

Ödeme güvenli hatalar

Eğer uç noktanız zaman aşımına uğrarsa veya geçersiz veri dönerse, sipariş PAID olarak kalır. Alıcıya ücretlendirilir; siparişte bir hata görürsünüz ve rezervi yeniden deneyebilir veya anahtarları manuel olarak ekleyebilirsiniz.

  • Yerel stok her zaman tercih edilir; webhook yalnızca eksik kısmı doldurur.
  • Teklif düzenleyicisinin Öğeler adımında, teklif düzeyinde varsayılanı yapılandırın veya fiyatlandırma seçeneğine göre geçersiz kılın.
  • Sadece HTTPS. İsteğe bağlı HMAC imzalama, dışa dönük webhook'larla eşleşir (X-RMT-Event: reserve.item).
  • Düzenleyicide test yapmak dryRun: true gönderir. Sipariş sayfasında, uç noktanızı düzelttikten sonra Rezervi Yenile'yi kullanın.

Kanonik POST gövdesi (kısaltılmış)

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
}

Kolaylık yanıtı

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

Eşlenmiş JSON alanları (yanıtMap yolları gibi $.license)

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

Ödeme öncesinde rezerv çağrısı yapmayın

RMT, yalnızca ödeme başarılı olduktan sonra uç noktanıza çağrı yapar, bu nedenle terkedilmiş alışverişler lisansları yakmaz.

Hatalar ve hız limitleri

Hatalar JSON { error, code? } döner. Açık API trafiği, her API anahtarı için dakikada 300 istekle sınırlıdır.

  • API_KEY_REQUIRED
    401

    Authorization veya X-Api-Key başlığı eksik.

  • API_KEY_INVALID
    401

    Anahtar bilinmiyor, iptal edilmiş, süresi dolmuş veya geliştirici erişimi devre dışı bırakılmış.

  • SCOPE_MISSING
    403

    Anahtar, uç noktanın gerektirdiği kapsamı taşımıyor.

  • RATE_LIMITED
    429

    Çok fazla istek. Retry-After ve X-RateLimit-Reset'e saygı gösterin.

  • RESERVE_FAILED
    400

    Rezerv webhook'u zaman aşımına uğradı, geçersiz veri döndü veya gerekli alanları atladı.

429 ile başa çıkın

Retry-After saniyelerini kullanarak geri çekilin. Limitleri aşmak için anahtarları döndürmeyin; limit her anahtar için ve tüm satıcılar için sabittir.

Başarılı yanıtlar X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset içerir.

Otomatikleştirmeye hazır mısınız?

Geliştirici erişimini etkinleştirin, bir anahtar oluşturun ve Ayarlar'da ilk webhook'unuzu bağlayın.