RMT.GG/판매자 개발자 문서
v1

판매자 API

리스트 자동화, 판매 이행 및 주문 이벤트 스트리밍. 결제 후 온디맨드 재고 보충을 위한 아웃바운드 웹훅 및 예약 엔드포인트 포함.

REST 오픈 API

제안 및 주문을 위한 Bearer 인증 /api/v1, 발견 및 속도 제한 헤더 포함.

아웃바운드 웹훅

주문 및 제안 생애 주기 이벤트를 위한 서명된 HTTPS(또는 Discord) 전송.

예약 / 보충

로컬 재고가 부족할 때 결제 후 서버에서 COMPLEX 재고를 발행.

당신이 만들 수 있는 것

판매자 오픈 API는 Discord 알림, 재고 동기화, Zapier 스타일 자동화 또는 RMT.GG 위에 맞춤형 백오피스를 원하는 판매자를 위한 것입니다.

  • 제안 관리
    초안 생성, 안전한 필드 업데이트, 게시 및 /api/v1/offers를 통해 보관.
  • 판매 이행
    판매자 주문 목록 및 검사 후 선택적 증거 URL로 배송 완료로 표시.
  • 제한 내에서 유지
    모든 키는 분당 300 요청으로 제한됩니다. 응답에는 X-RateLimit-* 헤더가 포함됩니다.
  • 실시간으로 반응
    주문 및 제안 이벤트를 구독하거나 예약 웹훅으로 COMPLEX 재고를 보충.

빠른 시작

개발자 액세스를 활성화하고 키를 발행한 후, 발견을 호출하여 실시간 카탈로그를 인쇄합니다.

  1. 1설정 → 개발자 열고 액세스를 활성화합니다(셀프 서비스, 승인 대기 없음).
  2. 2API 키를 생성하고 비밀을 한 번 복사합니다(rmt_sk_live_…). 비밀 관리자에 저장합니다.
  3. 3GET /api/v1을 호출하여 Authorization: Bearer로 범위, 할당량 및 작업을 확인합니다.
GET/api/v1

발견 문서

범위, 할당량, 웹훅 이벤트 및 전체 작업 카탈로그를 반환합니다. 유효한 API 키는 모두 작동합니다.

예제 요청

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

예제 응답

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

인증

모든 /api/v1 요청에 대해 라이브 비밀 키를 전송합니다. HTTPS만 선호합니다. 공개 클라이언트나 브라우저 번들에 키를 포함하지 마십시오.

선호하는 헤더

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

대체 헤더

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

유출 시 회전

키가 유출되면 개발자 설정에서 이를 취소하고 새 키를 생성합니다. 라이브 중이라면 취소하기 전에 자동화를 업데이트하십시오.

범위

각 API 키는 엔드포인트를 제한하는 범위를 가집니다. 범위가 누락되면 403 SCOPE_MISSING이 반환됩니다.

offers:read
offers:write
orders:read
orders:write
webhooks:manage
  • offers:read: 당신의 제안을 나열하고 가져옵니다.
  • offers:write: 제안을 생성, 업데이트, 게시 및 삭제합니다.
  • orders:read: 판매자 주문을 나열하고 가져옵니다.
  • orders:write: 주문을 배송 완료로 표시합니다.
  • webhooks:manage: 미래의 오픈 API 웹훅 관리를 위해 예약됨. 오늘 개발자 설정에서 엔드포인트를 구성하십시오.

기본 키 범위

새 키는 offers:read, offers:write, orders:read 및 orders:write를 받습니다. 아웃바운드 웹훅 CRUD는 설정 UI(세션 인증)에 남아 있습니다.

제안 API

제안 식별자는 공개 URL 슬러그 또는 숫자 ID를 수용합니다. 응답에는 내부 ID 및 sellerId가 생략됩니다.

PATCH로 변경할 수 없는 것

