API Reference

Topups

Gaming top-ups and mobile recharges - players, operators, variants, async fulfillment

The topups vertical covers two product families that share an API surface:

  1. Gaming top-ups - in-game currency, item bundles, season passes. Identified by a player/account ID (sometimes plus a server/region).
  2. Mobile recharges - prepaid airtime and data plans. Identified by an MSISDN (mobile number). Many countries require operator detection before pricing.

Unlike vouchers, top-ups have variants (SKU-level pricing within a product) and are mostly fulfilled asynchronously - fulfilment is confirmed via callback or status polling, not in the original request.

For digital gift cards (codes/PINs/URLs delivered immediately), see the Vouchers vertical. For eSIMs, see the eSIM vertical.

Endpoints

MethodPathPage
GET/api/v1/topups/productsProducts
GET/api/v1/topups/products/:idProducts
GET/api/v1/topups/products/:id/variantsVariants
GET/api/v1/topups/variants/:idVariants
POST/api/v1/topups/lookupMobile Lookup
POST/api/v1/topups/chargesCharges
POST/api/v1/topups/ordersCreate order
GET/api/v1/topups/ordersOrders
GET/api/v1/topups/orders/:idOrders
PATCH/api/v1/topups/orders/:id/notification-emailOrders

Where to start

Eventual delivery

Octopus Cards commits to eventually delivering every accepted order. Transient fulfilment conditions — timeouts, rate limits, intermittent declines — keep the order in PENDING and the retry pipeline keeps working. An order only terminates as FAILED when the input was clearly customer-actionable (wrong recipient, plan unavailable, amount out of range). See Create Order for the full failure-code enum.

Status tracking

Outbound client webhooks for top-ups are not yet wired — until they ship, surface terminal transitions by polling GET /topups/orders/:id or by registering a notification email with PATCH /topups/orders/:id/notification-email. See Topup Webhooks for the planned event catalogue.

Key differences from Vouchers

ConceptVouchersTopups
Catalogue modelproduct + denomination rangesproduct + variant (SKU-level)
Customer identifierNone — pure gift cardplayer_id / phone_number / account_id via input_data
Pre-order discoveryNonePOST /topups/lookup for mobile operator detection
FulfilmentSync for qty ≤ 5, async for largerAlmost always async
Cross-currency FXSupported on POST /api/v1/ordersNot supported — use a matching-currency wallet
Outbound webhooksorder.delivered, order.partially_delivered, order.failed, order.cancelled (plus wallet.credited / wallet.debited)Not yet wired (planned: topup.delivered, topup.failed, topup.cancelled)
CancellationWallet refunded on CANCELLED / FAILEDWallet refunded on FAILED / CANCELLED

On this page