Skip to content

SEPA Direct Debit

blank

SEPA Direct Debit (SEPA DD) is a payment method that enables merchants to collect euro-denominated payments directly from a customer’s bank account within the Single Euro Payments Area (SEPA)

It is based on a mandate, where the customer (Debtor) authorizes the merchant (Creditor) to initiate collections. Both the Debtor and the Creditor must hold accounts within the SEPA zone.

SEPA Direct Debit supports two schemes:

  • CORE – for consumers
  • B2B – for business-to-business transactions
Payment Method Overview
Payment MethodCategoryCountriesCurrenciesFeaturesIntegrations
SEPA DD (via Tink)Bank DebitEurope (SEPA)EURTink – based Open Banking, Recurring paymentsPayment Form
SEPA DD (via iDEAL)Bank DebitNetherlandsEURiDEAL – based authenticationPayment Form, API
Info

Note – Providers

SEPA Direct Debit supports different authentication providers:

  • • Tink (Open Banking flow)
  • iDEAL (bank redirection flow)

These providers affect authentication only, not the SEPA lifecycle itself.

FeatureSEPA DD via TinkSEPA DD via iDEAL
Geographic scopeSEPA countriesNetherlands only
Mandate typeCORE / B2BCORE only
Customer countryFlexibleMust be NL
Billing addressRecommendedMandatory (Dutch context)
Integration typePayment FormPayment Form + API

Choose Your Integration Mode

Before starting the integration, the merchant must first select the integration approach.

This selection is defined outside the SEPA DD specification and is covered in the dedicated integration documentation.

Please refer to:

Integration ModelDescription
Hosted Payment FormSIBS manages UI and payment execution flow
Server-to-Server APISIBS manages UI and payment execution flow

This choice is not part of the API request. It defines how the Checkout response will be consumed.

How it Works

The integration is always initiated via the Checkout API, which creates a payment session and returns the data required to continue the flow.

From that point onward, the execution depends on the integration model selected during onboarding (Payment Form or API S2S).

Integration Flow
  1. Create Payment Session (Checkout API)
  2. Execute Payment
  3. Track Mandate Status (Status API)
  4. Monitor Collection Status
  5. Optional: Webhooks for asynchronous updates
Step 1 – Create Payment Session

This is the main entry point for SEPA DD transactions, regardless of provider (Tink or iDEAL).

This step creates a payment session and defines:

  • merchant configuration
  • customer identity
  • transaction details
  • mandate configuration
Info

Important – SEPA Direct Debit Amount Handling

SEPA Direct Debit does not execute an immediate financial charge during checkout.
For standard Tink-based SEPA DD flows:

  • transaction.amount.value = 0

 

Exception – iDEAL-based SEPA DD:

  • When using [“SPDD”,”IDEL”], the transaction amount must be greater than 0
  • iDEAL does not support zero-value transactions
  • Minimum supported value: 0.01 EUR
    transaction.amount.value => 0

 

The actual debit collection occurs after the mandate authorisation lifecycle.

Endpoint
EnvironmentURLMethod & Endpoint
PRODapi.sibsgateway.comPOST api/version-id/payments
TESTstargate.qly.site[1|2].sibs.ptPOST api/version-id/payments
Request Headers
FieldTypeDescription
Content-TypeStringapplication/json
AuthorizationStringBearer token
x-ibm-client-idStringClient identifier (onboarding provided)
Core Request Structure

The Checkout request is composed of 4 mandatory blocks:

  • merchant
  • customer
  • transaction
  • mandate
1.1 Merchant Object (Mandatory)

Defines the merchant context executing the transaction.

FieldTypeConditionDescriptionExample
merchant.terminalIdString (max 10 numeric)MandatoryMerchant terminal47215
merchant.channelstringMandatorySales channelWEB
merchant.transactionIdstring (max 1000)MandatoryUnique reference987635435
merchant.transactionDescriptionString (max 4000)OptionalContextorder #123
1.2 Transaction Object (Mandatory)

This is the critical block for payment execution configuration.

Key fields:

