**Last updated**: 22 April 2025 | [**Change log**](/products/3ds/changelog/)
# Android and iOS SDK
Verify your customer's identity simply and seamlessly to minimize fraud. Use our strong customer authentication to benefit from liability shift.
1. [Get started](/products/3ds/android-ios/get-started) with our App SDK
2. Get a JWT to [initialize the SDK](/products/3ds/android-ios/device-data) and perform [device data collection](/products/3ds/android-ios/device-data)
3. Submit order and risk data for [authentication](/products/3ds/android-ios/authentication). The 3DS flow ends here if no challenge is required (frictionless).
4. Show the issuer [challenge display](/products/3ds/android-ios/challenge-verification) using the native SDK and retrieve the authentication details to form part of the payment authorize request.
5. [Test](/products/3ds/testing) the integration on our Try environment using specific values.
The Access 3DS API is periodically tested against the latest version of the Cardinal 3DS SDK. You can see the latest tested version in the [change log](/products/3ds/changelog).
SDK updates
We strongly recommend signing up [here](https://win.cardinalcommerce.com/CardinalMobileSDKNotifications) so you are kept informed of SDK updates.
## Flows
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
```
**Next steps**
[Get started](/products/3ds/android-ios/get-started)