RMT.GG/Documentación para desarrolladores vendedores
v1

API para vendedores

Automatiza listados, cumple ventas y transmite eventos de pedidos. Incluye webhooks salientes y puntos finales de reserva para reabastecimiento de inventario a demanda después del pago.

API REST Abierta

Autenticación Bearer en /api/v1 para ofertas y pedidos, con encabezados de descubrimiento y límite de tasa.

Webhooks salientes

Entregas HTTPS (o Discord) firmadas para eventos del ciclo de vida de pedidos y ofertas.

Reserva / reabastecimiento

Crea stock COMPLEJO desde tu servidor después del pago cuando el inventario local esté corto.

Lo que puedes construir

La API Abierta para Vendedores es para vendedores que quieren alertas de Discord, sincronización de stock, automatización al estilo Zapier, o una oficina trasera personalizada sobre RMT.GG.

  • Gestionar ofertas
    Crea borradores, actualiza campos seguros, publica y archiva a través de /api/v1/offers.
  • Cumplir ventas
    Lista e inspecciona los pedidos de los vendedores, luego márcalos como entregados con URLs de evidencia opcionales.
  • Mantente dentro del límite
    Cada clave tiene un límite de 300 solicitudes por minuto. Las respuestas incluyen encabezados X-RateLimit-*.
  • Reacciona en tiempo real
    Suscríbete a eventos de pedidos y ofertas, o reabastece el inventario COMPLEJO con webhooks de reserva.

Inicio rápido

Habilita el acceso para desarrolladores, crea una clave y luego llama a descubrimiento para imprimir el catálogo en vivo.

  1. 1Abre Configuración → Desarrollador y habilita el acceso (auto-servicio, sin espera de aprobación).
  2. 2Crea una clave de API y copia la clave secreta una vez (rmt_sk_live_…). Almacénala en tu gestor de secretos.
  3. 3Llama a GET /api/v1 con Authorization: Bearer para confirmar ámbitos, cuotas y operaciones.
GET/api/v1

Documento de descubrimiento

Devuelve ámbitos, cuotas, eventos de webhook y el catálogo completo de operaciones. Cualquier clave de API válida funciona.

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Autenticación

Envía tu clave secreta en vivo en cada solicitud a /api/v1. Prefiere solo HTTPS. Nunca incrustes claves en clientes públicos o paquetes de navegador.

Encabezado preferido

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

Encabezado alternativo

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

Rotar en caso de filtración

Si una clave se filtra, revócala en la configuración de Desarrollador y crea una nueva. Actualiza tu automatización antes de revocar si estás en vivo.

Ámbitos

Cada clave de API tiene ámbitos que restringen los puntos finales. Un ámbito faltante devuelve 403 SCOPE_MISSING.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Listar y obtener tus ofertas.
  • offers:write: Crear, actualizar, publicar y eliminar ofertas.
  • orders:read: Listar y obtener pedidos de vendedores.
  • orders:write: Marcar pedidos como entregados.
  • webhooks:manage: Reservado para la futura gestión de webhooks de la API Abierta. Configura puntos finales en la configuración de Desarrollador hoy.

Ámbitos de clave predeterminados

Las nuevas claves reciben offers:read, offers:write, orders:read y orders:write. El CRUD de webhooks salientes permanece en la interfaz de usuario de Configuración (autenticación de sesión).

API de Ofertas

Los identificadores de ofertas aceptan el slug de URL pública o el id numérico. Las respuestas omiten el id interno y sellerId.

Lo que PATCH no puede cambiar aún

Las filas de stock, precios de opciones, medios y atributos se gestionan en el editor de vendedores (o futuros puntos finales), no a través de PATCH hoy.

GET/api/v1/offers
offers:read

Lista tus ofertas

Filtra con archive=active (predeterminado), archived o all.

Parámetros

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

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Crear una oferta en borrador

Crea un borrador vacío propiedad del vendedor autenticado. No se requiere cuerpo.

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

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Obtener una oferta

Carga por slug de URL pública o id numérico. Las relaciones (opciones) pueden incluirse; los artículos de stock no.

Parámetros

  • urlOrIdrequerido
    En
    path
    Tipo
    string
    Descripción
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Ejemplo de solicitud

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

Actualizar campos de oferta

Parchea un subconjunto seguro de campos de listado. Emite offer.updated cuando los webhooks salientes están configurados.

Parámetros

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

Ejemplo de solicitud

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

Cuerpo de la solicitud

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

Eliminar o archivar

Las mismas reglas de eliminación/archivo que la interfaz de usuario del vendedor.

Parámetros

  • urlOrIdrequerido
    En
    path
    Tipo
    string
    Descripción
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Ejemplo de solicitud

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

Ejemplo de respuesta

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

