SEPA direct debit for API only
Last updated: May 21, 2025
To process a SEPA Direct Debit payment:
- Set up the mandate with your customer to obtain their consent.
If you have an existing mandate ID, you can skip this step. - Send the customer a pre-notification of your intent to charge their account.
- Optionally, you can Create a SEPA payment source to store the mandate to use in a recurring payment series.
- Request the payment.
To comply with European Payments Council (EPC) requirements, you must set up a mandate to obtain the bank account owner's consent before you can collect SEPA debit payments from their account.
See Move your existing mandates if you have an existing mandate that you want to migrate to Checkout.com.
Checkout.com enables you to store this information as a payment instrument, and generates a mandate_id
for you to reference in later payments.
If you do not have a mandate ID, you can create one using the API:
post
https://api.checkout.com/instruments
In the instrument_data.type
field, specify the mandate you want to use:
Core
B2B
1{2"type": "sepa",3"instrument_data": {4"type": "Core",5"account_number": "FR7630006000011234567890189",6"currency": "EUR",7"country": "FR",8"payment_type": "Regular",9"date_of_signature": "2025-03-22"10},11"account_holder": {12"first_name": "Ali",13"last_name": "Farid",14"billing_address": {15"address_line1": "Rue Exemple",16"address_line2": "1",17"city": "Paris",18"zip": "75000",19"country": "FR"20}21}22}
1{2"type": "sepa",3"id": "src_wmlfc3zyhqzehihu7giusaaawu",4"fingerprint": "vnsdrvikkvre3dtrjjvlm5du4q"5}
The id
returned represents the saved instrument containing your mandate ID. To retrieve the mandate ID, call the Get instrument details endpoint.
Information
There may be a short delay between when you create the instrument, and when the mandate ID can be returned via the request.
You must provide the mandate ID when you create a SEPA payment source, or request a SEPA Direct Debit Core payment.
To comply with EPC requirements, you must send the customer a pre-notification before debiting any funds from their account.
See SEPA payment flow for more information.
If you want to store the mandate to use in a recurring payment series, you can create a SEPA payment source.
You can create the SEPA payment source at any of the following moments:
- Before you perform your first payment request
- At the same time as you perform your first payment request
In the instrument_data.type
field, specify the mandate you want to use:
Core
B2B
1{2"type": "sepa",3"instrument_data": {4"type": "Core",5"account_number": "FR7630006000011234567890189",6"currency": "EUR",7"country": "FR",8"payment_type": "Regular",9"date_of_signature": "2025-03-22"10},11"account_holder": {12"first_name": "Ali",13"last_name": "Farid",14"billing_address": {15"address_line1": "Rue Exemple",16"address_line2": "1",17"city": "Paris",18"zip": "75000",19"country": "FR"20}21}22}
1{2"type": "sepa",3"id": "src_wmlfc3zyhqzehihu7giusaaawu",4"fingerprint": "vnsdrvikkvre3dtrjjvlm5du4q"5}
The id
returned represents the saved instrument containing your mandate ID. To retrieve the mandate ID, call the Get instrument details endpoint.
Information
There may be a short delay between when you create the instrument, and when the mandate ID is returned in the response.
You receive an instrument ID, which you can reuse as the source
in future payment requests.
Call the Request a payment endpoint to create a SEPA payment.
In the instrument_data.type
field, specify the mandate you want to use:
Core
B2B
post
https://api.checkout.com/payments
1{2"source": {3"type": "sepa",4"country": "FR",5"account_number": "FR7630006000011234567890189",6"currency": "EUR",7"mandate_id": "123456",8"mandate_type": "Core",9"date_of_signature": "2022-08-22",10"account_holder": {11"first_name": "Ali",12"last_name": "Farid",13"billing_address": {14"address_line1": "Rue Exemple",15"address_line2": "1",16"city": "Paris",17"zip": "75000",18"country": "FR"19}20}21},22"payment_type": "Regular",23"amount": 10000,24"currency": "EUR",25"processing_channel_id": "pc_xyz",26"success_url": "https://example.com/payments/success",27"failure_url": "https://example.com/payments/failure"28}
If you receive a 202 Accepted
response with the status Pending
, your request was successful.
1{2"id": "pay_ukzxtgobaoiu7l3gm2x6qxirru",3"status": "Pending",4"source": {5"id": "src_3ycibaogn7gexoo4p7i6jmitz4",6"type": "sepa"7},8"_links": {9"self": {10"href": "https://api.checkout.com/payments/pay_ukzxtgobaoiu7l3gm2x6qxirru"11}12}13}
Call the Request a payment endpoint to create a SEPA payment.
In the instrument_data.type
field, specify the mandate you want to use:
Core
B2B
post
https://api.checkout.com/payments
- To request a payment against a one-off mandate, set
payment_type
toRegular
. - To request a payment against a recurring mandate, set
payment_type
toRecurring
.
1{2"payment_type": "Recurring",3"source": {4"type": "id",5"id": "src_wmlfc3zyhqzehihu7giusaaawu"6},7"amount": 10000,8"currency": "EUR",9"processing_channel_id": "pc_xyz",10"success_url": "https://example.com/payments/success",11"failure_url": "https://example.com/payments/failure"12}
If you receive a 202 Accepted
response with a status field set to Pending
, your request was successful.
1{2"id": "pay_ukzxtgobaoiu7l3gm2x6qxirru",3"status": "Pending",4"source": {5"id": "src_wmlfc3zyhqzehihu7giusaaawu",6"type": "sepa"7},8"processing": {9"partner_payment_id": "GA3OX32ASX3E5A7"10},11"_links": {12"self": {13"href": "https://api.checkout.com/payments/pay_ukzxtgobaoiu7l3gm2x6qxirru"14}15}16}
You can retrieve details about an existing SEPA Direct Debit Core payment using the following endpoint.
For the full API specification, see the API reference.
get
https://api.checkout.com/payments/{id}
1{2"id": "pay_ukzxtgobaoiu7l3gm2x6qxirru",3"requested_on": "2023-03-24T07:43:12.9792854Z",4"source": {5"id": "src_wmlfc3zyhqzehihu7giusaaawu",6"type": "sepa"7},8"amount": 10000,9"currency": "EUR",10"payment_type": "Recurring",11"status": "Pending",12"processing": {13"partner_payment_id": "GA3OX32ASX3E5A7"14},15"_links": {16"self": {17"href": "https://api.checkout.com/payments/pay_ihrxjxcbjegeliqmdr72lby2aq"18},19"actions": {20"href": "https://api.checkout.com/payments/pay_ihrxjxcbjegeliqmdr72lby2aq/actions"21}22}23}
You can partially or fully refund a payment through the Dashboard or the Refund API if:
- It has been seven or more days since the original payment date.
- The payment status is
captured
.
When you request a refund, you receive a payment_refund_pending
webhook.
If the refund is successfully sent and approved by the SEPA Direct Debit network, you receive a payment_refunded
webhook. The payment status changes to refunded
or partially_refunded
.
Information
If you plan to issue a refund, you should communicate this to the customer to prevent them from simultaneously canceling the payment with their bank. If the customer is credited twice, contact them directly to resolve the situation.
If the refund is declined by the SEPA Direct Debit network or the customer's bank, you receive a payment_refund_declined
webhook.
Customers can reverse a payment made against an SEPA Direct Debit Core mandate up to eight weeks after the original payment date.
The customer may submit a claim with their bank to reverse the payment if:
- They want to revoke the direct debit authorization.
- They state that they did not provide authorization for the direct debit.
If a customer initiates a return, you receive a payment_returned
webhook.
You cannot challenge SEPA Direct Debit Core reversals initiated by the customer. The funds are always returned to the customer. If you dispute a reversal, contact your customer directly.
Information
You can initiate a reversal for a payment made against an SEPA Direct Debit Core mandate that has not been authorized up to 13 months after the original payment date.
To start testing, contact your account manager or implementation engineer to enable SEPA Direct Debit payments in the sandbox environment.
To perform a test payment, you must generate a valid IBAN using an online IBAN generator.
post
https://api.sandbox.checkout.com/payments
1{2"source": {3"type": "sepa",4"country": "FR",5"account_number": "FR7630006000011234567890189",6"currency": "EUR",7"mandate_id": "123456",8"date_of_signature": "2023-04-21",9"account_holder": {10"first_name": "Ali",11"last_name": "Farid",12"billing_address": {13"address_line1": "Rue Exemple",14"address_line2": "1",15"city": "Paris",16"zip": "75000",17"country": "FR"18}19}20},21"reference": "Test Reference",22"payment_type": "Regular",23"amount":1000,24"currency": "EUR",25"processing_channel_id": "pc_xyz",26"success_url": "https://example.com/payments/success",27"failure_url": "https://example.com/payments/failure",28"description": "Test description",29"billing_descriptor": {30"name": "Test billing descriptor",31"city": "Paris",32"reference": "Test billing descriptor reference"33}34}
1{2"id": "pay_d7mgufw7cjuebp6hs25j27onom",3"status": "Pending",4"reference": "Test Regular Payment SEPA 23.06.2023",5"source": {6"id": "src_tko5xm22x7aetihg6befv5p7me",7"type": "sepa"8},9"_links": {10"self": {11"href": "https://api.sandbox.checkout.com/payments/pay_d7mgufw7cjuebp6hs25j27onom"12},13"succeed": {14"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Accepted"15},16"decline": {17"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Rejected"18}19}20}
To perform a test payment with a payment instrument, you must first create the test instrument using the following endpoint:
post
https://api.sandbox.checkout.com/instruments
In your request, use your client ID as the merchant_identifier
value.
1{2"type": "sepa",3"instrument_data": {4"country": "FR",5"account_number": "FR7630006000011234567890189",6"currency": "EUR",7"payment_type": "Regular"8},9"account_holder": {10"first_name": "Ali",11"last_name": "Farid",12"billing_address": {13"address_line1": "Rue Exemple",14"address_line2": "1",15"city": "Paris",16"zip": "7500",17"country": "FR"18}19},20"merchant_identifier": "cli_xyz"21}
1{2"type": "sepa",3"id": "src_bvql42klnjve7nrcgix66lconq",4"fingerprint": "kbzfhm3mxiuedjgi6ceb2tdcuy"5}
To perform a test payment with the payment instrument, in your payment request:
- Set
source.type
toid
. - Set
source.id
to theid
value returned in theCreate a payment instrument
response.
//REVIEW: Finalization statuses ?
Payments automatically move through different states during processing. For example, the status may change from approved
to refunded
. When testing payment flows, you can manually change the status of a test payment to simulate different scenarios.
To change a test payment status:
- Create a test payment as shown in the Perform a test payment section.
- You receive a response with the following
_links
object:
1{2"_links": {3"succeed": {4"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Accepted"5},6"decline": {7"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Rejected"8}9}10}
- Accept the payment by sending a
PUT
request to the_links.succeed.href
URL. - After accepting the payment, you receive a response with the following
_links
object: Payments automatically move through different states during processing. For example, the status may change fromapproved
torefunded
. When testing payment flows, you can manually change the status of a test payment to simulate different scenarios.
To change a test payment status:
- Create a test payment as shown in the Perform a test payment section.
- You receive a response with the following
_links
object:
1{2"_links": {3"succeed": {4"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Accepted"5},6"decline": {7"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_d7mgufw7cjuebp6hs25j27onom/finalize/Rejected"8}9}10}
- Accept the payment by sending a
PUT
request to the_links.succeed.href
URL. - After accepting the payment, you receive a response with the following
_links
object:
1{2"_links": {3"reject": {4"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_pprqxl2py3kuxiu5qhtjk6exxe/finalize/Rejected"5},6"return": {7"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_pprqxl2py3kuxiu5qhtjk6exxe/finalize/Returned"8},9"chargeback": {10"href": "https://api.sandbox.checkout.com/apms/sepa/payments/pay_pprqxl2py3kuxiu5qhtjk6exxe/finalize/Refunded"11},12"refund": {13"href": "https://api.sandbox.checkout.com/payments/pay_pprqxl2py3kuxiu5qhtjk6exxe/refunds"14},15"actions": {16"href": "https://api.sandbox.checkout.com/payments/pay_pprqxl2py3kuxiu5qhtjk6exxe/actions"17}18}19}
- To simulate a specific action, use the corresponding URL provided in the
_links
object. For example:- To return a payment, send a
PUT
request to the URL specified in_links.return.href
. - To view all previous statuses of the payment, use the
_links.actions.href
endpoint.
- To return a payment, send a
You can also view a list of these actions by calling the Get payment details endpoint, setting the {id}
query parameter to the payment_id
received in the test payment response.
The SEPA Direct Debit network blocks refunds until seven days after the original payment was created.
To bypass this restriction in the sandbox environment, use 4815162342
as your mandate ID when you request your test payment or create your test payment instrument.
After you perform the test refund you can finalize and capture it by calling the following endpoint:
put
https://api.sandbox.checkout.com/apms/sepa/{paymentId}/refunds/{refundId}/finalize/accepted
Alternatively, to decline the test refund, call the following endpoint:
put
https://api.sandbox.checkout.com/apms/sepa/{paymentId}/refunds/{refundId}/finalize/rejected