Skip to content
Create account or Sign in
/
Ask AI
Create accountSign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
Overview
Get started with Connect
Design your integration
Integration fundamentals
Example integrations
Account management
Onboard connected accounts
Configure account Dashboards
Capabilities and information requirements
Work with connected account types
Payment processing
Accept payments
Pay out to accounts
Platform administration
Manage your Connect platform
Tax forms for your Connect platform
Embedded finance
Treasury for platforms
Issuing
    Overview
    How Issuing works
    Global availability
    Product and marketing compliance guidance (US)
    Marketing guidance (Europe/UK)
    Manage fraud
    Get started with Issuing
    Onboarding overview
    Choose a cardholder type
    Choose your card type
    Virtual cards
    Physical cards
    Fund your Issuing balance
    Testing
    Integrate Issuing
    Integration guides
    Sample app
    Manage cards
    Digital wallets
    Replacement cards
    Card programs
    Program management
    Processor-only Issuing
    Customize your card program
    Add funds to your card program
    Consumer Credit Issuing
    Consumer prepaid debit cards
    Stablecoin-backed cards
    Controls
    Spending controls
    Lifecycle controls
    Radar
    3DS
    Alerts for updated phone numbers
    Fraud challenges
    Real-time authentications
    Real-time authorizations
    Issuer-app authentications
    PIN management
    Issuing Elements
    Token management
    Postfunding
    Postfund your integration with Stripe
    Postfund your integration with Dynamic Reserves
    Purchases
    Authorizations
    Transactions
    Disputes
    Merchant categories
    ATM usage
    Enriched merchant data
    Issuing with Connect
    Set up an Issuing and Connect integration
    Update terms of service acceptance
    Connect funding
    Connected accounts, cardholders, and cards
    Inactive connected accounts offboarding
    Embed card management UI
    Issuing with Connect and Accounts V2 APIs
    Set up an Issuing and Connect integration
    Credit
    Overview
    Set up connected accounts
    Manage credit terms
    Report other credit decisions and manage AANs
    Report required regulatory data for credit decisions
    Manage account obligations
    Test credit integration
    Additional information
    Customer support for Issuing and Treasury for platforms
    Issuing watchlist
Capital for platforms
Managed support
United States
English (United States)
  1. Home/
  2. Platforms and marketplaces/
  3. Issuing

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:

  1. The authentication challenge. The cardholder might be required to verify ownership of the card.
  2. 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 considerations
United 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:

  1. 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.
  2. You notify your cardholder of a pending authentication request through a push notification to your application.
  3. 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_api_approval. Using this endpoint allows for your application to recover from lost notifications.
    • The retrieve endpoint, to fetch the Authentication by the data.object.id in the issuing_authentication.requires_api_approval event.
  4. The cardholder reviews the transaction details and completes the authentication challenge within your application.
  5. Depending on whether the authentication was successful, your application backend will call either the Authentication approve or decline endpoint. The Authentication’s status is updated to approved or failed, respectively. If the status is failed, see status_reason for the reason.
  6. 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_amount, merchant_currency, and merchant_data 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_amount 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_reason of canceled.

Status reasons

When an authentication fails, the status_reason field indicates why the authentication was unsuccessful:

  • rejected: The authentication was declined using the decline API endpoint
  • canceled: The cardholder canceled the authentication (including abandonment scenarios)
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Chat with Stripe developers on Discord.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc
On this page