API Reference

eSIM

Mobile data eSIMs - plans, operators, QR/LPA delivery, activation tracking

The eSIM vertical lets clients purchase mobile data plans that activate on the customer's device via a QR code or LPA Activation Code. Plans are sourced from regional and global operators with country-specific coverage.

Unlike vouchers, eSIMs deliver an activation profile (ICCID + LPA string), not a redemption code. Unlike top-ups, there's no account or player identifier — the eSIM is bound to the customer's device after install.

For digital gift cards, see the Vouchers vertical. For gaming and mobile recharges, see the Topups vertical.

Endpoints

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

Lifecycle & Activation

Once delivered, an eSIM has its own post-purchase lifecycle: installation, activation, validity. See Lifecycle for the ICCID/activation-code model and the one-time install security policy.

Where to start

Eventual delivery

Octopus Cards commits to eventually delivering every accepted order. Transient fulfilment conditions don't surface as FAILED — they keep the order in PENDING and the retry pipeline keeps working. An order only terminates as FAILED when the customer's chosen plan or input was clearly invalid, or in the rare case where automatic recovery is fully exhausted.

Status tracking

Outbound client webhooks for eSIM are not yet wired — until they ship, surface terminal transitions and install events by polling GET /esim/orders/:id. The detail endpoint refreshes installation status on every call, so a single fetch returns the freshest state. See eSIM Webhooks for the planned event catalogue.

Key differences from Vouchers and Topups

ConceptVouchersTopupseSIM
Catalogue modelproduct + denominationsproduct + variantsproduct + variants (1 product = 1 country/region)
Customer identifierNoneplayer_id / phone_numberNone — device-bound after install
Delivery shapeCode + PIN or claim URLNone (top-up applies to player/MSISDN)LPA activation code + ICCID
Sync vs asyncSync ≤ 5 qty, async > 5Almost always asyncHybrid: 60s inline deadline. Response is always 200 OK; body status is DELIVERED (in time), PENDING (deadline elapsed), or FAILED.
Quantity per order1–5,0001+Always 1 (strictly enforced)
Post-delivery lifecycleNoneNoneNOT_INSTALLEDACTIVEEXPIRED
Credential maskingEncrypted at rest, returned in responsesn/aActivation code masked once is_installed: true
RefundsWallet refunded on FAILED / CANCELLEDWallet refunded on FAILED / CANCELLEDWallet refunded only if is_installed: false
Outbound webhooksorder.delivered, order.partially_delivered, order.failed, order.cancelled (plus wallet.credited / wallet.debited)Not yet wiredNot yet wired

On this page