SEPA Direct Debit
You can accept SEPA Direct Debit payments from customers in countries within the Single Euro Payments Area.
The SEPA initiative aims to facilitate seamless, quick, and cost-effective direct debits across 36 (as of March 2019) European countries. Banks participating in SEPA are not permitted to charge higher fees for cross-border SEPA Direct Debits than they would for direct debits within their home country.
To accept payments by SEPA Direct Debit, please contact your customer success manager.
Process a SEPA payment
First, you need to collect your customers' euro-denominated bank account details, including their IBAN. The bank account holder is then required to accept a mandate to authorize you to debit their account. Once the mandate is approved, submit the mandate details to Checkout.com and we'll provide you with a source object with which you can complete the payment.
The mandate
Before any payment can occur, your customer must authorize the payment by accepting the terms of the mandate. By accepting, they are authorizing you to collect the specified amount from their bank account using SEPA Direct Debit.
There are two types of mandates:
- One-off: allows a single payment to be made against the mandate. It can only be used once.
- Recurring: allows multiple payments to be made against the mandate. It can be reused.
The mandate is accepted using ‘click’ acceptance. This method requires that the mandate’s terms are set out on the same page as where the customer enters their bank account details. The mandate should make it clear that if the customer submits their bank account details to the merchant, they are implicitly agreeing to the mandate.
Once the mandate is approved, you can submit the customer’s information to us, and we'll return the mandate reference to you. You should then present the mandate reference to your customer as confirmation that the mandate has been created.
For details about the mandate and more, please read the SEPA Direct Debit core rulebook.
Pre-notify the customer
Before debiting a customer's account with SEPA Direct Debits, it is mandatory that the customer is informed of the debit by the merchant in an agreed timeframe before the payment. We recommend you include details of this timeframe in your terms and conditions.
Notifications are sent to enable the customer to make sure they have the necessary funds available in their bank account and also to make them aware of the payment so they recognize it in their statement.
Funds will be removed from the customer’s account one or two days after the transaction is submitted. It is a SEPA requirement that you make sure your customers are aware of this.
For additional information about pre-notifications, please read the SEPA Direct Debit core rulebook.
Our SEPA provider uses one of two acquiring banks:
- A Lithuanian bank for high-risk merchants (industry dependent)
- A German bank for all other transactions
So if you operate in a high-risk industry, we recommend that in your communication to the customer you tell them that the transaction may appear on their statement as a debit to a bank account with a Lithuanian IBAN.
Request a SEPA Direct Debit payment
SEPA is supported through direct integration with our API. When a payment is initially processed, the status of the SEPA charge will be pending
. After the payment is settled, the status updates to captured
and we will notify you with payment_captured
webhook.
You can process a SEPA payment in two steps:
Step 1: Create a new SEPA payment source
Create a new SEPA payment source that can be used to make one or more payments. Creating a source will automatically create a new mandate as well. You'll receive the mandate reference
in the response, and you can use this if you ever need to cancel a mandate.
Payment sources are linked to a specific customer and cannot be shared between customers.
The request
SEPA Direct Debit payments are requested using a POST API request. Use the URLs below to run the request in either your live or sandbox environment.
Endpoint live
Endpoint sandbox
Header and required parameters
Header | Value |
---|---|
|
|
|
|
Body parameters
Field name | Description |
---|---|
type String Required | The type of payment. Set this to |
| A reference that you can later use to identify the source. |
| Additional data required to create SEPA payment sources. |
| The bank account holder's first name. |
| The bank account holder's last name. |
| The bank account's IBAN. |
| The bank account's BIC. In sandbox, this must be set toPBNKDEFFXXX . |
| The billing descriptor. |
| The type of mandate. Set to |
| The bank account owner's billing address. |
| Line 1 of the billing address. |
| Line 2 of the billing address. |
| The city. |
| The state. |
| The zip code. |
| The country — must be represented by an ISO2 country code (e.g. |
| The account holder's phone number. |
| The valid country code for the phone number (e.g. |
| The phone number itself. |
| Details of the customer to associate with the source. |
| The identifier of an existing customer. If neither customer |
| The customer's email address. |
| The customer's name. This will only set the name for new customers. |
Request examples
Below is an example of the body of a SEPA source request.
SEPA only supports a pre-defined list of IBANs for testing purposes. The example below shows a successful request.
{
"type": "sepa",
"reference": "X-080957-N34",
"source_data": {
"first_name": "Sophie",
"last_name": "Bonneville",
"account_iban": "DE25100100101234567893",
"bic":"PBNKDEFFXXX",
"billing_descriptor": "Thanks for shopping",
"mandate_type": "recurring"
},
"billing_address": {
"address_line1": "101 Avenue de Gaulle",
"city": "Paris",
"zip": "75013",
"country": "FR"
},
"phone": {
"country_code": "+33",
"number": "6 78 91 01 11"
},
"customer": {
"email": "[email protected]"
}
}
{
"type": "sepa",
"reference": "X-080957-N34",
"source_data": {
"first_name": "Sophie",
"last_name": "Bonneville",
"account_iban": "DE25100100101234567893",
"bic":"PBNKDEFFXXX",
"billing_descriptor": "Thanks for shopping!",
"mandate_type": "single"
},
"billing_address": {
"address_line1": "101 Avenue de Gaulle",
"city": "Paris",
"zip": "75013",
"country": "FR"
},
"phone": {
"country_code": "+33",
"number": "6 78 91 01 11"
},
"customer": {
"email": "[email protected]"
}
}
Please note:
The soft descriptor value will be prepended to the mandate reference when it appears on a customer's bank statement. For example,Thanks for shopping - Mandate: 1017424
.
The response
{
"id": "src_a3wfgafsyedefaobbqadqw34vy",
"type": "Sepa",
"response_code": "10000",
"response_data": {
"mandate_reference": "2476225"
},
"customer": {
"id": "cus_uhpsey6culvuln3zfzfme7w5ea"
},
"_links": {
"self": {
"href": "https://api.checkout.com/sources/src_a3wfgafsyedefaobbqadqw34vy"
},
"sepa:mandate-cancel": {
"href": "https://api.checkout.com/sepa-external/mandates/src_a3wfgafsyedefaobbqadqw34vy/cancel"
},
"sepa:mandate-get": {
"href": "https://api.checkout.com/sepa-external/mandates/src_a3wfgafsyedefaobbqadqw34vy"
}
}
}
Step 2: Request a SEPA payment
The request
Endpoint live
Endpoint sandbox
Header and required parameters
Header | Value |
---|---|
|
|
|
|
Request example
{
"source": {
"type": "id",
"id": "src_a3wfgafsyedefaobbqadqw34vy"
},
"amount": 5600,
"currency": "EUR",
"reference": "X-080957-N34"
}
Use the provided source ID in the payments endpoint to create a payment for a particular customer. For recurring payments, the source ID can be used multiple times.
The response
{
"id": "pay_6thh5vhggyjudgzfznx2fkuede",
"status": "Pending",
"reference": "X-080957-N34",
"customer": {
"id": "cus_uhpsey6culvuln3zfzfme7w5ea",
"email": "[email protected]"
},
"_links": {
"self": {
"href": "https://api.checkout.com/payments/pay_6thh5vhggyjudgzfznx2fkuede"
}
}
}
Cancel a SEPA mandate
If your customer requests to cancel a SEPA mandate, you can do so by using our cancel mandate endpoint. Once canceled, you will no longer be able to create payments using the mandate or its source object.
The request
Endpoint live
POSThttps://api.checkout.com/sepa/mandates/{source_id}/cancel
Endpoint sandbox
POSThttps://api.sandbox.checkout.com/sepa/mandates/{source_id}/cancel
Header and path parameters
Header | Value |
---|---|
|
|
|
|
Path | Value |
---|---|
| The source ID, find this in the response of the source creation. |
Mandates automatically expire after 36 months of inactivity.
Refund a SEPA payment
A captured SEPA charge can be refunded using our refund endpoint and the original payment ID (of the SEPA payment). Refunds must be claimed within eight weeks starting from the date on which the account was debited. Once the charge is refunded, its payment status updates to refunded
, and we will notify you with a payment_refunded
webhook.
The request
Endpoint live
Endpoint sandbox
POSThttps://api.sandbox.checkout.com/payments/{payment_id}/refunds
Header and path parameters
Header | Value |
---|---|
|
|
|
|
Path | Value |
---|---|
| The payment ID found in the response of the initial payment. |
Request example
An example body of the refund API request. Make sure you edit the fields to represent your required needs.
{
"amount": 6540,
"reference": "ORD-5023-4E89",
}
The response
Response example
If you receive a success response, your refund was processed correctly.
{
"action_id": "act_y3oqhf46pyzuxjbcn2giaqnb44",
"reference": "ORD-5023-4E89",
"_links": {
"payment": {
"href": "https://api.checkout.com/payments/pay_y3oqhf46pyzuxjbcn2giaqnb44"
}
}
}
Refunds can take up to four days to be processed.
Retrieve a SEPA payment source
Use this request to get more information on a SEPA payment source, based on its id
.
The request
Replace {id}
with the source id
. It is prefixed by src
.
Endpoint live
Endpoint sandbox
The response
If a source response object returns, your request was successful.
Response example
Take a look at the example response below.
{
"id": "src_y3oqhf46pyzuxjbcn2giaqnb44",
"type": "sepa",
"_links": {
"self": {
"href": "https://api.checkout.com/sources/src_y3oqhf46pyzuxjbcn2giaqnb44"
},
"sepa:mandate": {
"href": "https://api.checkout.com/sepa/mandates/src_y3oqhf46pyzuxjbcn2giaqnb44"
}
}
}
Additional error responses:
404 - Payment source not found
SEPA chargebacks
Due to the asynchronous nature of SEPA Direct Debits, the reasons for a SEPA chargeback go beyond the traditional customer-initiated chargebacks, such as whether or not a customer has insufficient funds available. If a chargeback occurs, we will let you know through a payment_chargeback
webhook notification.
Chargebacks can be initiated up to 13 months after a payment was first processed. A customer can dispute a payment with their bank when they believe that they did not authorize the payment.
If you and your customer did not agree upon the mandate, then the SEPA chargeback cannot be represented. You must handle representing a SEPA chargeback directly with the customer.
Testing SEPA
To start testing, you'll need to:
- create a test account, and
- contact your customer success manager or integrations engineer to activate SEPA payments in the sandbox environment.
If you want to test the different use cases for SEPA payment results, please use the following test IBANs. These IBANs have a valid checksum and should be supplied when creating a new mandate.
IBAN | Description |
---|---|
DE09100100101234567890 | The customer's mandate and payment can't be set up because their bank details are invalid. Payment not accepted. |
| The customer's payment is accepted, but not collected yet. The mandate is marked as activated. The payment will remain on Status 1 (accepted). |
| The customer's payment is accepted, but then canceled before collection. The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 2 (canceled) |
| The customer's payment is collected successfully and paid out to you. The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 3 (paid). |
| The customer’s payment is provided to the bank successfully, but is then charged back due to a request by a merchant. The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 3 (paid). Finally, the payment is marked as Status 4 (charge-back) with Token (RFND). |
| The customer's payment is collected successfully, but is then charged back by the customer disputing it with their bank (actively initiated by the customer). The mandate is marked as activated. The payment is marked as status 1 (accepted), then status 3 (paid). Finally, the payment is marked as status 4 (chargeback) with token (ACT). |
| The customer's payment is provided to the bank successfully, but is then charged back by their bank due to no sufficient funds. The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 3 (paid). Finally, the payment is marked as Status 4 (chargeback) with Token (NSF). |
| The customer's payment is provided to the bank successfully, but is then charged back by the bank due to other reasons (no bank account, saving account). The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 3 (paid). Finally, the payment is marked as Status 4 (chargeback) with Token (OTHR). |
| The customer's payment is provided to the bank successfully, but is then charged back by the bank due to format errors. The mandate is marked as activated. The payment is marked as Status 1 (accepted), then Status 3 (paid). Finally, the payment is marked as Status 4 (chargeback) with Token (FRM). |
BIC in sandbox:
If you've chosen to use the optionalbic
field, you must set this toPBNKDEFFXXX
. This is the only accepted value.
Can we help?
Thanks for using Checkout.com. If you need any help or support, then message our support team at [email protected].
Updated 5 months ago