재고 행, 옵션 가격, 미디어 및 속성은 판매자 편집기(또는 미래의 엔드포인트)에서 관리되며, 오늘은 PATCH를 통해 변경할 수 없습니다.

GET/api/v1/offers
offers:read

당신의 제안 목록

archive=active(기본값), archived 또는 all로 필터링합니다.

매개변수

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

예제 요청

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

예제 응답

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

초안 제안 생성

인증된 판매자가 소유한 빈 초안을 생성합니다. 본문은 필요하지 않습니다.

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

예제 요청

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

예제 응답

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

하나의 제안 가져오기

공식 URL 슬러그 또는 숫자 ID로 로드합니다. 관계(옵션)가 포함될 수 있으며, 재고 항목은 포함되지 않습니다.

매개변수

  • urlOrId필수
    path
    유형
    string
    설명
    Offer.url slug or Offer.id.
  • Returns relations (options, etc.) when available; items are not included.

예제 요청

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

제안 필드 업데이트

안전한 하위 집합의 목록 필드를 패치합니다. 아웃바운드 웹훅이 구성되면 offer.updated를 방출합니다.

매개변수

  • urlOrId필수
    path
    유형
    string
    설명
    Offer.url slug or Offer.id.
  • title
    body
    유형
    string
    설명
    Listing title.
  • description
    body
    유형
    string
    설명
    Listing description.
  • visibility
    body
    유형
    string
    설명
    PUBLIC | PRIVATE | UNPUBLISHED.
  • categoryId
    body
    유형
    number
    설명
    Catalog category id.
  • offeringId
    body
    유형
    number
    설명
    Catalog offering id.
  • thumbnail
    body
    유형
    string
    설명
    Thumbnail URL or asset reference.
  • offerType
    body
    유형
    string
    설명
    Offer type string used by the listing.
  • listingMode
    body
    유형
    string
    설명
    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.

예제 요청

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

요청 본문

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

삭제 또는 보관

판매자 UI와 동일한 삭제/보관 규칙입니다.

매개변수

  • urlOrId필수
    path
    유형
    string
    설명
    Offer.url slug or Offer.id.
  • Response: { ok: true }.

예제 요청

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

예제 응답

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

제안 게시

초안을 게시(또는 가시성을 변경)합니다. 필수 목록 필드가 불완전하면 400 오류가 발생합니다.

매개변수

  • urlOrId필수
    path
    유형
    string
    설명
    Offer.url slug or Offer.id.
  • visibility
    body
    유형
    string
    설명
    Optional. PUBLIC (default), PRIVATE, or UNPUBLISHED.
  • Response: { offer: Offer }.
  • Fails if the listing is incomplete for publish.

예제 요청

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

주문은 판매자 계정에 한정됩니다. 구매자 청구 세부정보는 기록된 마켓플레이스 개인 정보 보호 규칙에 따라 수정될 수 있습니다.

GET/api/v1/orders
orders:read

판매자 주문 목록

limit, offset, status, q 및 sort(최신, 오래된, total_high, total_low)를 지원합니다.

매개변수

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

예제 요청

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

하나의 주문 가져오기

라인 항목이 포함된 주문을 반환합니다. 공개 주문 uid를 사용하십시오.

매개변수

  • uid필수
    path
    유형
    string
    설명
    Order.uid.
  • Response: { order } with line items.
  • Buyer billing fields may be redacted under marketplace-of-record privacy rules.

예제 요청

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

배송 완료로 표시

수동 이행. COMPLEX 라인은 필수일 때 완전히 첨부되어야 합니다. order.delivered를 방출합니다.

매개변수

  • uid필수
    path
    유형
    string
    설명
    Order.uid.
  • evidence
    body
    유형
    string[]
    설명
    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.

예제 요청

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

요청 본문

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

아웃바운드 웹훅

설정 → 개발자에서 HTTPS 엔드포인트(또는 Discord 웹훅)를 구성합니다. 구독된 이벤트가 발생하면 RMT가 POST합니다.

