# SEPA Direct Debit for Payment Setup API To accept SEPA Direct Debit payments, you must: 1. Create a payment setup. 2. Update the payment setup with the payment details. 3. Confirm the payment. Before you collect a SEPA Direct Debit payment, the customer must sign a mandate that authorizes you to debit their account, and you must send them a pre-notification before you debit any funds. These requirements come from the [European Payments Council (EPC)](https://www.europeanpaymentscouncil.eu/what-we-do/epc-payment-schemes/sepa-direct-debit/sepa-direct-debit-core-rulebook-and-implementation). For full instructions on setting up a mandate and sending a pre-notification, see [Set up the mandate](https://www.checkout.com/docs/payments/add-payment-methods/sepa-direct-debit/api-only.md#Set_up_the_mandate) and [Send a pre-notification](https://www.checkout.com/docs/payments/add-payment-methods/sepa-direct-debit/api-only.md#Send_a_pre-notification). If you already have a mandate ID, for example, from an existing payment instrument, provide it in `payment_methods.sepa.mandate.id` when you update the payment setup, rather than collecting a new signature. --- ## Create a payment setup Call the [Create a payment setup](https://api-reference.checkout.com/tag/Payment-Setups/#operation/createAPaymentSetup) endpoint. > **Information** > > The Payment Setup API supports [idempotency](https://www.checkout.com/docs/developer-resources/api/idempotency.md). You can safely retry API requests without the risk of duplicate requests. > **Information** > > Your base URL's `{prefix}` value is unique to your account and environment. To learn how to retrieve your base URLs for the sandbox and production environments, see [API endpoints](https://www.checkout.com/docs/developer-resources/api/api-endpoints.md). **Production** `POST` `https://{prefix}.api.checkout.com/payments/setups` **Sandbox** `POST` `https://{prefix}.api.sandbox.checkout.com/payments/setups` ### Request example ```json { "processing_channel_id": "pc_wzjki6hw5puepb5fnvqlizj2e4", "currency": "EUR", "amount": 10000, "reference": "ORDER_01234", "description": "SEPA Direct Debit payment", "payment_type": "regular", "settings": { "success_url": "https://example.com/payments/success", "failure_url": "https://example.com/payments/failure" } } ``` In the request body, provide the following: - `processing_channel_id` – The [processing channel's](https://www.checkout.com/docs/business-operations/use-the-dashboard/manage-processing-channels.md) unique identifier - `amount` – The payment amount - `currency` – The payment currency ### Response example ```json { "id": "set_rcmepwrchqab2wsergcafvijfy", "processing_channel_id": "pc_wzjki6hw5puepb5fnvqlizj2e4", "amount": 10000, "currency": "EUR", "payment_type": "regular", "reference": "ORDER_01234", "description": "SEPA Direct Debit payment", "payment_methods": { "sepa": { "status": "ready", "flags": [] } }, "available_payment_methods": [ "sepa" ], "settings": { "success_url": "https://example.com/payments/success", "failure_url": "https://example.com/payments/failure" } } ``` The response returns a `payment_methods` object, which contains the payment methods enabled on your account. For SEPA Direct Debit, `payment_methods` contains the following fields: - `status` – The [status of the payment method](https://www.checkout.com/docs/payments/accept-payments/accept-a-payment-using-the-payment-setup-api.md#Payment_method_status). For SEPA Direct Debit, the status can be: - `ready` - `unavailable` - `invalid` - `flags` – An array of error codes or indicators that highlight missing or invalid information. --- ## Update the payment setup When the customer selects SEPA Direct Debit as the payment method on the checkout page, collect their account and mandate details and call the [Update a payment setup](https://api-reference.checkout.com/tag/Payment-Setups/#operation/updateAPaymentSetup) endpoint to submit them. Additionally, provide the following fields: | Field | Description | | --- | --- | | `payment_methods.sepa.account_holder`
`object` | The account holder's information.

**Required** | | `payment_methods.sepa.account_holder.type`
`string` | The account holder type.

Supported values:

- `individual`
- `corporate`

**Required** | | `payment_methods.sepa.account_number`
`string` | The account holder's IBAN (International Bank Account Number).

**Required** | | `payment_methods.sepa.country`
`string` | The account holder's country, as an ISO 3166-1 alpha-2 country code.

Min length: 2

Max length: 2

**Required** | | `payment_methods.sepa.currency`
`string` | The account holder's account currency.

Min length: 3

**Required** | | `payment_methods.sepa.account_holder.company_name`
`string` | The account holder's company name.

Max length: 50

Conditional – Required if `payment_methods.sepa.account_holder.type` is `corporate`. | | `payment_methods.sepa.account_holder.first_name`
`string` | The account holder's first name.

Max length: 50

Conditional – Required if `payment_methods.sepa.account_holder.type` is `individual`. | | `payment_methods.sepa.account_holder.last_name`
`string` | The account holder's last name.

Max length: 50

Conditional – Required if `payment_methods.sepa.account_holder.type` is `individual`. | | `payment_methods.sepa.mandate.date_of_signature`
`string` | The date the customer signed the mandate.

Format: `date`

Conditional – Required if `payment_methods.sepa.mandate.id` is not provided. | | `payment_methods.sepa.mandate`
`object` | The mandate information. | | `payment_methods.sepa.mandate.id`
`string` | The identifier of an existing mandate. Provide this field if you already have a mandate ID, for example, from a stored payment instrument, instead of collecting a new signature. | | `payment_methods.sepa.mandate.type`
`string` | The mandate type. Align this value with `payment_methods.sepa.account_holder.type`: use `core` for an `individual` account holder, and `b2b` for a `corporate` account holder.

Supported values:

- `core`
- `b2b` | ### Request example ```json { "processing_channel_id": "pc_wzjki6hw5puepb5fnvqlizj2e4", "currency": "EUR", "amount": 10000, "reference": "ORDER_01234", "description": "SEPA Direct Debit payment", "payment_type": "regular", "settings": { "success_url": "https://example.com/payments/success", "failure_url": "https://example.com/payments/failure" }, "payment_methods": { "sepa": { "account_holder": { "type": "individual", "first_name": "Ali", "last_name": "Farid" }, "account_number": "FR7630006000011234567890189", "country": "FR", "currency": "EUR", "mandate": { "type": "core", "date_of_signature": "2026-03-22" } } } } ``` ### Response example ```json { "id": "set_rcmepwrchqab2wsergcafvijfy", "processing_channel_id": "pc_wzjki6hw5puepb5fnvqlizj2e4", "amount": 10000, "currency": "EUR", "payment_type": "regular", "reference": "ORDER_01234", "description": "SEPA Direct Debit payment", "payment_methods": { "sepa": { "status": "ready", "flags": [] } }, "available_payment_methods": [ "sepa" ], "settings": { "success_url": "https://example.com/payments/success", "failure_url": "https://example.com/payments/failure" } } ``` The response returns a `ready` status when the payment details have been successfully validated. The payment is ready to confirm. --- ## Confirm the payment When the payment status changes to `ready`, confirm the payment by calling the [Confirm a payment setup](https://api-reference.checkout.com/tag/Payment-Setups/#operation/confirmAPaymentSetup) endpoint and provide: - The payment setup `id` as the `{id}` path parameter. - `sepa` as the `{payment_method_name}` path parameter. **Production** `POST` `https://{prefix}.api.checkout.com/payments/setups/{id}/confirm/sepa` **Sandbox** `POST` `https://{prefix}.api.sandbox.checkout.com/payments/setups/{id}/confirm/sepa` A successful response returns a `latest.payment_id` that you can use to track the payment.