Skip to content
Ask the docs

Find answers across the QairoPay docs.

Type a question and we'll synthesize an answer from the docs with citations back to the source pages.

Event catalog

This is the canonical event list. The shape of data for each event matches the same resource shape returned by the corresponding GET endpoint in the API reference.

Pass events

EventWhen it firesNotable fields
pass.createdA pass is issued.data.pass
pass.installedThe holder adds the pass to a wallet for the first time.data.pass, data.pass.platform (apple/google)
pass.updatedAny field on the pass changes.data.pass, previous_attributes
pass.scannedA scanner reads the pass barcode or NFC payload.data.scan (scanner id, lat/long, verification result)
pass.revokedThe pass is revoked.data.pass.revoke_reason
pass.removedThe holder removes the pass from the wallet.data.pass

Pass template events

EventWhen it fires
pass_template.createdA template is created.
pass_template.updatedA template is edited; updates fan out to all issued passes.
pass_template.archivedA template is archived. No new issuance allowed.

Payment events

EventWhen it fires
payment.authorizedRisk checks passed; payment is authorized.
payment.needs_confirmationHolder approval required before capture.
payment.confirmedBiometric verification completed.
payment.capturedOn-chain transaction finalised.
payment.refundedRefund processed on the payment.
payment.voidedAuthorization cancelled before capture.
payment.failedSponsor transaction failed on-chain.
payment.risk_declinedSpending rule blocked authorization.

Card events

EventWhen it firesNotable fields
card.createdA virtual or physical card is issued.data.card
card.shippedA physical card has been printed and handed off to the carrier.data.card.shipping.tracking_number
card.activatedThe cardholder activates the card.data.card
card.suspendedThe card is suspended (by you, the cardholder, or fraud rules).data.card.suspend_reason
card.resumedA suspended card is resumed.data.card
card.terminatedThe card is permanently terminated.data.card.terminate_reason

Transaction events

EventWhen it firesNotable fields
card.transaction.authorizedThe network requests an authorization. Fires before approval.data.transaction.merchant, data.transaction.amount_cents
card.transaction.declinedThe network or sponsor bank declined.data.transaction.decline_reason
card.transaction.capturedThe merchant has captured a previously authorized transaction.data.transaction
card.transaction.refundedA refund posted.data.transaction.refunds
card.transaction.reversedA previously captured transaction was reversed.data.transaction

Real-time authorization (opt-in)

If you opt into real-time authorization decisioning (Enterprise feature):

EventWhen it firesResponse budget
card.transaction.authorization_requestSynchronous webhook before the network response. Reply with { approve: true } or { approve: false, decline_reason: "..." }.1.5 seconds

If you don’t respond in time we fall back to the static spending controls.

Cardholder / KYC events

EventWhen it fires
cardholder.createdA cardholder record is created.
cardholder.kyc.completedPersona has returned a verification result.
cardholder.kyc.requires_actionPersona has flagged the verification for manual review.
cardholder.sanctions.alertAn ongoing-monitoring sanctions or PEP hit fired. The cardholder is automatically frozen pending review.

Dispute events

EventWhen it fires
dispute.createdA dispute is filed.
dispute.updatedThe dispute moves between stages (needs_responsesubmittedwon / lost).
dispute.evidence_requiredThe sponsor bank needs more evidence by a deadline.
dispute.expiredThe dispute window closed without a response; outcome recorded.

Settlement events

EventWhen it fires
payment.settlement_batch_completedA USDC settlement batch was confirmed on-chain. Payload includes the Aptos transaction hash.
payment.settlement_batch_failedA settlement batch failed on-chain; manual review opened.
payment.settlement_retry_requestedA super-admin queued a failed payment for retry.
payment.settlement_manually_triggeredA super-admin manually triggered the settlement cycle.

Billing events

EventWhen it fires
billing.trial_startedTenant started a 30-day trial.
billing.plan_changedPlan tier changed via self-serve or admin action.
billing.subscription_canceledSubscription set to cancel at period end.
billing.payment_method_updatedA new payment method was attached to the tenant.
billing.addon_toggledA metered add-on was enabled or disabled.
billing.portal_accessedA Stripe Customer Portal session was created.
billing.enterprise_quote_requestedA sales-assisted quote was requested.
billing.dunning_state_overriddenSuper-admin overrode the tenant’s dunning state.
billing.enterprise_quote_provisionedSuper-admin provisioned an enterprise plan for the tenant.

Webhook delivery events

When an endpoint is automatically disabled after exhausting its retry budget, a webhook_endpoint.disabled event is emitted to all other active endpoints on your account.

EventWhen it fires
webhook_endpoint.disabledAn endpoint hit the 5-attempt retry-exhaustion threshold and was auto-disabled.

Sample payload:

{
"id": "wevt_01HXYZ",
"type": "webhook_endpoint.disabled",
"created": 1716144300,
"api_version": "2026-04-01",
"data": {
"endpoint_id": "whe_01HABC",
"disabled_reason": "retry_exhausted",
"attempt_count": 5
}
}

To re-enable the endpoint after fixing the underlying connectivity issue:

Terminal window
curl -X PATCH https://api.qairopay.com/v1/webhook-endpoints/whe_01HABC \
-H "Authorization: Bearer $QAIROPAY_API_KEY" \
-d '{"status": "enabled"}'

See Retries and delivery for the full auto-disable flow.

Other events

EventWhen it fires
program.activatedYour KYB and program setup completed; live issuance is now allowed.
program.suspendedA regulator, sponsor bank, or QairoPay risk action suspended issuance.
program.resumedSuspension lifted.
api_key.createdAn API key was created in the dashboard.
api_key.revokedAn API key was revoked.

A note on payload stability

Within a given api_version, the shape of data for each event is stable. New optional fields may appear; required fields cannot disappear. When QairoPay ships a new API version, the version is pinned per-tenant — events keep arriving in the version you have pinned. See Versioning for how to bump safely.