Versioning & changelog
Policy
Section titled “Policy”The API version is the /v1 in the path.
Additive, backward-compatible changes ship without a version bump. That includes:
- new endpoints,
- new optional request fields,
- new fields in a response object,
- new
errorcodes, - new
delivery_statusvalues and new webhook event types.
Write your integration to tolerate these — ignore response fields you do not
recognise, treat an unknown error code by its HTTP status, and treat an
unknown delivery_status or webhook event as “fetch the order and check”.
A breaking change means a new version, /v2. When that happens:
/v1keeps working for at least 6 months after/v2is generally available,/v1responses carry aSunsetheader with the retirement date,- this page gets a deprecation notice with the migration guide.
The version number on this documentation (shown in the API Reference) is the docs revision, not the API version.
Changelog
Section titled “Changelog”2026-10 — v1.5.0
Section titled “2026-10 — v1.5.0”- Rate limits are now per account, not per API key, in two buckets:
orders (
POST /v1/orders, 60 per minute) and reads (everyGET, 120 per minute). All your keys share them, and polling no longer uses up the capacity you need to place orders. See Rate limits. - The response shape and the
429 RATE_LIMITEDerror are unchanged.
2026-10 — v1.4.0
Section titled “2026-10 — v1.4.0”POST /v1/ordersaccepts an optionalmax_price_sen. If your current price is above it, the order is refused with the new422 PRICE_CHANGED(details.current_price_sen) and nothing is charged. Omitting it keeps the old behaviour. See Your first order.detailson an error is now documented as code-specific; see Errors.
2026-10 — v1.3.0
Section titled “2026-10 — v1.3.0”GET /v1/catalog:checkout_inputgainsplayer_id_format(numericortext).POST /v1/ordersnow checks each game’s full input contract (see Your first order). Input that used to be accepted can now be rejected with422 VALIDATION_FAILED: aserver_idon a game whosecheckout_input.fieldisnull, a non-digitplayer_idon anumericgame, a non-digit Server ID, a value with spaces, or one over 64 characters. Before, such an order was charged and then failed at the supplier. The response shape and error code are unchanged.
2026-10 — v1.2.0
Section titled “2026-10 — v1.2.0”- New final
delivery_status:partially_delivered— part of an order was delivered and the rest failed. The undelivered share is refunded to the Purchase Balance as a separate action;wallet_refund.amount_senshows how much. - New webhook event
order.partially_delivered.order.refundednow also covers a partially delivered order, for the undelivered share only. - The additive-change list above now names new status values and new webhook events.
2026-09 — v1.1.0
Section titled “2026-09 — v1.1.0”- Order responses (create/replay, get, and list) and delivery webhooks now
include
wallet_refundedandwallet_refund(amount in sen and refund time). These are additive fields; the API path remains/v1. - Clarified that
delivery_status: faileddoes not itself mean a Purchase Balance refund has occurred.order.refundedannounces the separate Purchase Balance credit.
2026-09 — v1.0.0
Section titled “2026-09 — v1.0.0”Initial public documentation of the /v1 API.
GET /v1/balance,GET /v1/catalog,POST /v1/orders,GET /v1/orders/{order_number}.GET /v1/orders— cursor-paginated order history with?status=and?created_after=filters.- Delivery webhook —
order.delivered/order.failed/order.refunded, signedX-Hub-Signature-256. - Stable
errorcodes on every 4xx;422carriesdetails. - Idempotency: a replay returns the original order with HTTP 200 and
Idempotent-Replayed: true; a key reused with a different payload is a409. price_senis an integer (sen) everywhere.- Optional per-key IP allowlist.