RMT.GG/Documentação para desenvolvedores vendedores
v1

API do Vendedor

Automatize listagens, cumpra vendas e transmita eventos de pedidos. Inclui webhooks de saída e endpoints de reserva para reabastecimento de inventário sob demanda após o pagamento.

API REST Aberta

Autenticação Bearer /api/v1 para ofertas e pedidos, com cabeçalhos de descoberta e limite de taxa.

Webhooks de saída

Entregas HTTPS (ou Discord) assinadas para eventos do ciclo de vida de pedidos e ofertas.

Reservar / reabastecer

Crie estoque COMPLEXO a partir do seu servidor após o pagamento quando o inventário local estiver baixo.

O que você pode construir

A API Aberta do Vendedor é para vendedores que desejam alertas do Discord, sincronização de estoque, automação estilo Zapier ou um back office personalizado em cima do RMT.GG.

  • Gerenciar ofertas
    Crie rascunhos, atualize campos seguros, publique e arquive via /api/v1/offers.
  • Cumprir vendas
    Liste e inspecione pedidos de vendedores, depois marque-os como entregues com URLs de evidência opcionais.
  • Fique dentro do limite
    Cada chave tem um limite de 300 requisições por minuto. As respostas incluem cabeçalhos X-RateLimit-*.
  • Reaja em tempo real
    Inscreva-se em eventos de pedidos e ofertas, ou reabasteça o inventário COMPLEXO com webhooks de reserva.

Início rápido

Ative o acesso de desenvolvedor, crie uma chave e depois chame a descoberta para imprimir o catálogo ao vivo.

  1. 1Abra Configurações → Desenvolvedor e ative o acesso (autoatendimento, sem espera de aprovação).
  2. 2Crie uma chave de API e copie a chave secreta uma vez (rmt_sk_live_…). Armazene-a no seu gerenciador de segredos.
  3. 3Chame GET /api/v1 com Authorization: Bearer para confirmar escopos, cotas e operações.
GET/api/v1

Documento de descoberta

Retorna escopos, cotas, eventos de webhook e o catálogo completo de operações. Qualquer chave de API válida funciona.

Exemplo de requisição

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

Exemplo de resposta

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

Autenticação

Envie sua chave secreta ao vivo em cada requisição /api/v1. Prefira apenas HTTPS. Nunca insira chaves em clientes públicos ou pacotes de navegador.

Cabeçalho preferido

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

Cabeçalho alternativo

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

Rotacione em caso de vazamento

Se uma chave vazar, revogue-a nas configurações de Desenvolvedor e crie uma nova. Atualize sua automação antes de revogar se você estiver ao vivo.

Escopos

Cada chave de API possui escopos que controlam os endpoints. Escopo ausente retorna 403 SCOPE_MISSING.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: Listar e obter suas ofertas.
  • offers:write: Criar, atualizar, publicar e excluir ofertas.
  • orders:read: Listar e obter pedidos de vendedores.
  • orders:write: Marcar pedidos como entregues.
  • webhooks:manage: Reservado para gerenciamento futuro de webhooks da API Aberta. Configure endpoints nas configurações de Desenvolvedor hoje.

Escopos padrão da chave

Novas chaves recebem offers:read, offers:write, orders:read e orders:write. CRUD de webhook de saída permanece na UI de Configurações (autenticação de sessão).

API de Ofertas

Identificadores de oferta aceitam o slug da URL pública ou id numérico. Respostas omitem id interno e sellerId.

O que o PATCH ainda não pode mudar

Linhas de estoque, preços de opções, mídia e atributos são gerenciados no editor de vendedores (ou futuros endpoints), não via PATCH hoje.

GET/api/v1/offers
offers:read

Liste suas ofertas

Filtre com archive=active (padrão), archived ou all.

Parâmetros

  • archive
    Em
    query
    Tipo
    string
    Descrição
    One of "active" (default), "archived", or "all".
  • Response: { offers: Offer[], total: number }. Numeric id and sellerId are omitted.

Exemplo de requisição

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

Exemplo de resposta

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

Criar uma oferta de rascunho

Cria um rascunho vazio pertencente ao vendedor autenticado. Nenhum corpo é necessário.

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

Exemplo de requisição

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

Exemplo de resposta

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

Obter uma oferta

Carrega pelo slug da URL pública ou id numérico. Relações (opções) podem ser incluídas; itens de estoque não são.

Parâmetros

  • urlOrIdobrigatório
    Em
    path
    Tipo
    string
    Descrição
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

Exemplo de requisição

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

Atualizar campos da oferta

Patch um subconjunto seguro de campos de listagem. Emite offer.updated quando webhooks de saída estão configurados.

Parâmetros

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

Exemplo de requisição

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

Corpo da requisição

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

Excluir ou arquivar

Mesmas regras de exclusão/arquivamento que a UI do vendedor.

