Important
We have released a new version. Documentation for our latest version can be found [here](/products/3ds/).
**Last updated**: 22 April 2025 | [**Change log**](/products/3ds/changelog/)
# Android and iOS SDK
Use our native android SDK to improve issuer challenge display for 3DS2 and increase the chance of a frictionless authentication using mobile device data.
1. [Get started](/products/3ds/v2/android-ios/get-started) with our App SDK
2. Get a JWT to [initialize the SDK](/products/3ds/v2/android-ios/device-data) and perform [device data collection](/products/3ds/v2/android-ios/device-data)
3. Submit order and risk data for [authentication](/products/3ds/v2/android-ios/authentication). The 3DS flow ends here if no challenge is required (frictionless).
4. Show the issuer [challenge display](/products/3ds/v2/android-ios/challenge-verification) using the native SDK and retrieve the authentication details to form part of the payment authorize request.
Note
Native mobile support is a new feature of 3DS2, for responses that are 3DS1 a webview is required for the [challenge](/products/3ds/v2/android-ios/challenge-verification).
Visualize our 3DS API and see the flow of a 3DS authentication.
Android and iOS - 3DS2 Frictionless
```mermaid
sequenceDiagram
participant Browser
participant Merchant Frontend
participant Merchant Backend
participant Access 3DS
participant Cardinal/Issuers
Browser-->>Merchant Frontend: Click Pay
Merchant Frontend-->>Merchant Backend: Pay
Merchant Backend-->>Access 3DS: deviceDataInitialization request
Access 3DS-->>Merchant Backend: deviceDataInitialization response
Merchant Backend-->>Merchant Frontend: deviceDataCollection.jwt
Merchant Frontend-->>Cardinal/Issuers: cardinal.init(jwt)
Cardinal/Issuers-->>Merchant Frontend: ConsumerSessionId
Merchant Frontend-->>Merchant Backend: Data for authentication request
Note left of Merchant Frontend: If no `dfReferenceId`
(collectionReference) is provided or
the issuer doesn't support 3DS2, the
flow will use 3DS1 from here
(always challenge)
Merchant Backend-->>Access 3DS: Authentication request
Access 3DS-->>Merchant Backend: Authentication response
Note left of Merchant Backend: Use in payment authorization:
-version
-authenticationValue
-eci
-transactionId
```
Android and iOS - 3DS2 Challenge
```mermaid
sequenceDiagram
participant Browser
participant Merchant Frontend
participant Merchant Backend
participant Access 3DS
participant Cardinal/Issuers
Browser-->>Merchant Frontend: Click Pay
Merchant Frontend-->>Merchant Backend: Pay
Merchant Backend-->>Access 3DS: deviceDataInitialization request
Access 3DS-->>Merchant Backend: deviceDataInitialization response
Merchant Backend-->>Merchant Frontend: deviceDataCollection.jwt
Merchant Frontend-->>Cardinal/Issuers: cardinal.init(jwt)
Cardinal/Issuers-->>Merchant Frontend: ConsumerSessionId
Merchant Frontend-->>Merchant Backend: Data for authentication request
Note left of Merchant Frontend: If no `dfReferenceId`
(collectionReference) is provided or
the issuer doesn't support 3DS2, the
flow will use 3DS1 from here
(always challenge)
Merchant Backend-->>Access 3DS: Authentication request
Access 3DS-->>Merchant Backend: Authentication response
Merchant Backend-->>Merchant Frontend: challenge.payload
Merchant Frontend-->>Cardinal/Issuers: Cardinal.continue(reference.payload)
Cardinal/Issuers-->>Merchant Frontend: Response
Merchant Frontend-->>Merchant Backend: Verification request
Note left of Merchant Frontend: Once the challenge has been
completed you can submit the
`challenge.reference` from the
authentication response to the
verification request
Merchant Backend-->>Access 3DS: Verification request
Access 3DS-->>Merchant Backend: Verification response
Note left of Merchant Backend: Use in payment authorization:
-version
-authenticationValue
-eci
-transactionId
```
Android and iOS - 3DS1 Challenge
```mermaid
sequenceDiagram
participant Browser
participant Merchant Frontend
participant Merchant Backend
participant Access 3DS
participant Cardinal/Issuers
Browser-->>Merchant Frontend: Click Pay
Merchant Frontend-->>Merchant Backend: Pay
Merchant Backend-->>Access 3DS: deviceDataInitialization request
Access 3DS-->>Merchant Backend: deviceDataInitialization response
Merchant Backend-->>Merchant Frontend: deviceDataCollection.jwt
Merchant Frontend-->>Cardinal/Issuers: cardinal.init(jwt)
Cardinal/Issuers-->>Merchant Frontend: ConsumerSessionId
Merchant Frontend-->>Merchant Backend: Data for authentication request
Note left of Merchant Frontend: If no `dfReferenceId`
(collectionReference) is provided or
the issuer doesn't support 3DS2, the
flow will use 3DS1 from here
(always challenge)
Merchant Backend-->>Access 3DS: Authentication request
Access 3DS-->>Merchant Backend: Authentication response
Merchant Backend-->>Merchant Frontend: challenge.jwt
challenge.url
challenge.reference
Merchant Frontend-->>Cardinal/Issuers: Submit challenge form
Note left of Merchant Frontend: Challenge Display (webView)
Cardinal/Issuers-->>Merchant Frontend: Return to merchant site (challenge.returnUrl)
Merchant Frontend-->>Merchant Backend: Verification request
Note left of Merchant Frontend: Once the challenge has been
completed you can submit the
`challenge.reference` from the
authentication response to the
verification request
Merchant Backend-->>Access 3DS: Verification request
Access 3DS-->>Merchant Backend: Verification response
Note left of Merchant Backend: Use in payment authorization:
-version
-authenticationValue
-eci
-transactionId
```
**Next steps**
[Get started](/products/3ds/v2/android-ios/get-started)