RMT.GG/Documentation développeur vendeur
v1

API Vendeur

Automatisez les annonces, réalisez des ventes et diffusez des événements de commande. Inclut des webhooks sortants et des points de terminaison de réserve pour le réapprovisionnement d'inventaire à la demande après paiement.

API REST Ouverte

Authentification par Bearer /api/v1 pour les offres et les commandes, avec des en-têtes de découverte et de limitation de taux.

Webhooks sortants

Livraisons HTTPS signées (ou Discord) pour les événements du cycle de vie des commandes et des offres.

Réserve / réapprovisionnement

Créez des stocks COMPLEX à partir de votre serveur après paiement lorsque l'inventaire local est insuffisant.

Ce que vous pouvez construire

L'API ouverte pour les vendeurs est destinée aux vendeurs qui souhaitent des alertes Discord, une synchronisation des stocks, une automatisation de style Zapier, ou un back office personnalisé sur RMT.GG.

  • Gérer les offres
    Créez des brouillons, mettez à jour des champs sécurisés, publiez et archivez via /api/v1/offers.
  • Réaliser des ventes
    Listez et inspectez les commandes des vendeurs, puis marquez-les comme livrées avec des URL de preuves optionnelles.
  • Rester sous la limite
    Chaque clé est limitée à 300 requêtes par minute. Les réponses incluent des en-têtes X-RateLimit-*.
  • Réagir en temps réel
    Abonnez-vous aux événements de commande et d'offre, ou réapprovisionnez l'inventaire COMPLEX avec des webhooks de réserve.

Démarrage rapide

Activez l'accès développeur, créez une clé, puis appelez la découverte pour imprimer le catalogue en direct.

  1. 1Ouvrez Paramètres → Développeur et activez l'accès (auto-service, pas d'attente d'approbation).
  2. 2Créez une clé API et copiez le secret une fois (rmt_sk_live_…). Conservez-le dans votre gestionnaire de secrets.
  3. 3Appelez GET /api/v1 avec Authorization: Bearer pour confirmer les scopes, les quotas et les opérations.
GET/api/v1

Document de découverte

Renvoie des scopes, des quotas, des événements de webhook et le catalogue complet des opérations. Toute clé API valide fonctionne.

Exemple de requête

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

Exemple de réponse

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

Authentification

Envoyez votre clé secrète en direct à chaque requête /api/v1. Préférez uniquement HTTPS. Ne jamais intégrer de clés dans des clients publics ou des bundles de navigateur.

En-tête préféré

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

En-tête alternatif

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

Faire tourner en cas de fuite

Si une clé fuit, révoquez-la dans les paramètres Développeur et créez-en une nouvelle. Mettez à jour votre automatisation avant de révoquer si vous êtes en direct.

Scopes

Chaque clé API porte des scopes qui contrôlent les points de terminaison. Un scope manquant renvoie 403 SCOPE_MISSING.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Lister et obtenir vos offres.
  • offers:write: Créer, mettre à jour, publier et supprimer des offres.
  • orders:read: Lister et obtenir les commandes des vendeurs.
  • orders:write: Marquer les commandes comme livrées.
  • webhooks:manage: Réservé pour la gestion future des webhooks de l'API ouverte. Configurez les points de terminaison dans les paramètres Développeur dès aujourd'hui.

Scopes par défaut des clés

Les nouvelles clés reçoivent offers:read, offers:write, orders:read et orders:write. La gestion CRUD des webhooks sortants reste dans l'interface des paramètres (authentification de session).

API des Offres

Les identifiants d'offres acceptent le slug d'URL public ou l'ID numérique. Les réponses omettent l'ID interne et sellerId.

Ce que PATCH ne peut pas encore changer

Les lignes de stock, les prix des options, les médias et les attributs sont gérés dans l'éditeur de vendeur (ou futurs points de terminaison), pas via PATCH aujourd'hui.

GET/api/v1/offers
offers:read

Lister vos offres

Filtrer avec archive=active (par défaut), archivé ou tout.

Paramètres

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

Exemple de requête

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

Exemple de réponse

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

Créer une offre brouillon

Crée un brouillon vide appartenant au vendeur authentifié. Aucun corps requis.

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

Exemple de requête

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

Exemple de réponse

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

Obtenir une offre

Charger par slug d'URL public ou ID numérique. Les relations (options) peuvent être incluses ; les articles de stock ne le sont pas.

Paramètres

  • urlOrIdrequis
    Dans
    path
    Type
    string
    Description
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Exemple de requête

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

Mettre à jour les champs de l'offre

Patch un sous-ensemble sécurisé des champs d'annonce. Émet offer.updated lorsque des webhooks sortants sont configurés.

Paramètres

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

Exemple de requête

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

Corps de la requête

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

Supprimer ou archiver

Les mêmes règles de suppression/archivage que l'interface vendeur.

