SEPA Direct Debit Core
Beta
Last updated: October 9, 2024
SEPA Direct Debit (SDD) is a direct debit system that enables you to collect payments from accounts in countries within the Single Euro Payments Area (SEPA).
SDD Core is a scheme designed specifically for consumers. It can be used for one-off transactions and recurring payments.
As part of the scheme, participating banks must charge the same fees for cross-border SDD core payments as they do for direct debit payments processed within their own country.
Information
To enable SDD Core payments on your account, contact your Account Manager or [email protected].
There are four steps to process an SDD Core payment with Checkout.com:
- Set up the mandate with your customer to obtain consent. If you have an existing mandate ID, you can skip this step.
- Send the customer a pre-notification notifying them of your intent to charge their account.
- Create a SEPA payment source, if you want to store the mandate for use in a recurring payment series.
- Request the payment.
Model | Collecting |
---|---|
Payment flow | Direct debit |
Payment method type | Online banking |
Authorization | |
Auto capture | |
Manual capture | |
Refund | |
Partial refund | |
Return/rejection | |
Chargeback | |
Recurring payment |
To comply with SDD and European Payment Council (EPC) requirements, you must set up a mandate to obtain consent from your customer before you can collect payments from them via SDD Core.
The mandate you present to the customer should:
- clearly set out the terms of the authorization
- explicitly state that you are obtaining consent to debit the customer's bank account for a specific transaction, or set of recurring transactions
- explain how the customer can revoke their direct debit authorization
- be displayed on the same page where the customer is prompted for their bank details
- inform the customer that by submitting their bank details, they are agreeing to the terms of the mandate
Information
The EPC requires mandates to include specific legal wording and mandatory information. For more information, refer to the EPC mandate guidelines. For additional guidance, contact your Account Manager or [email protected].
If you set up a mandate for a one-off transaction, you can only make one payment against the authorized mandate.
If the mandate is for a fixed or variable recurring transaction, you can make multiple payments against the mandate.
Information
If you have an existing mandate that you’d like to migrate to Checkout.com, contact your Account Manager.
A SEPA Creditor ID is a unique identifier for a company requesting an SDD Core payment, which helps customers identify debits on their account.
SDD Core payments processed by Checkout.com will be collected using the Checkout.com Creditor ID.
You must display the Checkout.com Creditor ID in the mandate authorization form you provide to the customer.
Information
If you already have a mandate ID and want to store it for use in a recurring payment series, you can skip to the create a SEPA source step.
If you already have a mandate ID and only want to perform a one-off payment, you can skip to the Request a payment step.
If you do not have a mandate ID, you can create one via the API. To do this, create an instrument with the mandate details.
post
https://api.checkout.com/instruments
1{2"type": "sepa",3"instrument_data": {4"account_number": "FR7630006000011234567890189",5"currency": "EUR",6"country": "FR",7"payment_type": "Recurring"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": "75000",17"country": "FR"18},19"phone": {20"country_code": "33",21"number": "123456789"22}23}24}
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, use the
get
/instruments/{id}
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 an SDD Core payment.
To comply with SDD requirements, you must send the customer a pre-notification before any funds are debited from their account. The pre-notification should contain the following information:
- for a one-off mandate, the date the payment will be debited from their account
- for a recurring mandate, the recurring date the payment will be debited from their account
- the payment amount
- the mandate ID
- the creditor ID
- your contact details
You must send the pre-notification within the notice period specified in the mandate you set up with the customer, no more than 14 days before the payment due date.
Information
As a guideline, we recommend that you send the pre-notification three working days before the payment due date.
You can send the pre-notification via any of the following methods:
- phone
- SMS
- invoice
- letter
If you want to store the mandate for use in a recurring payment series, you can create a SEPA payment source.
You can create the SEPA payment source:
- before you perform your first payment request, using the
/instruments
endpoint - at the same time you perform your first payment request, using the
/payments
endpoint
You can use the
post
/instruments
endpoint to store the mandate data.You’ll receive an instrument ID which you can reuse as the source
in future payment requests.
post
https://api.checkout.com/instruments
1{2"type": "sepa",3"instrument_data": {4"account_number": "FR7630006000011234567890189",5"currency": "EUR",6"country": "FR",7"mandate_id": "123456",8"payment_type": "regular",9"date_of_signature": "2022-08-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}
You can use the
post
/payments
endpoint to create a SEPA payment source at the same time you perform your first payment request.The request’s required payment_type
field specifies both the type of payment and the type of mandate (regular or recurring). For more information on all required and optional fields, refer to the API reference.
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"date_of_signature": "2022-08-22",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"payment_type": "Regular",22"amount": 10000,23"currency": "EUR",24"processing_channel_id": "pc_xyz",25"success_url": "https://example.com/payments/success",26"failure_url": "https://example.com/payments/failure"27}
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_3ycibaogn7gexoo4p7i6jmitz4",6"type": "sepa"7},8"_links": {9"self": {10"href": "https://api.checkout.com/payments/pay_ukzxtgobaoiu7l3gm2x6qxirru"11}12}13}
Use the payments API to request an SDD Core payment.
To request a payment against a one-off mandate, set payment_type
to Regular
. To request a payment against a recurring mandate, set payment_type
to Recurring
. For more information on all required and optional fields, refer to the API reference.
post
https://api.checkout.com/payments
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 SDD Core payment with 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’ll receive a payment_refund_pending
webhook.
If the refund is successfully sent and approved by the SDD network, you’ll receive a payment_refunded
webhook. The payment status will also be updated 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 SDD network or the customer’s bank, you'll receive a payment_refund_declined
webhook.
Customers have the ability to reverse a payment made against an SDD 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’ll receive a payment_returned
webhook notification.
SDD Core reversals initiated by the customer cannot be challenged. The funds will always be returned to the customer. If you have issues with a reversal, contact your customer directly.
Information
You can initiate a reversal for a payment made against an SDD Core mandate that has not been authorized up to 13 months after the original payment date.
During an SDD Core payment's lifecycle, you may receive the following webhooks:
Webhook | Description |
---|---|
| The bank accepted the payment request. |
| The bank declined the payment request due to a technical or fraud-related issue. |
| There was a failure after an initial success scenario. Money will be moved out the merchant's account. There are three types of returns:
|
| The bank successfully received confirmation from the SEPA network and the funds have been transferred. |
| The bank successfully received confirmation from the SEPA network and the funds have been transferred. |
| The bank declined the payment request due to a technical or fraud-related issue. |
The following table lists the response codes you may receive when you process SDD Core payments:
Response code | Description |
---|---|
| Invalid account number. |
| Customer dispute. |
| Insufficient funds. |
| Direct debit forbidden on this account for regulatory reasons. |
| Payment transaction code incorrect, or sequence error. |
| Creditor Identifier incorrect. |
| Creditor Bank is not registered under this BIC in the CSM. |
| No valid mandate or unauthorized transaction. |
| Disputed authorized transaction. |
| The debtor refuses this particular collection. This code may be received pre- or post-settlement, depending on how quickly the debtor bank responds to the refusal. |
| Not Specified Reason Agent Generated. |
| Bank Identifier incorrect. |
| Specification of Debtor name or address required for regulatory requirements is insufficient or missing. |
| Creditor name or address required for regulatory requirements is insufficient or missing. |
| Regulatory Reason. |
| The request clashes with specific instructions your customer has added to their account. For example, they may have added the creditor to a blocklist, or not explicitly added them to an allowlist. |
| Duplicate entry. |
| Account closed. |
| Account frozen. |
| Rejected. |
| Returned. |
To start testing, contact your Account Manager or Implementation Engineer to enable SDD Core 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 thepost
Create a payment instrument
response
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 SDD Core 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