FieldTypeConditionDescriptionExample
transaction.transactionTimestampDateTimeMandatoryTimestamp ISO86012026-04-24T13:40:08Z
transaction.descriptionStringOptionalTransaction short description.purchase
transaction.motoBooleanOptionalIndicates if is a Mail Order Telephone Order.false
transaction.paymentTypeStringOptionalType of payment used by the client.
Possible values are:
“PURS” – Purchase,
“AUTH” – Authorisation,
“CAPT” – Capture,
“CAUT” – Authorisation Cancellation,
“RFND” – Refund,
“RVSL” – Reversal,
“STIQ” – Status Inquiry.
AUTH
transaction.amount.valueNumberMandatoryTransaction amount.
For standard SEPA Direct Debit flows, this value must be set to 0.
Exception:
When using [“SPDD”, “iDEAL”], the amount must be greater than 0, as iDEAL does not support zero-value transactions.
0
transaction.amount.currencyStringMandatoryCurrency used in the transaction.EUR
transaction.paymentMethodArrayMandatoryDetermines how the SEPA Direct Debit flow is executed. [“SPDD”] triggers a SEPA DD flow using Tink for bank authentication. [“SPDD”,”IDEL”] adds iDEAL to the authentication journey, enforcing a CORE mandate and NL-based customer data.[“SPDD”]
Payment Method Behavior (CRITICAL DECISION POINT)
Tink Flow

If:

</> JSON
"paymentMethod": ["SPDD"]

This configuration enables a SEPA Direct Debit flow where bank authentication is performed through Tink (Open Banking).

From an integration perspective:

  • The customer authenticates with their bank during checkout.
  • Bank account data is collected via provider flow.
  • Mandate creation is supported by authentication result.

Integrator responsibilities:

  • Provide complete customer data.
  • Ensure mandate object is correctly defined.
  • Continue flow using Checkout response data.
iDEAL Flow

If:

</> JSON 
"paymentMethod": ["SPDD", "IDEL"]

This configuration introduces iDEAL as the authentication rail within the SEPA DD flow.

From an integration perspective:
  • The customer proceeds through the provider authentication journey.
  • Identity validation occurs within provider journey.
  • Mandate is still created as part of SEPA DD lifecycle.

Integrator responsibilities:

  • Ensure mandate.serviceType = CORE
  • Provide customer data aligned with NL context.
  • Enforce NL address constraints.

This configuration is intended for Netherlands-based payment flows where iDEAL is part of the checkout experience.

1.3 Customer Object (Mandatory)

Defines the customer identity and addresses required for risk validation and payment execution.

Key fields:

FieldTypeConditionDescriptionExample
customer.customerInfo.customerNameStringMandatoryCustomer name.Test Name
customer.customerInfo.customerEmailStringMandatoryCustomer E-mailemail@provider.com
customer.customerInfo.customerLanguageStringConditionalCustomer language. ISO 639-1 Format.
Must be fulfilled if intended Payment Method (Request Body.transaction.paymentMethod) to proceed payment is one of:
“IDEL” – “iDEAL”;
NL
customer.customerInfo.customerPhoneStringConditionalPhone number of the customer formatted in the International E.164 standard, starting with plus (+) symbol.
E. 164 numbers can have a maximum of fifteen digits and are usually written as follows: [+][country code][subscriber number including area code]
Must be fulfilled if intended Payment Method (Request Body.transaction.paymentMethod) to proceed payment is “BNPL” or “MBWAY”.
+351919191919
Warning

Note: Address validation may be required depending on provider configuration and risk rules.

Billing Address (Mandatory)
FieldTypeConditionDescriptionExample
customer.customerInfo.billingAddress.street1String (Max70Text)MandatoryFirst line of the billing address (street name and number)“Damrak 1”
customer.customerInfo.billingAddress.street2String (Max70Text)MandatoryAdditional address information (e.g., apartment, floor)“Floor 2”
customer.customerInfo.billingAddress.cityString (Max35Text)Mandatory (iDEAL)City of the billing address“Amsterdam”
customer.customerInfo.billingAddress.postcodeString (Max16Text)Optional (Mandatory if available)Postal code“1012LG”
customer.customerInfo.billingAddress.countryString (ISO 3166-1 alpha-2)MandatoryCountry code“NL”
Warning

iDEAL Rule – Mandatory

For SEPA Direct Debit transactions using iDEAL:

  • billingAddress.country must always be “NL”
  • Billing address must correspond to a Dutch address
  • This is required for mandate validation within the iDEAL authentication flow

Shipping Address (Optional)

Used only for in-person deliveries.

FieldsTypeConditionDescriptionExample
customer.customerInfo.shippingAddress.street1String (Max70Text)MandatoryFirst line of the shipping address“Herengracht 10”
customer.customerInfo.shippingAddress.street2String (Max70Text)MandatoryAdditional shipping address information“Unit 5A”
customer.customerInfo.shippingAddress.cityString (Max35Text)Mandatory (iDEAL)City of the shipping address“Amsterdam”
customer.customerInfo.shippingAddress.postcodeString (Max16Text)Optional (Mandatory if available)Postal code“1015BK”
customer.customerInfo.shippingAddress.countryString (ISO 3166-1 alpha-2)MandatoryCountry code“NL”
Warning

iDEAL Rule – Mandatory