order.paid
order.delivered
order.completed
order.refunded
order.disputed
offer.published
offer.updated
  • JSON 형식은 id, type, created 및 data가 포함된 구조화된 봉투를 게시합니다.
  • Discord 형식은 주문 또는 제안 링크가 포함된 풍부한 임베드를 게시합니다.
  • 선택적 서명은 X-RMT-Timestamp 및 X-RMT-Signature를 사용합니다(예약과 동일한 방식).
  • 배송 기록은 각 엔드포인트 아래에 나타나므로 실패를 재시도할 수 있습니다. 엔드포인트는 반복적인 실패 후 자동으로 일시 중지됩니다.

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

서명된 배송 헤더

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

웹훅 서명 확인

서명 비밀이 설정되면 timestamp + '.' + rawBody에 대해 HMAC-SHA256을 계산하고 v1= 이후의 16진수와 비교합니다.

재직 요청 본문 바이트를 사용하고 재직 직렬화된 JSON 객체는 사용하지 마십시오. 오래된 타임스탬프(예: 5분 이상)를 거부합니다.

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

웹훅 예약(재고 보충)

COMPLEX(고유 단위) 목록의 경우, RMT는 결제 후 로컬 재고가 부족할 때 다음 라이센스, 계정 또는 키를 발행하기 위해 HTTPS 엔드포인트에 POST할 수 있습니다.

결제 안전 실패

엔드포인트가 시간 초과되거나 잘못된 데이터를 반환하면 주문은 PAID 상태로 유지됩니다. 구매자는 요금이 청구되며, 주문에서 오류를 보고 수동으로 예약하거나 키를 첨부할 수 있습니다.

  • 로컬 재고가 항상 우선시되며, 웹훅은 부족한 부분만 채웁니다.
  • 제안 편집기의 항목 단계에서 기본값을 제안 수준으로 구성하거나 가격 옵션별로 재정의합니다.
  • HTTPS만 사용합니다. 선택적 HMAC 서명은 아웃바운드 웹훅과 일치합니다(X-RMT-Event: reserve.item).
  • 편집기에서 테스트 시 dryRun: true를 전송합니다. 주문 페이지에서 엔드포인트를 수정한 후 '예약 재시도'를 사용합니다.

정규 POST 본문(잘림)

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
}

편의 응답

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

매핑된 JSON 필드(응답 맵 경로는 $.license와 같은 형식)

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

결제 전에 예약 호출 금지

RMT는 결제가 성공한 후에만 엔드포인트를 호출하므로, 포기된 체크아웃이 라이센스를 소모하지 않습니다.

오류 및 속도 제한

오류는 JSON { error, code? }를 반환합니다. 오픈 API 트래픽은 API 키당 분당 300 요청으로 제한됩니다.

  • API_KEY_REQUIRED
    401

    Authorization 또는 X-Api-Key 헤더가 누락되었습니다.

  • API_KEY_INVALID
    401

    키가 알려지지 않거나, 취소되었거나, 만료되었거나, 개발자 액세스가 비활성화되었습니다.

  • SCOPE_MISSING
    403

    키에 엔드포인트에서 요구하는 범위가 없습니다.

  • RATE_LIMITED
    429

    요청이 너무 많습니다. Retry-After 및 X-RateLimit-Reset을 준수하십시오.

  • RESERVE_FAILED
    400

    예약 웹훅이 시간 초과되었거나 잘못된 데이터를 반환했거나 필수 필드를 놓쳤습니다.

429 처리

Retry-After 초를 사용하여 대기하십시오. 제한을 우회하기 위해 키를 회전하지 마십시오; 제한은 키당 적용되며 모든 판매자에게 동일합니다.

성공적인 응답에는 X-RateLimit-Limit, X-RateLimit-Remaining 및 X-RateLimit-Reset이 포함됩니다.

자동화할 준비가 되셨나요?

개발자 액세스를 활성화하고 키를 생성한 후 설정에서 첫 번째 웹훅을 연결합니다.