3D Secure
Card payments in the EEA need strong customer authentication. 3D Secure runs on the checkout page when the card issuer asks for it; you don’t need to do anything. A declined payment’s reason is on the Payment asoutcome.providerReason.
Risk rules
Set rules in the dashboard (Settings → Risk rules) or with the API (/api/v1/fraud-rules):
customerEmail (or the customer’s email) you send when you create the checkout session. Without one they are skipped, not passed; amount rules still apply. Payment links always collect the email first.
When a payment is blocked
- At checkout creation (guaranteed):
POST /api/v1/checkout-sessionsanswers402withtype: "payment_blocked"and coderule_<kind>. No payment page is created. The response never reveals the rule’s value. - Right before payment (best effort): The checkout asks Zahlo once more just before the customer pays. If a rule now matches, the customer sees “This payment is no longer available”. The payment goes through if Zahlo doesn’t answer in time or is unreachable, and a page that was already open can still be paid after the session expired. Such payments are recorded normally; refund them if needed.
- Too many attempts: payment links allow 10 checkouts per hour from one network address, 300 per link and 1,000 per merchant; a checkout allows 5 payment attempts. Over the limit the customer is asked to try again later.