Skip to main content

3D Secure

3D Secure (3DS) is an authentication step that runs before a card payment is authorized. The cardholder's issuing bank verifies that the person making the purchase is the legitimate cardholder—either silently (frictionless) or by presenting a challenge such as a one-time passcode or a banking-app push.

Credova implements 3DS 2.x using Basis Theory as the 3DS Server and passes the resulting authentication values to the processor on a single payment submission. 3DS layers onto the existing Payment Intents flow and provides you the flexibility to opt in per intent at confirm time.

Why use it: a successful 3DS authentication shifts chargeback liability from you to the issuer and is mandatory for Strong Customer Authentication (SCA) on in-scope EU/UK transactions.

3DS is gated per account and is off by default. Contact Credova to enable 3DS on your account before integrating.

Transports

There are two ways to present 3DS to the cardholder. Both share the same confirmcomplete API flow and differ only in how the session is created and how a challenge is rendered.

FactorIframeRedirect
Session createdIn the browser, via the Elements SDKServer-side, by Credova at confirm
Device fingerprint qualityReal (browser-collected) — higher frictionless rateApproximated — lower frictionless rate
Challenge presentationACS iframe embedded in your page (state preserved)Full-page navigation to a hosted page
Merchant routes requiredNoneTwo callback routes (success + failure)
JS SDK dependencyRequired (@publicsquare/elements-js / -react)None
Mobile webview compatibilityCan be blocked by some webviewsUniversal
Best forStandard web checkouts (default)Native webviews, server-rendered checkouts

See Process 3DS Payments (Iframe) and Process 3DS Payments (Redirect) for step-by-step walkthroughs.

Glossary

TermMeaning
3DSS3DS Server — initiates authentication on the merchant's behalf (Basis Theory)
ACSAccess Control Server — the issuer's challenge endpoint
FrictionlessAuthentication completes with no cardholder interaction
ChallengeCardholder must complete an ACS-hosted step (OTP, biometric, bank app)
Liability shiftChargeback liability moves from merchant to issuer on success

Anatomy

Confirm request

Send the three_d_secure field as part of the confirm call. See Confirm Payment Intent for more details.

FieldDescription
transportRequired. iframe or redirect.
session_idIframe only. The Credova 3DS session id (id) returned by the Elements SDK createSession.
success_urlRedirect only. Where the cardholder is returned after a successful challenge.
failure_urlRedirect only. Where the cardholder is returned on a failed/cancelled challenge.
challenge_preferenceOptional. See Challenge preference.
exemption_request_reasonRequired when challenge_preference is exemption-requested. See Challenge preference.

Next action

When a challenge is required, confirm returns the intent in requires_action status with

FieldDescription
session_idThe 3DS session id. Pass this back to complete.
transportiframe or redirect.
acs_challenge_urlIframe only. URL the SDK loads to render the challenge.
acs_transaction_idIframe only. Identifies the ACS transaction for the SDK.
three_ds_versionIframe only. The 3DS protocol version, e.g. 2.2.0.
redirect_urlRedirect only. Navigate the browser here to present the challenge.

3DS session

Created in the browser by the Elements SDK createSession (which also registers it with Credova) and retrievable via Get 3DS Session.

FieldDescription
idThe Credova session id. Pass this to confirm and complete.
bt_session_idThe underlying session id used to render the challenge iframe (the SDK challenge sessionId).
card_brandDetected card brand.
additional_card_brandsAny co-badged brands.
acs_transaction_idACS transaction identifier.
3DS Session
{
"id": "tds_2YKewBonG4tgk12MheY3PiHDy",
"bt_session_id": "0e5a...c1",
"card_brand": "visa",
"additional_card_brands": ["cartes_bancaires"],
"acs_transaction_id": "f3e8a1b2-..."
}
Two ids are in play: the Credova id drives the confirm/complete API calls, and bt_session_id drives the in-page challenge.

Lifecycle

The issuer returns one of these authentication status codes. Codes that authenticate the cardholder allow the payment to proceed to the processor; the rest fail the payment.

CodeMeaningOutcome
YSuccessfulAuthenticated — full liability shift, payment proceeds
AAttemptedAuthenticated — no liability shift, payment proceeds
IInformationalAuthenticated — payment proceeds
CChallenge requiredRender the challenge, then call complete
NNot authenticatedPayment fails
UUnable to authenticatePayment fails
RRejectedPayment fails

Challenge preference

challenge_preference lets you express how you'd like the issuer to handle the authentication. Most integrations omit it (defaults to no preference).

ValueUse when
no-preferenceStandard transaction, no specific exemption requested.
no-challengeYou'd prefer a frictionless flow but aren't claiming a regulatory exemption.
challenge-requestedYou want to force a challenge (e.g. high-ticket transactions).
exemption-requestedYou're claiming a regulatory SCA exemption. Requires exemption_request_reason.

When challenge_preference is exemption-requested, set exemption_request_reason to one of: low-value-payment, transaction-risk-analysis, add-card, account-verification.

Testing

3DS authentication is triggered automatically by the card number used. Use any future expiration date, any CVV, and any billing ZIP. These test cards are available in the test environment.

ScenarioCard numberBrandExpected result
Frictionless success5204247750001471Mastercardsucceeded, no challenge
Frictionless success340000000004001Amexsucceeded, no challenge
Challenge success4000020000000000Visachallenge → succeeded
Challenge success370000000000002Amexchallenge → succeeded
Mandated challenge4761369980320253Visachallenge → succeeded
Mandated challenge5200000000001104Mastercardchallenge → succeeded
Out-of-band challenge4000000000000341Visachallenge → succeeded
Authentication attempted4111111111111111Visasucceeded (partial shift)
Authentication attempted5424180011113336Mastercardsucceeded (partial shift)
Authentication failed4264281511112228Visafailed
Authentication failed5424180000000171Mastercardfailed
Authentication unavailable5405001111111165Mastercardfailed
Authentication rejected5405001111111116Mastercardfailed
Failed challenge4055011111111111Visachallenge → failed
Failed challenge5427660064241339Mastercardchallenge → failed
Directory server error4264281500003339Visafailed (error surfaced)
Internal server error4264281500001119Visafailed (error surfaced)

Where to go next