Skip to content

Webhooks

When an order is paid, delivered, updated, or refunded, we send a POST to your configured callback URL. Signing rules are identical to inbound Open API calls.

Three things to remember:

  1. Only 3 eventType values are exposed (see table below).
  2. Each delivery is a full order snapshot (same shape as Query Order), not a delta patch.
  3. To see what changed, read changeHints first, then orderStatus, deliveryStatus, and items[].profiles[].

Configure callback URL

Option A: Admin console → API credentials → callback URL

Option B: POST /open-api/v1/webhook/set

json
{ "callbackUrl": "https://your-server.com/openapi/callback" }

Event types

eventTypeWhen sent
ORDER_PAIDBalance payment succeeded; fulfillment started
DELIVERY_UPDATEDDelivery or profile state changed (see common scenarios). Sent only when that order actually changed
REFUND_COMPLETEDRefund credited (sync or async completion)

Delivery, install, activation, and usage updates all use DELIVERY_UPDATED. There is no separate ESIM_STATUS or DATA_USAGE event type—use payload fields and changeHints.


text
Receive POST → verify signature → return HTTP 200 quickly → process async

If eventType == DELIVERY_UPDATED:
  1. Read changeHints and update UI / local state
  2. Replace local order snapshot with full payload

If eventType == ORDER_PAID:
  Mark paid; wait for DELIVERY_UPDATED

If eventType == REFUND_COMPLETED:
  Mark refund complete; update refund amount

Idempotency: the same orderNo + eventType may arrive more than once on retry—dedupe on that pair.


Understanding changeHints

The body is a full order snapshot. changeHints summarizes changes since the last successful delivery for the same orderNo and eventType:

  • On the first DELIVERY_UPDATED (or no prior snapshot), hints are inferred vs an empty baseline (e.g. new iccidICCID_READY).
  • One delivery may include multiple hints.
  • Retries reuse the same hints.

Delivery & install

changeHintsMeaningSuggested action
ICCID_READYICCID appeared for the first timeShow ICCID; guide install
QR_CODE_READYQR install URL appearedShow QR
ACTIVATION_CODE_READYSM-DP+ activation code appearedShow LPA string

Order & item status

changeHintsMeaningSuggested action
DELIVERY_STATUS_CHANGEDdeliveryStatus changedUpdate delivery progress
ORDER_STATUS_CHANGEDorderStatus changedUpdate order state
ITEM_STATUS_CHANGEDitemStatus changedUpdate line item state
PROFILE_LIFECYCLE_CHANGEDProfile lifecycleStatus changedUpdate card lifecycle
ESIM_STATUS_CHANGEDProfile esimStatus changedOptional raw eSIM state
SMDP_STATUS_CHANGEDProfile smdpStatus changedOptional install state

Plan & usage

changeHintsMeaningSuggested action
PLAN_USE_STARTEDplanUseStatusSTARTEDMark plan in use
PLAN_USE_ENDEDplanUseStatusENDEDMark plan ended
USAGE_UPDATEDUsage bytes changedRefresh usage UI; live usage via profile/usage API

Refund & other

changeHintsMeaningSuggested action
PROFILE_CANCELLEDProfile cancelled → trueMark card cancelled
REFUND_AMOUNT_UPDATEDCumulative refund increasedUpdate refund amount
ORDER_PAIDWith ORDER_PAID eventMark paid
REFUND_COMPLETEDWith REFUND_COMPLETED eventMark refund complete
ORDER_SNAPSHOT_SYNCPush with no finer ruleReplace local snapshot from payload

Status field values

Prefer lifecycleStatus and changeHints for business logic. esimStatus / smdpStatus are channel-specific raw values—use as supplementary only.

deliveryStatus

ValueMeaning
PENDINGNot delivered
PARTIALSome profiles ready
DELIVEREDAll profiles ready
FAILEDDelivery failed

orderStatus (common)