For SEPA Direct Debit transactions using iDEAL:

  • The customer.customerInfo.shippingAddress.country must always be set to “NL”
  • The shipping address must correspond to a Dutch address

1.4 mandate – Object (Mandatory)
mandatemandateConditionalMandate details information
Remark: only to be filled when Merchant wants to offer SEPA DD as payment method
mandate.mandateIdString (Max35Text)MandatoryIdentification of the Direct Debit mandate resource.
It refers to Debit Authorisation Number.
mandateID
mandate.mandateDescriptionString (Max256Text)MandatoryDescription of the Direct Debit mandate resource’s context.mandateDescription
mandate.frequencyString (Exact4Text)MandatoryRegularity with which instructions are to be created and processed.
“OOFF” – “One-Off” (Direct debit instruction where the debtor’s authorisation is used to initiate one single direct debit transaction)
“RCUR” – “Recurring” (Direct debit instruction where the debtor’s authorisation is used for regular direct debit transactions initiated by the creditor)
‘OOFF’
mandate.serviceTypeString (Exact4Text)MandatoryIdentification of the SEPA Direct Debits service related to the specific Direct Debit Mandate.
It can be fulfilled with the following values:
“CORE” when it refers to SEPA DD CORE service;
“BTOB” when it refers to SEPA DD B2B service.
‘CORE’
Warning

Mandate rule:

  • This object is required only for SEPA DD flows
  • It defines the legal authorization for debit execution

Request Example – Tink-based SEPA DD
</>JSON
{ 
  "merchant": {
    "terminalId": "1000536",
    "channel": "web",
    "merchantTransactionId": "trx123",
    "transactionDescription": "order 123"
  },
  "transaction": {
    "transactionTimestamp": "2026-04-24T13:41:08Z",
    "paymentType": "AUTH",
    "amount": {
      "value": 0,
      "currency": "EUR"
    },
    "paymentMethod": ["SPDD"]
  },
  "customer": {
    "customerInfo": {
      "customerName": "Test Name",
      "customerEmail": "email@provider.com"
    }
  },
"mandate": {
        "mandateId": "mandateID",
        "mandateDescription": "mandateDescription",
        "frequency": "OOFF",
        "serviceType": "CORE"  }
}
Request Example – iDEAL-based SEPA DD
</>JSON
{
  "transaction": {
    "amount": {
      "value": 0.01,
      "currency": "EUR"
    },
    "paymentMethod": ["SPDD","IDEL"]
  }
}
Response – Checkout API

Once the Checkout request is successfully processed, the API returns a response that represents the payment session created.

This response is essential to:

  • identify the transaction
  • proceed with payment execution
  • track the payment lifecycle
FieldTypeConditionDescriptionExample
transactionIDString (Max36Text)AlwaysUnique identifier of the transaction. Must be stored for tracking and status queriesTECByGFuB7yaFta19hua
transactionSignatureStringAlwaysSecurity signature associated with the transactioneyJ0eElkIjoiVEVD…
amount.valueNumber (double)AlwaysTransaction amount.
⚠️ Represents the transaction amount.
For SEPA Direct Debit, this value corresponds to the actual transaction amount.
0.01
amount.currencyString (Currency Code –
ISO 4217 Alpha-3 Code).
AlwaysCurrency of the transactionEUR
paymentMethodListArrayAlwaysList of payment methods available for execution[“IDEL”,”SPDD”]
formContextStringConditional (Payment Form)Encoded data required to initialise the hosted payment execution experienceeyJQYXltZW50TWV0aG9kIj…
mandate.mandateIdString (Max35Text)Conditional (SEPA DD)Unique identifier of the generated SEPA mandatev8t58W2RpGDaDbESMrnMhYGZdixsHUDZUkC
mandate.mandateDescriptionString (Max254Text)MandatoryDescription of the Direct Debit mandate resource’s context.“short information”
mandate.frequencyString (Exact4Text)Conditional (SEPA DD)Mandate frequency (OOFF or RCUR)OOFF
mandate.serviceTypeString (Exact4Text)Conditional (SEPA DD)SEPA scheme used (CORE or B2B)CORE
returnStatus.statusCodeStringAlwaysOperation status code (“000” means success)000
returnStatus.statusMsgStringAlwaysShort status messageSuccess
serviceTypeStringAlwaysDetailed status descriptionSuccess
Warning

Important Note

Unlike the request, in the response, amount.value represents the actual transaction amount.

Example Response
</> JSON
{
  "transactionID": "TECByGFuB7yaFta19hua",
  "transactionSignature": "eyJ0eElkIjoiVEVD...",
  "amount": {
    "value": 0.01,
    "currency": "EUR"
  },
  "paymentMethodList": ["IDEL", "SPDD"],
  "returnStatus": {
    "statusCode": "000",
    "statusMsg": "Success",
    "statusDescription": "Success"
  }
}
How to Use the Response

