Unlike every other webhook in this section, this one asks you a question and waits for the answer. We run our own checks first — balance, spending limits, merchant category, country. If we would approve, we call you. Your answer can turn that approval into a decline.
This is a blocking call on the card network’s clock. Your endpoint must answer within the configured timeout — 2.5 seconds maximum, floored at 50 ms, and 800 ms if the configured value cannot be read. A response that arrives late is a response that did not arrive.

Two events

Subscribing to CARD_AUTHORIZATION_REQUESTED subscribes you to both. You cannot be consulted on the first authorisation and silently skipped on the increase; that would mean approving an exposure and never seeing it raised. The two share a transaction.transaction_link_id, so you can tie an increase back to the authorisation you already approved.

What you receive

Fields worth reading twice

transaction.retrieval_reference_number and transaction.transaction_link_id were called transaction.reference and transaction.group_id when this page first went up. They were renamed within a day of publication, before any programme was enabled, so no integration should be affected — but if you built against that first version, they are the same values under the provider’s own names.merchant.mcc was called merchant.category_code. Same rename, same window, same reason — and mcc_category and mcc_description are new alongside it.
Optional fields are omitted when unknown rather than sent as null.

Refunds are included

A refund (Returns/Refunds) is an authorisation too, and you are asked about it on the same events. The payload tells them apart without a separate event name: amount is positive on a credit and negative on a debit, and type carries the acquirer’s label.
This means that under failureMode: "closed", an endpoint that is down declines a refund — the cardholder’s own money coming back — as well as a purchase. If you do not want to screen credits, approve anything with a positive amount.

What you must respond

200 with exactly this shape:
reason is optional, free text, and kept for support and investigation. It is never shown to the cardholder, trimmed, and truncated at 200 characters.
Anything else is treated as “no answer.” A 3xx, a 4xx, a 5xx, a body we cannot parse, a decision value we do not recognise, an empty body, or a timeout. There is exactly one way to get an approval: a 200 whose body says "approve".In particular a 200 {"ok": true} — the natural response for a notification receiver — is not an approval.

What happens when you do not answer

Configured per programme as failureMode:

Rolling out safely

Subscribing to the event does not immediately let it decline anything. Enforcement is a separate opt-in (enforceDecision). Until you enable it, your endpoint runs in shadow mode: we call it, record what you said and what we would have answered, and approve on our own verdict. Nothing you return can decline a card. Use that period to confirm your receiver answers the right shape inside the timeout, then turn enforcement on. Going straight to enforcement with a receiver that answers 200 {"ok": true} would decline every card in your programme.
enforceDecision and failureMode have no self-service control yet — ask us and we will set them on your programme’s card policy. Same for the callback URL and timeout.

Verifying the signature

The signing base differs from the other webhooks on this page. Notification webhooks sign the body alone. This one signs <timestamp>.<body>, so a verifier written for the others will reject every one of these.
A delivery can arrive unsigned. If we cannot read your programme’s signing secret we send the request anyway, without Orenda-Payload-Signature or Orenda-Signature-Timestamp — deliberately, because a credential problem on our side must not stop your cards working.Decide which you want and tell us: reject unsigned deliveries (safer, but a credential problem then declines your cards under failureMode: "closed"), or accept them until the secret is in place. Orenda-Event-Id and Orenda-Delivery-Id are always sent, signed or not.
Orenda-Payload-Signature is the same header name the notification webhooks use, with a different signing base. If you serve both families on one URL, tell them apart by the presence of Orenda-Signature-Timestamp — only these decisional deliveries carry it.

Redeliveries

The card network retries authorisations it does not hear about in time, and we re-run the decision from scratch on each. You will see the same authorisation more than once. event_id is stable across those retries; Orenda-Delivery-Id is not. Dedupe your exposure on event_id, or you will count one purchase twice and decline a customer who is comfortably within their limit.

Other requirements

  • HTTPS only. Plain HTTP is rejected before the call is made.
  • Redirects are not followed. A 3xx is treated as no answer — publish the final URL.
  • Keep the response small. A response over 64 KiB is no answer — we stop reading and, under failureMode: "closed", decline. Answering {"decision":"approve"} followed by 65 KiB of rule context declines the card.
  • Be quick. Our timeout covers DNS, TLS, your processing and the response body.