Publicar una oferta

Publica un borrador (o cambia la visibilidad). Falla con 400 si los campos de listado requeridos están incompletos.

Parámetros

  • urlOrIdrequerido
    En
    path
    Tipo
    string
    Descripción
    Offer.url slug or Offer.id.
  • visibility
    En
    body
    Tipo
    string
    Descripción
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

Ejemplo de solicitud

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 de Pedidos

Los pedidos están restringidos a tu cuenta de vendedor. Los detalles de facturación del comprador pueden ser redactados bajo las reglas de privacidad del mercado de registro.

GET/api/v1/orders
orders:read

Lista de pedidos de vendedores

Soporta limit, offset, status, q y sort (nuevo, viejo, total_alto, total_bajo).

Parámetros

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

Ejemplo de solicitud

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

Obtener un pedido

Devuelve el pedido con artículos. Usa el uid de pedido público.

Parámetros

  • uidrequerido
    En
    path
    Tipo
    string
    Descripción
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Ejemplo de solicitud

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

Marcar como entregado

Cumplimiento manual. Las líneas COMPLEJAS deben estar completamente adjuntas cuando se requiera. Emite order.delivered.

Parámetros

  • uidrequerido
    En
    path
    Tipo
    string
    Descripción
    Order.uid.
  • evidence
    En
    body
    Tipo
    string[]
    Descripción
    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.

Ejemplo de solicitud

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

Cuerpo de la solicitud

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

Webhooks salientes

Configura puntos finales HTTPS (o webhooks de Discord) en Configuración → Desarrollador. RMT envía POST cuando se activan eventos suscritos.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • El formato JSON publica un sobre estructurado con id, tipo, creado y datos.
  • El formato Discord publica embeds ricos con enlaces de pedidos u ofertas.
  • La firma opcional utiliza X-RMT-Timestamp y X-RMT-Signature (el mismo esquema que la reserva).
  • El historial de entregas aparece bajo cada punto final para que puedas reintentar fallos. Los puntos finales se pausarán automáticamente después de fallos repetidos.

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

Encabezados de entrega firmados

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

Verificar firmas de webhook

Cuando se establece un secreto de firma, calcula HMAC-SHA256 sobre timestamp + '.' + rawBody y compáralo con el hex después de v1=.

Utiliza los bytes del cuerpo de la solicitud en crudo, no un objeto JSON re-serializado. Rechaza timestamps obsoletos (por ejemplo, mayores a cinco minutos).

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

Reservar webhooks (reabastecimiento de inventario)

Para listados COMPLEJOS (unidad única), RMT puede POSTear tu punto final HTTPS después del pago para crear la siguiente licencia, cuenta o clave cuando el stock local esté corto.

Fallos seguros de pago

Si tu punto final se agota o devuelve datos inválidos, el pedido permanece PAGADO. Se cobra al comprador; ves un error en el pedido y puedes reintentar la reserva o adjuntar claves manualmente.

  • El stock local siempre es preferido; el webhook solo llena el déficit.
  • Configura un valor predeterminado a nivel de oferta, o anula por opción de precio, en el paso de Items del editor de ofertas.
  • Solo HTTPS. La firma HMAC opcional coincide con los webhooks salientes (X-RMT-Event: reserve.item).
  • Probar en el editor envía dryRun: true. En la página de pedidos, usa Reintentar reserva después de arreglar tu punto final.

Cuerpo POST canónico (truncado)

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
}

Respuesta de conveniencia

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

Campos JSON mapeados (con rutas responseMap como $.license)

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

No llames a la reserva antes del pago

RMT solo llama a tu punto final después de que el pago tenga éxito, por lo que los checkouts abandonados no queman licencias.

Errores y límites de tasa

Los errores devuelven JSON { error, code? }. El tráfico de la API Abierta está limitado a 300 solicitudes por minuto por clave de API.

  • API_KEY_REQUIRED
    401

    Falta el encabezado Authorization o X-Api-Key.

  • API_KEY_INVALID
    401

    Clave desconocida, revocada, expirada o acceso de desarrollador deshabilitado.

  • SCOPE_MISSING
    403

    La clave carece del ámbito requerido por el punto final.

  • RATE_LIMITED
    429

    Demasiadas solicitudes. Respeta Retry-After y X-RateLimit-Reset.

  • RESERVE_FAILED
    400

    El webhook de reserva se agotó, devolvió datos inválidos o faltaron campos requeridos.

Manejar 429

Retrocede usando Retry-After segundos. No gires claves para eludir límites; el límite es por clave y es plano para todos los vendedores.

Las respuestas exitosas incluyen X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Reset.

¿Listo para automatizar?

Habilita el acceso para desarrolladores, crea una clave y conecta tu primer webhook en Configuración.