Parâmetros

  • urlOrIdobrigatório
    Em
    path
    Tipo
    string
    Descrição
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

Exemplo de requisição

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

Exemplo de resposta

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

Publicar uma oferta

Publica um rascunho (ou altera a visibilidade). Falha com 400 se campos obrigatórios da listagem estiverem incompletos.

Parâmetros

  • urlOrIdobrigatório
    Em
    path
    Tipo
    string
    Descrição
    Offer.url slug or Offer.id.
  • visibility
    Em
    body
    Tipo
    string
    Descrição
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

Exemplo de requisição

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

Os pedidos estão vinculados à sua conta de vendedor. Os detalhes de cobrança do comprador podem ser ocultados sob as regras de privacidade do marketplace.

GET/api/v1/orders
orders:read

Liste pedidos de vendedores

Suporta limite, offset, status, q e sort (mais novo, mais antigo, total_alto, total_baixo).

Parâmetros

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

Exemplo de requisição

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

Obter um pedido

Retorna o pedido com itens de linha. Use o uid público do pedido.

Parâmetros

  • uidobrigatório
    Em
    path
    Tipo
    string
    Descrição
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

Exemplo de requisição

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 entregue

Cumprimento manual. Linhas COMPLEX devem estar totalmente anexadas quando necessário. Emite order.delivered.

Parâmetros

  • uidobrigatório
    Em
    path
    Tipo
    string
    Descrição
    Order.uid.
  • evidence
    Em
    body
    Tipo
    string[]
    Descrição
    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.

Exemplo de requisição

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

Corpo da requisição

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

Webhooks de saída

Configure endpoints HTTPS (ou webhooks do Discord) em Configurações → Desenvolvedor. O RMT POSTa quando eventos inscritos ocorrem.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • O formato JSON envia um envelope estruturado com id, tipo, criado e dados.
  • O formato Discord envia embeds ricos com links de pedidos ou ofertas.
  • A assinatura opcional usa X-RMT-Timestamp e X-RMT-Signature (mesmo esquema que reserva).
  • O histórico de entregas aparece sob cada endpoint para que você possa tentar novamente em caso de falhas. Os endpoints pausam automaticamente após falhas repetidas.

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

Cabeçalhos de entrega assinados

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

Verificar assinaturas de webhook

Quando uma chave secreta de assinatura está definida, calcule HMAC-SHA256 sobre timestamp + '.' + rawBody e compare com o hex após v1=.

Use os bytes do corpo da requisição bruta, não um objeto JSON re-serializado. Rejeite timestamps antigos (por exemplo, mais de cinco minutos).

Esboço 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 (reabastecimento de inventário)

Para listagens COMPLEX (unidade única), o RMT pode POSTar seu endpoint HTTPS após o pagamento para criar a próxima licença, conta ou chave quando o estoque local estiver baixo.

Falhas seguras de pagamento

Se seu endpoint expirar ou retornar dados inválidos, o pedido permanece PAGO. O comprador é cobrado; você verá um erro no pedido e poderá tentar reservar novamente ou anexar chaves manualmente.

  • O estoque local é sempre preferido; o webhook preenche apenas a falta.
  • Configure um padrão de oferta, ou substitua por opção de preço, na etapa Itens do editor de ofertas.
  • Apenas HTTPS. A assinatura HMAC opcional combina com webhooks de saída (X-RMT-Event: reserve.item).
  • Testar no editor envia dryRun: true. Na página do pedido, use Tentar reservar novamente após corrigir seu endpoint.

Corpo 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
}

Resposta de conveniência

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

Campos JSON mapeados (com caminhos responseMap como $.license)

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

Não chame reserva antes do pagamento

O RMT só chama seu endpoint após o pagamento ser bem-sucedido, então checkouts abandonados não consomem licenças.

Erros e limites de taxa

Erros retornam JSON { error, code? }. O tráfego da API Aberta é limitado a 300 requisições por minuto por chave de API.

  • API_KEY_REQUIRED
    401

    Cabeçalho Authorization ou X-Api-Key ausente.

  • API_KEY_INVALID
    401

    Chave desconhecida, revogada, expirada ou acesso de desenvolvedor desativado.

  • SCOPE_MISSING
    403

    A chave não possui o escopo exigido pelo endpoint.

  • RATE_LIMITED
    429

    Muitas requisições. Respeite Retry-After e X-RateLimit-Reset.

  • RESERVE_FAILED
    400

    Webhook de reserva expirou, retornou dados inválidos ou faltaram campos obrigatórios.

Lidar com 429

Aguarde usando Retry-After segundos. Não rotacione chaves para contornar limites; o limite é por chave e fixo para todos os vendedores.

Respostas bem-sucedidas incluem X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset.

Pronto para automatizar?

Ative o acesso de desenvolvedor, crie uma chave e conecte seu primeiro webhook em Configurações.