ValueMeaning
PAIDPaid; awaiting fulfillment
FULFILLINGFulfilling
COMPLETEDCompleted
REFUNDINGRefund in progress (usually no separate webhook—poll query)
REFUNDEDRefunded

itemStatus

ValueMeaning
PENDINGAwaiting codes
DELIVEREDCodes issued
ACTIVATINGActivating
ACTIVATEDActivated
FAILEDFailed
REFUNDEDRefunded
ValueMeaning
PENDINGAwaiting codes
DELIVEREDCodes ready (iccid / qr)
ACTIVATINGInstall or activation in progress
ACTIVATEDActivated
CANCELLEDCancelled

DELIVERY_UPDATED common scenarios

ScenarioTypical payload changes
ICCID / QR / activation code readyitems[].iccid, qrCodeUrl, activationCode; deliveryStatusPARTIAL / DELIVERED
Profile install or eSIM stateitems[].profiles[].esimStatus, smdpStatus
Plan usage start / enditems[].profiles[].planUseStatus, planUseStartTime, planUseEndTime
Usage or validity updateitems[].profiles[].dataUsageBytes, remainDataBytes, usagePercent, etc.
Activation / lifecycleitems[].profiles[].activated, lifecycleStatus
Profile update on refund rejectionitems[].profiles[].cancelled; credit via REFUND_COMPLETED

Events not sent separately

ScenarioNotes
Refund in progress (REFUNDING)Refund API may return REFUNDING; no webhook until credited—poll query or wait for REFUND_COMPLETED
Account top-up approvedAccount flow; not order webhooks
Payment failed at order timeNo order row; no webhook

Delivery policy

  • Webhooks are order-scoped; sent only when that order actually changed.
  • Supported profile fields may vary by package—use items[].profiles[] in the payload.

Request format

Headers match inbound Open API (signed with your AppSecret).

ORDER_PAID example

json
{
  "eventType": "ORDER_PAID",
  "transactionId": "your-transaction-id",
  "orderNo": "ORD20260101001",
  "orderId": 123456,
  "payStatus": "PAID",
  "deliveryStatus": "PENDING",
  "orderStatus": "PAID",
  "currency": "USD",
  "items": [
    {
      "itemNo": "2075463266738958341",
      "packageCode": "PKG001",
      "quantity": 1,
      "itemStatus": "PAID"
    }
  ]
}

DELIVERY_UPDATED example

json
{
  "eventType": "DELIVERY_UPDATED",
  "transactionId": "your-transaction-id",
  "orderNo": "ORD20260101001",
  "orderId": 123456,
  "payStatus": "PAID",
  "deliveryStatus": "DELIVERED",
  "orderStatus": "COMPLETED",
  "currency": "USD",
  "changeHints": ["ICCID_READY", "DELIVERY_STATUS_CHANGED"],
  "items": [
    {
      "itemNo": "2075463266738958341",
      "packageCode": "PKG001",
      "quantity": 1,
      "itemStatus": "DELIVERED",
      "profiles": [
        {
          "profileId": "2075464693179805698",
          "iccid": "8901234567890123456",
          "lifecycleStatus": "ACTIVATED",
          "planUseStatus": "STARTED"
        }
      ]
    }
  ]
}

REFUND_COMPLETED example

json
{
  "eventType": "REFUND_COMPLETED",
  "transactionId": "your-transaction-id",
  "orderNo": "ORD20260101001",
  "orderId": 123456,
  "payStatus": "REFUNDED",
  "orderStatus": "REFUNDED",
  "refundAmount": 3.50,
  "currency": "USD",
  "items": []
}

See WebhookCallbackPayload in OpenAPI Spec.


Retries & integration tips

Failed deliveries retry with backoff (default up to 8 attempts).

  1. Verify signature before business logic
  2. Return HTTP 200 quickly; queue heavy work
  3. Dedupe on orderNo + eventType; keep full snapshots for reconciliation

eSIM Dealer Open API v1