Issuer-app authentication
Learn how to authenticate users using your custom, in-app flow for 3DS.
When a card is used to make an online transaction using 3DS, two steps happen:
- The authentication challenge. The cardholder might be required to verify ownership of the card.
- The authorization flow.
By default, Stripe will handle the authentication challenge for you by either sending a one-time password (OTP) to the cardholder’s email or phone number or prompting the cardholder to identify a past transaction. Upon successful completion of the challenge, the authorization flow follows.
However, instead of using this default flow, you can handle this authentication flow using your custom, in-application flow. We refer to this as "issuer-app authentication.”
Regional considerationsUnited States
Issuer-app authentication is available only for US Issuing users. Access is limited to eligible users and might require enrollment. Contact your Stripe account manager or Stripe Support to confirm eligibility.
Issuer-app authentication flow
Issuer-app authentications follow these steps:
- Upon receiving a 3DS challenge request, Stripe sends an issuing_authentication.requires_api_approval webhook event, letting you know we’re awaiting a decision about an authentication.
- You notify your cardholder of a pending authentication request through a push notification to your application.
- Retrieve the pending Authentication. You can have your user application call one of the following:
- The list endpoint, to fetch all pending authentications for the card with parameter status as
requires_. Using this endpoint allows for your application to recover from lost notifications.api_ approval - The retrieve endpoint, to fetch the Authentication by the
data.in theobject. id issuing_event.authentication. requires_ api_ approval
- The list endpoint, to fetch all pending authentications for the card with parameter status as
- The cardholder reviews the transaction details and completes the authentication challenge within your application.
- Depending on whether the authentication was successful, your application backend will call either the Authentication approve or decline endpoint. The Authentication’s
statusis updated toapprovedorfailed, respectively. If the status isfailed, seestatus_for the reason.reason - If the authentication is successful, then the regular authorization flow occurs. Otherwise, the flow ends and the authorization flow doesn’t occur.
Don’t make on-behalf-of approvals for challenges with issuer-app authentication. The cardholder must authenticate directly.
Authentication responsibility
With issuer-app authentication, your application (not Stripe) is responsible for performing strong customer authentication (SCA) on the cardholder.
Warning
Your user application, not Stripe, is performing two-factor authentication on the cardholder. The elements used must be from different domains; for example, you can’t authenticate the user with two “knowledge” elements. For further details about SCA requirements, see What’s Strong Customer Authentication?
We suggest showing merchant_, merchant_, and merchant_ to the cardholder for verification.
{ "id": "iauthn_1I7C5jEEsyYlpYZ9y03lmgFU", "object": "issuing.authentication", "authentication_method": "api", ... "merchant_amount": 500, "merchant_currency": "usd", "merchant_data": { "country": "US", "name": "Rocket Rides", "redirect_url": null, "url": "https://www.rocketrides.io" }, ... }
Note
The merchant_ isn’t a finalized amount and might change between authentication and authorization. The authentication amount itself doesn’t impact your account’s transaction volume or balance.
Authentication cancellations
Cardholders might choose not to proceed with the authentication challenge, in which case an issuing_authentication.updated webhook event is sent. The canceled Authentication will have a status of failed and status_ of canceled.
Status reasons
When an authentication fails, the status_ field indicates why the authentication was unsuccessful:
rejected: The authentication was declined using the decline API endpointcanceled: The cardholder canceled the authentication (including abandonment scenarios)