---
title: "iDEAL iOS Drop-in"
description: "Add iDEAL to your Drop-in integration."
url: "https://docs.adyen.com/payment-methods/ideal/ios-drop-in"
source_url: "https://docs.adyen.com/payment-methods/ideal/ios-drop-in.md"
canonical: "https://docs.adyen.com/payment-methods/ideal/ios-drop-in"
last_modified: "2026-06-01T15:33:15+02:00"
language: "en"
---

# iDEAL iOS Drop-in

Add iDEAL to your Drop-in integration.

[View source](/payment-methods/ideal/ios-drop-in.md)

You can add iDEAL to your existing integration. The following instructions show only what you must add to your integration specifically for iDEAL.

If an instruction on this page corresponds with a step in the main integration guide, it includes a link to corresponding step of the main integration guide.

The additions you must make depends on the [server-side flow](/online-payments/build-your-integration) that your integration uses:

## Sessions flow Drop-in

### Drop-In-Before-You-Begin

## Requirements

| Requirement          | Description                                                                                                                                                                                                                                                                       |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Integration type** | Make sure that you have an existing Sessions flow [Drop-in integration](/online-payments/build-your-integration/sessions-flow?platform=iOS\&integration=Drop-in). Required version of [Checkout API](https://docs.adyen.com/api-explorer/Checkout/latest/overview): v68 or later. |
| **Setup steps**      | Before you begin, [add iDEAL in your Customer Area](/payment-methods/add-payment-methods).                                                                                                                                                                                        |

### Drop-In-Add-Parameters-Sessions-Request

## Add additional parameters to your /sessions request

You do not need to add any parameters when you [create a payment session](/online-payments/build-your-integration/sessions-flow?platform=iOS\&integration=Drop-in#create-a-payment-session).

### Drop-In-Add-Configuration

## Add additional configuration for iDEAL

You do not need to add any configuration parameters for iDEAL.

### Drop-In-Recurring

## Recurring payments

Adyen supports recurring payments for iDEAL through [SEPA Direct Debit](/payment-methods/sepa-direct-debit). To make recurring payments, you need to:

1. [Create a shopper token](#create-a-token).
2. [Use the token to make future payments for the shopper](#make-payment-with-token).

### 1. Create a token

#### Store SEPA details

When [creating a token](/online-payments/tokenization/create-tokens) for SEPA Direct Debit, use the standard tokenization parameters in your payment request. You do not need to include any additional parameters for SEPA Direct Debit.

When a token is created, you receive a [recurring.token.created](https://docs.adyen.com/api-explorer/Tokenization-webhooks/latest/post/recurring.token.created) webhook. The webhook contains the `storedPaymentMethodId` that you can use to make subsequent payments using the stored payment details.

### 2. Make a payment with a token

Only use tokenised payments in scenarios where the shopper is not present, that is, `UnscheduledCardOnFile` and `Subscription` payments.

#### Make a subscription payment

[Make a subscription payment](/online-payments/tokenization/make-token-payments#make-a-subscription-or-unscheduled-card-on-file-payment) using the standard tokenization parameters. You do not need to include any additional parameters for SEPA Direct Debit.

#### Make an unscheduled card-on-file payment

[Make an unscheduled card-on-file](/online-payments/tokenization/make-token-payments#make-a-subscription-or-unscheduled-card-on-file-payment) using the standard tokenization parameters. You do not need to include any additional parameters for SEPA Direct Debit.

#### curl

```bash
curl https://checkout-test.adyen.com/v68/payments \
-H 'x-api-key: ADYEN_API_KEY' \
-H 'content-type: application/json' \
-d '{
   "amount":{
      "value":1000,
      "currency":"EUR"
   },
   "paymentMethod":{
      "type":"sepadirectdebit",
      "storedPaymentMethodId":"7219687191761347"
   },
   "reference":"YOUR_ORDER_NUMBER",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "shopperInteraction":"ContAuth",
   "recurringProcessingModel": "Subscription"
}'
```

#### Java

```java
// Set ADYEN_API_KEY with the API key from the Customer Area.
// Change to Environment.LIVE and add the Live URL prefix when you are ready to accept live payments.
Client client = new Client("ADYEN_API_KEY", Environment.TEST);
Checkout checkout = new Checkout(client);

PaymentsRequest paymentsRequest = new PaymentsRequest();

String merchantAccount = "YOUR_MERCHANT_ACCOUNT";
paymentsRequest.setMerchantAccount(merchantAccount);

Amount amount = new Amount();
amount.setCurrency("EUR");
amount.setValue(15000L);
paymentsRequest.setAmount(amount);

DefaultPaymentMethodDetails paymentMethodDetails = new DefaultPaymentMethodDetails();
paymentMethodDetails.setStoredPaymentMethodId("7219687191761347");
paymentMethodDetails.setType("sepadirectdebit");
paymentsRequest.setPaymentMethod(paymentMethodDetails);

paymentsRequest.setReference("YOUR_ORDER_NUMBER");
paymentsRequest.setReturnUrl("https://your-company.com/checkout?shopperOrder=12xy..");
paymentsRequest.setShopperInteraction("ContAuth");
paymentsRequest.setRecurringProcessingModel("Subscription");

PaymentsResponse paymentsResponse = checkout.payments(paymentsRequest);
```

#### PHP

```php
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("ADYEN_API_KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "EUR",
    "value" => 1000
  ),
  "reference" => "YOUR_ORDER_NUMBER",
  "paymentMethod" => array(
    "type" => "sepadirectdebit",
    "storedPaymentMethodId" => "7219687191761347"
  ),
  "returnUrl" => "https://your-company.com/checkout?shopperOrder=12xy..",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "recurringProcessingModel" => "Subscription",
  "shopperInteraction" => "ContAuth",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT"
);
$result = $service->payments($params);
```

#### C\#

```cs
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("ADYEN_API_KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Adyen.Model.Checkout.Amount("EUR", 1000);
var details = new Adyen.Model.Checkout.DefaultPaymentMethodDetails{
  Type = "sepadirectdebit",
  StoredPaymentMethodId = "7219687191761347"
};
var paymentsRequest = new Adyen.Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/checkout?shopperOrder=12xy..",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  RecurringProcessingModel = Adyen.Model.Checkout.PaymentRequest.RecurringProcessingModelEnum.Subscription,
  ShopperInteraction = Adyen.Model.Checkout.PaymentRequest.ShopperInteractionEnum.ContAuth,
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
```

#### NodeJS (JavaScript)

```js
// Adyen Node API Library v16.1.0
// Require the parts of the module you want to use
const { Client, CheckoutAPI } = require('@adyen/api-library');

// Initialize the client object
const client = new Client({apiKey: "YOUR_X_API_KEY", environment: "TEST"});

// Create the request object
const paymentRequest = {
  amount: {
    value: 1000,
    currency: "EUR"
  },
  paymentMethod: {
    type: "sepadirectdebit",
    storedPaymentMethodId: "7219687191761347"
  },
  reference: "YOUR_ORDER_NUMBER",
  merchantAccount: "YOUR_MERCHANT_ACCOUNT",
  shopperReference: "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  shopperInteraction: "ContAuth",
  recurringProcessingModel: "Subscription"
}

// Make the request
const checkoutAPI = new CheckoutAPI(client);
const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
```

#### Python

```py
# Adyen Python API Library v12.0.0
import Adyen

adyen = Adyen.Adyen()
adyen.client.xapikey = "YOUR_X_API_KEY"
adyen.client.platform = "test" # The environment to use library in.

json_request = {
  "amount": {
    "value": 1000,
    "currency": "EUR"
  },
  "paymentMethod": {
    "type": "sepadirectdebit",
    "storedPaymentMethodId": "7219687191761347"
  },
  "reference": "YOUR_ORDER_NUMBER",
  "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
  "shopperReference": "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "shopperInteraction": "ContAuth",
  "recurringProcessingModel": "Subscription"
}

result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID")
```

#### Ruby

```rb
# Adyen Ruby API Library v9.1.0
require "adyen-ruby-api-library"

adyen = Adyen::Client.new
adyen.api_key = 'YOUR_X_API_KEY'
adyen.env = :test # Set to "live" for live environment

request_body = {
  :amount => {
    :value => 1000,
    :currency => 'EUR'
  },
  :paymentMethod => {
    :type => 'sepadirectdebit',
    :storedPaymentMethodId => '7219687191761347'
  },
  :reference => 'YOUR_ORDER_NUMBER',
  :merchantAccount => 'YOUR_MERCHANT_ACCOUNT',
  :shopperReference => 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
  :shopperInteraction => 'ContAuth',
  :recurringProcessingModel => 'Subscription'
}

result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' })
```

If the payment was successfully received, the response contains:

* `resultCode`: **Received**
* `pspReference`: a unique identifier for this transaction.

You can track whether the payment was successful using [webhooks](/development-resources/webhooks).

### Drop-In-Test-And-Go-Live

## Test and go live

The iDEAL test environment is unreliable and may not always work to test your changes. We recommend doing live penny tests to verify your integration.

### Request iDEAL for the live environment

### Live Penny Testing

1. Get a live bank account from one of the iDEAL issuers.
2. Create an iDEAL payment on live and redirect to the iDEAL Payment Page.
3. Scan the QR code on the iDEAL Payment Page or Click **Select your bank** to navigate to a list of issuers.
4. Authorise the payment.
5. Check the status of test payments in your [live Customer Area](https://ca-live.adyen.com/) > **Transactions** > **Payments**.

### Testing on the Test environment

In case the iDEAL test environment is up and running, it may be possible to test using your test account. You are always redirected to a test payment page where you can simulate different iDEAL result codes.

On the payment page:

1. Click **Select your bank** to navigate to a list of issuers.

2. Select the **TESTNL2A** issuer.

3. Select the test simulation you want to run according to the following table:

   | Test simulation           | `resultCode` produced |
   | ------------------------- | --------------------- |
   | Success                   | Authorised            |
   | Cancellation              | Canceled              |
   | Cancellation before login | Canceled              |
   | Expiration                | Pending or Received   |
   | Failure                   | Refused               |

When possible, we recommend that you test each scenario before you go live, otherwise you should perform a **Live Penny Test** to verify your integration.

Check the status of test payments in your [Customer Area](https://ca-test.adyen.com/) > **Transactions** > **Payments**.

## Advanced flow Drop-in

### Drop-In-Requirements

## Requirements

| Requirement           | Description                                                                                                                                                                                                            |   |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
| **Integration type**  | Make sure that you have an existing Advanced flow [iOS Drop-in integration](/online-payments/build-your-integration/advanced-flow?platform=iOS\&integration=Drop-in).                                                  |   |
| **Redirect handling** | Make sure that your existing integration is set up to [handle the redirect](/online-payments/build-your-integration/advanced-flow/?platform=iOS\&integration=Drop-in#handle-the-redirect). `action.type`: **redirect** |   |
| **Setup steps**       | Before you begin, [add iDEAL in your Customer Area](/payment-methods/add-payment-methods).                                                                                                                             |   |

### Drop-In-Add-Configuration

## Add additional configuration for iDEAL

You do not need to add any configuration parameters for iDEAL.

### Drop-In-Add-Parameters-Payments-Request

## Add additional parameters to your /payments request

You do not need to add any parameters to the [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request.

### Drop-In-Recurring

## Recurring payments

Adyen supports recurring payments for iDEAL through [SEPA Direct Debit](/payment-methods/sepa-direct-debit). To make recurring payments, you need to:

1. [Create a shopper token](#create-a-token).
2. [Use the token to make future payments for the shopper](#make-payment-with-token).

### 1. Create a token

#### Store SEPA details

When [creating a token](/online-payments/tokenization/create-tokens) for SEPA Direct Debit, use the standard tokenization parameters in your payment request. You do not need to include any additional parameters for SEPA Direct Debit.

When a token is created, you receive a [recurring.token.created](https://docs.adyen.com/api-explorer/Tokenization-webhooks/latest/post/recurring.token.created) webhook. The webhook contains the `storedPaymentMethodId` that you can use to make subsequent payments using the stored payment details.

### 2. Make a payment with a token

Only use tokenised payments in scenarios where the shopper is not present, that is, `UnscheduledCardOnFile` and `Subscription` payments.

#### Make a subscription payment

[Make a subscription payment](/online-payments/tokenization/make-token-payments#make-a-subscription-or-unscheduled-card-on-file-payment) using the standard tokenization parameters. You do not need to include any additional parameters for SEPA Direct Debit.

#### Make an unscheduled card-on-file payment

[Make an unscheduled card-on-file](/online-payments/tokenization/make-token-payments#make-a-subscription-or-unscheduled-card-on-file-payment) using the standard tokenization parameters. You do not need to include any additional parameters for SEPA Direct Debit.

#### curl

```bash
curl https://checkout-test.adyen.com/v68/payments \
-H 'x-api-key: ADYEN_API_KEY' \
-H 'content-type: application/json' \
-d '{
   "amount":{
      "value":1000,
      "currency":"EUR"
   },
   "paymentMethod":{
      "type":"sepadirectdebit",
      "storedPaymentMethodId":"7219687191761347"
   },
   "reference":"YOUR_ORDER_NUMBER",
   "merchantAccount":"YOUR_MERCHANT_ACCOUNT",
   "shopperReference":"YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
   "shopperInteraction":"ContAuth",
   "recurringProcessingModel": "Subscription"
}'
```

#### Java

```java
// Set ADYEN_API_KEY with the API key from the Customer Area.
// Change to Environment.LIVE and add the Live URL prefix when you are ready to accept live payments.
Client client = new Client("ADYEN_API_KEY", Environment.TEST);
Checkout checkout = new Checkout(client);

PaymentsRequest paymentsRequest = new PaymentsRequest();

String merchantAccount = "YOUR_MERCHANT_ACCOUNT";
paymentsRequest.setMerchantAccount(merchantAccount);

Amount amount = new Amount();
amount.setCurrency("EUR");
amount.setValue(15000L);
paymentsRequest.setAmount(amount);

DefaultPaymentMethodDetails paymentMethodDetails = new DefaultPaymentMethodDetails();
paymentMethodDetails.setStoredPaymentMethodId("7219687191761347");
paymentMethodDetails.setType("sepadirectdebit");
paymentsRequest.setPaymentMethod(paymentMethodDetails);

paymentsRequest.setReference("YOUR_ORDER_NUMBER");
paymentsRequest.setReturnUrl("https://your-company.com/checkout?shopperOrder=12xy..");
paymentsRequest.setShopperInteraction("ContAuth");
paymentsRequest.setRecurringProcessingModel("Subscription");

PaymentsResponse paymentsResponse = checkout.payments(paymentsRequest);
```

#### PHP

```php
// Set your X-API-KEY with the API key from the Customer Area.
$client = new \Adyen\Client();
$client->setXApiKey("ADYEN_API_KEY");
$service = new \Adyen\Service\Checkout($client);

$params = array(
  "amount" => array(
    "currency" => "EUR",
    "value" => 1000
  ),
  "reference" => "YOUR_ORDER_NUMBER",
  "paymentMethod" => array(
    "type" => "sepadirectdebit",
    "storedPaymentMethodId" => "7219687191761347"
  ),
  "returnUrl" => "https://your-company.com/checkout?shopperOrder=12xy..",
  "shopperReference" => "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "recurringProcessingModel" => "Subscription",
  "shopperInteraction" => "ContAuth",
  "merchantAccount" => "YOUR_MERCHANT_ACCOUNT"
);
$result = $service->payments($params);
```

#### C\#

```cs
// Set your X-API-KEY with the API key from the Customer Area.
var client = new Client ("ADYEN_API_KEY", Environment.Test);
var checkout = new Checkout(client);

var amount = new Adyen.Model.Checkout.Amount("EUR", 1000);
var details = new Adyen.Model.Checkout.DefaultPaymentMethodDetails{
  Type = "sepadirectdebit",
  StoredPaymentMethodId = "7219687191761347"
};
var paymentsRequest = new Adyen.Model.Checkout.PaymentRequest
{
  Reference = "YOUR_ORDER_NUMBER",
  Amount = amount,
  ReturnUrl = @"https://your-company.com/checkout?shopperOrder=12xy..",
  MerchantAccount = "YOUR_MERCHANT_ACCOUNT",
  ShopperReference = "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  RecurringProcessingModel = Adyen.Model.Checkout.PaymentRequest.RecurringProcessingModelEnum.Subscription,
  ShopperInteraction = Adyen.Model.Checkout.PaymentRequest.ShopperInteractionEnum.ContAuth,
  PaymentMethod = details
};

var paymentResponse = checkout.Payments(paymentsRequest);
```

#### NodeJS (JavaScript)

```js
// Adyen Node API Library v16.1.0
// Require the parts of the module you want to use
const { Client, CheckoutAPI } = require('@adyen/api-library');

// Initialize the client object
const client = new Client({apiKey: "YOUR_X_API_KEY", environment: "TEST"});

// Create the request object
const paymentRequest = {
  amount: {
    value: 1000,
    currency: "EUR"
  },
  paymentMethod: {
    type: "sepadirectdebit",
    storedPaymentMethodId: "7219687191761347"
  },
  reference: "YOUR_ORDER_NUMBER",
  merchantAccount: "YOUR_MERCHANT_ACCOUNT",
  shopperReference: "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  shopperInteraction: "ContAuth",
  recurringProcessingModel: "Subscription"
}

// Make the request
const checkoutAPI = new CheckoutAPI(client);
const response = checkoutAPI.PaymentsApi.payments(paymentRequest, { idempotencyKey: "UUID" });
```

#### Python

```py
# Adyen Python API Library v12.0.0
import Adyen

adyen = Adyen.Adyen()
adyen.client.xapikey = "YOUR_X_API_KEY"
adyen.client.platform = "test" # The environment to use library in.

json_request = {
  "amount": {
    "value": 1000,
    "currency": "EUR"
  },
  "paymentMethod": {
    "type": "sepadirectdebit",
    "storedPaymentMethodId": "7219687191761347"
  },
  "reference": "YOUR_ORDER_NUMBER",
  "merchantAccount": "YOUR_MERCHANT_ACCOUNT",
  "shopperReference": "YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j",
  "shopperInteraction": "ContAuth",
  "recurringProcessingModel": "Subscription"
}

result = adyen.checkout.payments_api.payments(request=json_request, idempotency_key="UUID")
```

#### Ruby

```rb
# Adyen Ruby API Library v9.1.0
require "adyen-ruby-api-library"

adyen = Adyen::Client.new
adyen.api_key = 'YOUR_X_API_KEY'
adyen.env = :test # Set to "live" for live environment

request_body = {
  :amount => {
    :value => 1000,
    :currency => 'EUR'
  },
  :paymentMethod => {
    :type => 'sepadirectdebit',
    :storedPaymentMethodId => '7219687191761347'
  },
  :reference => 'YOUR_ORDER_NUMBER',
  :merchantAccount => 'YOUR_MERCHANT_ACCOUNT',
  :shopperReference => 'YOUR_UNIQUE_SHOPPER_ID_IOfW3k9G2PvXFu2j',
  :shopperInteraction => 'ContAuth',
  :recurringProcessingModel => 'Subscription'
}

result = adyen.checkout.payments_api.payments(request_body, headers: { 'Idempotency-Key' => 'UUID' })
```

If the payment was successfully received, the response contains:

* `resultCode`: **Received**
* `pspReference`: a unique identifier for this transaction.

You can track whether the payment was successful using [webhooks](/development-resources/webhooks).

### Drop-In-Test-And-Go-Live

## Test and go live

The iDEAL test environment is unreliable and may not always work to test your changes. We recommend doing live penny tests to verify your integration.

### Request iDEAL for the live environment

### Live Penny Testing

1. Get a live bank account from one of the iDEAL issuers.
2. Create an iDEAL payment on live and redirect to the iDEAL Payment Page.
3. Scan the QR code on the iDEAL Payment Page or Click **Select your bank** to navigate to a list of issuers.
4. Authorise the payment.
5. Check the status of test payments in your [live Customer Area](https://ca-live.adyen.com/) > **Transactions** > **Payments**.

### Testing on the Test environment

In case the iDEAL test environment is up and running, it may be possible to test using your test account. You are always redirected to a test payment page where you can simulate different iDEAL result codes.

On the payment page:

1. Click **Select your bank** to navigate to a list of issuers.

2. Select the **TESTNL2A** issuer.

3. Select the test simulation you want to run according to the following table:

   | Test simulation           | `resultCode` produced |
   | ------------------------- | --------------------- |
   | Success                   | Authorised            |
   | Cancellation              | Canceled              |
   | Cancellation before login | Canceled              |
   | Expiration                | Pending or Received   |
   | Failure                   | Refused               |

When possible, we recommend that you test each scenario before you go live, otherwise you should perform a **Live Penny Test** to verify your integration.

Check the status of test payments in your [Customer Area](https://ca-test.adyen.com/) > **Transactions** > **Payments**.
