Helium MVNEdocs

Event catalog

Every async state change in Helium MVNE emits a webhook event. This catalog enumerates the event types you can subscribe to; payload shapes are documented in the API reference under the Events tag.

Shape

Every event carries:

{
  "id": "evt_...",
  "type": "sim.activated",
  "created_at": "2026-04-24T15:00:00Z",
  "livemode": false,
  "data": { "object": { ... } },
  "idempotency_key": "..."
}

Subscription events

TypeFires when
subscription.createdA subscription is created (reserved, not emitted in v0)
subscription.updatedA status or pending-plan-change reconciliation with no dedicated event below, such as a scheduled downgrade being set or cleared
subscription.plan_switchedA plan change applies (an upgrade immediately, a scheduled downgrade at renewal)
subscription.pausedMoves to paused
subscription.resumedMoves from paused back to active
subscription.cancelledMoves to cancelled
subscription.terminatedMoves to terminated (reserved, no trigger in v0)
subscription.past_duePayment is overdue and the subscription moves to past_due
subscription.unpaidPayment retries are exhausted and collection has stopped
subscription.recoveredA past_due subscription recovers to active after a successful payment

SIM events

TypeFires when
sim.orderedSIM record created
sim.activatedCarrier confirms activation
sim.activation_failedCarrier rejects activation
sim.suspendedMoves to suspended
sim.reinstatedMoves back to active
sim.swap_completedNew SIM takes over the MSISDN
sim.deactivatedTerminal deactivation

Port events

TypeFires when
port.submittedPort-in request accepted by Helium MVNE
port.validation_successLosing carrier validated
port.validation_failedLosing carrier rejected
port.scheduledCarrier scheduled the cut-over
port.completedNumber transfer complete
port_out.requestedGaining carrier requested port-out
port_out.completedPort-out finalized

CPNI step-up events

When a support agent needs to view a subscriber's PII or change their account, Helium MVNE issues a one-time verification code and asks you to deliver it to the subscriber over your own channel (SMS, app push, email). The subscriber reads it back to the agent, who enters it to unlock access for a window.

TypeFires when
cpni.verification.requestedAn agent started a step-up challenge — carries the one-time code
cpni.verification.succeededThe agent entered the correct code
cpni.verification.failedThe challenge locked out after too many attempts

cpni.verification.requested is the only event whose payload contains a secret: data.object.code. Deliver it to the subscriber and treat it like a password — don't log it, and don't store it. The code is short-lived (operator-configured, default 10 minutes) and is never returned by the GET /events API; it rides the signed webhook only.

{
  "type": "cpni.verification.requested",
  "data": {
    "object": {
      "object": "cpni_verification",
      "id": "cpniv_01HGZX...",
      "subscriber_id": "sbr_01HGZX...",
      "agent": { "user_id": "...", "email": "agent@operator.example" },
      "code": "482913",
      "expires_at": "2026-06-08T17:10:00Z",
      "grant_duration_seconds": 1800
    }
  }
}

Carrier + operational events

TypeFires when
carrier_connection.verify_failedA scheduled verify call failed
usage.threshold_crossedConfigured data/voice/SMS threshold hit
event.delivery_failedA webhook endpoint landed in dead-letter

Event types are additive — new types may appear without a major version bump. Handlers should ignore unknown type values.