3-D Secure & SCA
Authenticate the cardholder with their issuer before you charge — frictionless where the issuer allows it, a challenge when it doesn't, and a liability shift when it succeeds.
3-D Secure is how the issuer confirms the person entering the card is the cardholder. Two reasons to care: in Europe and the UK it’s mandatory (Strong Customer Authentication), and everywhere it moves the cost of a fraud chargeback from you to the issuer. kepa runs the protocol; you read the outcome.
Automatic 3-D Secure
Pass threeDS: "automatic" to confirm and kepa.js starts the authentication exchange. Frictionless authentication resolves without interrupting the customer. When an issuer challenge is required, kepa.js renders the secure ACS frame and waits for Kepa to receive the provider-verified result before continuing.
// kepa.js — threeDS "automatic" starts authentication
await payment.confirm(checkoutSessionId, clientSecret, {
threeDS: "automatic",
});
// frictionless: resolves immediately, authenticated
// challenge: renders the issuer ACS and waits for a verified provider resultFour outcomes
AUTHENTICATEDThe issuer authenticated the cardholder — frictionless, or after a challenge.Liability shiftsATTEMPTEDThe issuer or network isn't enrolled, but the attempt is recorded.Partial shiftCHALLENGE_PENDINGThe issuer wants a step-up; the customer completes it, then it resolves.Resolves to one of the aboveFAILEDAuthentication failed or the directory was unreachable.No shift — you decideLiability shift
When authentication succeeds, the result carries liabilityShift: true along with the eci and cavvthe network needs. From that point, a fraudulent-transaction chargeback is the issuer’s liability rather than yours.
{
"threeDS": {
"status": "AUTHENTICATED",
"eci": "05",
"liabilityShift": true,
"directoryServer": "visa",
"dsTransactionId": "ds_9c2a…"
}
}Results are server-verified
The challenge happens in the customer’s browser, but the result is not taken from the browser. kepa records the outcome only from the directory server’s signed response, so a client that posts a forged “authenticated” result is rejected. When 3-D Secure is required but the directory is unreachable, kepa fails closed: the payment is not authorized unauthenticated.
eci, cavv, and directory identifiers stay inside kepa and travel with the authorization. There’s nothing sensitive for you to store or forward.When it triggers
kepa’s risk engine decides before authorization, and returns a REQUIRE_3DS decision when the order warrants it — the billing country requires a challenge, the amount crosses a threshold, the card has repeated failed attempts, or you forced 3-D Secure for that order. Low-value, low-risk payments are often exempted and authenticate frictionlessly. The friction only appears when the risk justifies it.