Paramètres

  • urlOrIdrequis
    Dans
    path
    Type
    string
    Description
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Exemple de requête

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

Exemple de réponse

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

Publier une offre

Publie un brouillon (ou change la visibilité). Échoue avec 400 si les champs d'annonce requis sont incomplets.

Paramètres

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

Exemple de requête

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 des Commandes

Les commandes sont limitées à votre compte vendeur. Les détails de facturation de l'acheteur peuvent être masqués selon les règles de confidentialité du marché.

GET/api/v1/orders
orders:read

Lister les commandes des vendeurs

Prend en charge limit, offset, status, q et sort (nouveau, ancien, total_haut, total_bas).

Paramètres

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

Exemple de requête

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

Obtenir une commande

Renvoie la commande avec les lignes d'articles. Utilisez l'uid de commande public.

Paramètres

  • uidrequis
    Dans
    path
    Type
    string
    Description
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Exemple de requête

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

Marquer comme livré

Exécution manuelle. Les lignes COMPLEX doivent être entièrement attachées lorsque requis. Émet order.delivered.

Paramètres

  • uidrequis
    Dans
    path
    Type
    string
    Description
    Order.uid.
  • evidence
    Dans
    body
    Type
    string[]
    Description
    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.

Exemple de requête

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

Corps de la requête

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

Webhooks sortants

Configurez des points de terminaison HTTPS (ou des webhooks Discord) dans Paramètres → Développeur. RMT POST lorsque les événements abonnés se déclenchent.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • Le format JSON envoie une enveloppe structurée avec id, type, créé et données.
  • Le format Discord envoie des intégrations riches avec des liens de commande ou d'offre.
  • La signature optionnelle utilise X-RMT-Timestamp et X-RMT-Signature (même schéma que la réserve).
  • L'historique des livraisons apparaît sous chaque point de terminaison afin que vous puissiez réessayer les échecs. Les points de terminaison se mettent automatiquement en pause après des échecs répétés.

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

En-têtes de livraison signés

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

Vérifier les signatures des webhooks

Lorsqu'un secret de signature est défini, calculez HMAC-SHA256 sur timestamp + '.' + rawBody et comparez avec l'hex après v1=.

Utilisez les octets du corps de la requête brute, pas un objet JSON re-sérialisé. Rejetez les timestamps obsolètes (par exemple, plus vieux que cinq minutes).

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

Réserver des webhooks (réapprovisionnement d'inventaire)

Pour les annonces COMPLEX (unité unique), RMT peut POST votre point de terminaison HTTPS après paiement pour créer la prochaine licence, compte ou clé lorsque le stock local est insuffisant.

Échecs sécurisés par paiement

Si votre point de terminaison expire ou renvoie des données invalides, la commande reste PAYÉE. L'acheteur est facturé ; vous voyez une erreur sur la commande et pouvez réessayer de réserver ou attacher des clés manuellement.

  • Le stock local est toujours préféré ; le webhook ne remplit que le manque.
  • Configurez un défaut au niveau de l'offre, ou remplacez-le par option de tarification, à l'étape Items de l'éditeur d'offres.
  • HTTPS uniquement. La signature HMAC optionnelle correspond aux webhooks sortants (X-RMT-Event: reserve.item).
  • Tester dans l'éditeur envoie dryRun: true. Sur la page de commande, utilisez Réessayer la réserve après avoir corrigé votre point de terminaison.

Corps POST canonique (tronqué)

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
}

Réponse de commodité

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

Champs JSON mappés (avec des chemins responseMap comme $.license)

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

Ne pas appeler la réserve avant le paiement

RMT n'appelle votre point de terminaison qu'après le succès du paiement, donc les abandons de panier ne consomment pas de licences.

Erreurs et limites de taux

Les erreurs renvoient JSON { error, code? }. Le trafic de l'API ouverte est limité à 300 requêtes par minute par clé API.

  • API_KEY_REQUIRED
    401

    En-tête Authorization ou X-Api-Key manquant.

  • API_KEY_INVALID
    401

    Clé inconnue, révoquée, expirée ou accès développeur désactivé.

  • SCOPE_MISSING
    403

    La clé manque le scope requis par le point de terminaison.

  • RATE_LIMITED
    429

    Trop de requêtes. Respectez Retry-After et X-RateLimit-Reset.

  • RESERVE_FAILED
    400

    Le webhook de réservation a expiré, renvoyé des données invalides ou manqué des champs requis.

Gérer 429

Ralentissez en utilisant Retry-After secondes. Ne faites pas tourner les clés pour contourner les limites ; la limite est par clé et uniforme pour tous les vendeurs.

Les réponses réussies incluent X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.

Prêt à automatiser ?

Activez l'accès développeur, créez une clé et connectez votre premier webhook dans les paramètres.