# 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.