After receiving a successful response:

  • Store the transactionID as your main reference
  • Use the returned data to proceed with payment execution
  • Prepare your system to handle asynchronous updates (status or webhooks)

If you are using a hosted integration model, the response includes the necessary data to initialize the payment execution step

Step 2 – Payment Execution
What happens in practice
  • The previously created payment session is used to continue the checkout flow
  • The customer proceeds through the provider authentication journey (Tink or iDEAL)
  • Mandate authorisation and required banking data collection occur within the provider journey.
Integration perspective

From an integration standpoint:

  • No additional API call is required at this stage
  • No manual intervention or processing is expected from the integrator
  • The entire execution flow is handled by the payment session context returned in Step 1.
Step 3 – Payment Status

After the payment execution flow (Step 2), the SEPA Direct Debit mandate continues asynchronously until the mandate reaches its final lifecycle state.

The merchant can monitor the mandate lifecycle using the Checkout Status API.

How to retrieve the status
Endpoint
EnvironmentURLMethod & Endpoint
PRODapi.sibsgateway.comGET /version-id/payments/{transactionId}/status
TESTstargate.qly.site[1|2].sibs.ptGET version-id/payments/status
Request Parameters
TypeFieldFormatConditionDescription
PATHtransactionIdStringConditionalUnique identifier of the transaction
QUERYmerchantTransactionIdString (Max1000)ConditionalMerchant reference used to retrieve status
What you should monitor
FieldTypeConditionDescription
Content-TypeStringMandatoryapplication/json
AuthorizationStringMandatoryBearer token
x-ibm-client-idStringMandatoryClient identifier provided during onboarding
What you should monitor

Field: mandate.mandateStatus

This field represents the lifecycle of the SEPA Direct Debit mandate.

Status values
StatusMeaning
INTTInitiated
PDNGPending
ACTV*Active
RJCTRejected
RFSDRefused
CNCLCancelled

*ACTV represents a successfully activated mandate.

Integration recommendation

You should:

  • Store the transactionId returned in Step 1
  • Periodically call the Checkout Status API
  • Optionally implement webhooks for asynchronous notifications
Step 4 – Additional Information: Collection Status

Collection status monitoring is only applicable when debit collections are initiated against an existing SEPA mandate.

Once a SEPA Direct Debit mandate becomes active, debit collections may be initiated according to the merchant business model.

Collection execution is asynchronous and may expose additional status information through the Checkout Status API.

Collection lifecycle monitoring

The Checkout Status response provides two complementary status fields for SEPA Direct Debit collections.

FieldPurpose
paymentStatusFinal transaction outcome
mandate.mandateCollection.statusDetailed SEPA Direct Debit collection lifecycle
4.1. paymentStatus

Field: paymentStatus

This field represents the consolidated transaction result from the merchant perspective.

Possible values include:

StatusMeaning
PENDINGTransaction still being processed
INPROCESSINGCollection execution in progress
SUCCESSCollection successfully processed
DECLINEDCollection failed or rejected
ERRORTechnical error

This is the primary field that should be used to determine the final transaction outcome.

4.2. mandate.mandateCollction.status

Field: mandate.mandateCollction.status

This field provides additional operational detail regarding the SEPA Direct Debit collection lifecycle.

Collection Status Values
StatusMeaning
CRTDCollection created
PDNGPending processing
ACSP*Accepted Settlement In Process(FINAL STATUS)
RJCTRejected
RVSLReversed

*ACSP represents the successful completion of the SEPA Direct Debit collection process and should be treated as the final successful status.

Notification

Important

Collection status refers to the debit execution lifecycle and is independent from the mandate lifecycle described in Step 3.

Integration recommendation

From an integration perspective:

  • Store the transactionId returned during Checkout creation
  • Monitor transaction updates through the Checkout Status API
  • Treat SEPA Direct Debit flows as asynchronous
  • Optionally implement webhooks for automated status notifications
Step 5 – Webhooks

SEPA Direct Debit transactions are asynchronous by nature.

Instead of periodically calling the Checkout Status API, merchants may optionally implement webhooks to receive automatic transaction updates.

Webhook notifications can be used to:

  • monitor transaction lifecycle changes
  • receive payment status updates
  • track SEPA Direct Debit collection evolution
Warning

Webhooks are optional but recommended for production environments with asynchronous payment monitoring requirements.

For webhook integration details, payload structure and event configuration, please refer to the Webhooks Integration.

Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.

Strictly Necessary Cookies

Strictly Necessary Cookie should be enabled at all times so that we can save your preferences for cookie settings.