Delivery semantics
- At-least-once delivery
- Idempotency key:
event_id(UUID). Duplicate delivery → return200without applying twice - Signature header:
X-IMBA-Signature - Content-Type:
application/json
Signature
: and ,, and key order is IMBA’s, not alphabetical. Re-serializing the parsed JSON produces a different signature — sign the bytes exactly as received.
Envelope
event (not event_type).
Event types (v1)
Not in v1: chargebacks, separate reconciliation settled events, unfreeze events.
data fields
Minimum: ext_id, status, document_status. Often also ref_id / order_id, card_id, http_status, error / message, and when present amount / currency / network / to_address / offer_id.
card.otp is not a status change and has no status / document_status — see below.
card.otp — 3-D Secure code
Sent when an acquirer asks for a confirmation code on a card issued to you. The same code goes to the cardholder e-mail you supplied at issue — the webhook does not replace that mail. It exists so your own support can read the code out to the buyer.
No cardholder contacts (e-mail, phone, name) and no card secrets are in the event:
card_id + otp already identify the code, and you supplied the holder data yourself at issue.
The code lives about 2 minutes. Handle the event immediately; do not queue it behind slow work.
Idempotency. A provider retry of the same code on the same card does not create a second event. A new code on the same card is always a new event. Stay idempotent by event_id, and optionally by delivery_id.
Only cards issued to a partner tenant produce this event; retail IMBA Wallet cards do not. If your webhook endpoint is missing or disabled there is no event and the cardholder mail goes out as usual.
Secrets — never trust webhooks for these
Webhook payloads must not be treated as a source of card numbers, CVV, JWE, epin, or LPA. The single exception is the 3-D Secure code in
card.otp (field otp), where the code is the event; there is no pull endpoint for it.
Automated delivery of voucher / card credentials after purchase is the product GET, not the webhook. See FAQ.
Smoke test
IMBA can sendtest.ping from the admin console. Expect HTTP 2xx. Respond 200 for duplicate event_id.