The SEPA Direct Debit API allows you to initiate EUR-denominated collections directly from your customer's bank account in the Netherlands by submitting debit instructions in JSON format, from which an ISO 20022 pain.008 file is generated and sent to the debtor's bank under a valid mandate.
For requests to the SEPA Direct Debit API, you need an access token with
scopeset topaymentinitiationcorporate.
This API is in beta and access is currently restricted as part of ongoing testing. The specification and behavior described here is subject to change in the future.
1. Create Consent
The first step is to create and authorise a consent by including an X-Consent-Type header set to sepaDirectDebit. The resulting consent is long-lived, granting you access to initiate SEPA Direct Debit collections on behalf of the PSU without requiring repeated re-authentication (until revoked by the PSU, or until it expires due to regulatory or account-related conditions).
2. Create Payment
Then, submit the SEPA Direct Debit instructions, including debtor details and mandate information, to create a pending collection.
Endpoint
Code
Request Headers
| Name | Type | Description |
|---|---|---|
| X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
| X-BicFi | string | The BIC of the bank to which the request is addressed. |
| PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
| PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
| PSU-IP-Address | string(ipv4) | The IP address of the PSU from the HTTP request between the PSU and the TPP. |
| PSU-User-Agent | string | The Agent header of the PSU from the HTTP request between the PSU and the TPP. |
Request Body
| Name | Type | Description |
|---|---|---|
| instructedAmount | object | The amount and currency of the money to be transferred. |
| creditorAccount | object | The account to which the payment will be credited. |
| creditorName | string | The full name of the payment recipient. |
| creditorId | string | The ID assigned to the creditor authorising them to initiate SEPA Direct Debit collections. |
| creditorAddress | object | The address of the payment recipient. |
| creditorAgent | string | The BIC of the payment recipient's bank. |
| creditorAgentName | string | The name of the payment recipient's bank. |
| debtorAccount | object | The account from which the payment will be debited. |
| debtorName | string | The full name of the payer. |
| debtorAgent | string | The BIC of the payer's bank. |
| debtorAgentName | string | he name of the payer's bank. |
| debtorAddress | string | The address of the payer. |
| localInstrumentCode | string(enum) | The local instrument code. Only CORE is currently supported. |
| sequenceType | string(enum) | The sequeence type for the SEPA Direct Debit collection. |
| mandateRelatedInformation | object | The mandate information that authorises the SEPA Direct Debit collection. |
| requestedExecutionDate | string(date) | The date when the payment is scheduled to be executed in ISO 8601 format, e.g. 2025-10-31. |
| remittanceInformationUnstructuredArray | array | A free-text field for remittance information on the payment. |
Code
Response
Code
3. Confirm Payment
Once the SEPA Direct Debit payment is created, confirm the collection to generate and upload a pain.008 file to the debtor's bank. The bank processes the request and debits the debtor's account on the request execution date, subject to mandate validation and scheme rules.
Endpoint
Code
Request Headers
| Name | Type | Description |
|---|---|---|
| X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
| Consent-ID | string(uuid) | The ID of the related SEPA Direct Debit consent. |
| X-BicFi | string | The BIC of the bank to which the request is addressed. |
| PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
| PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
| PSU-IP-Address | string(ipv4) | The IP address of the PSU from the HTTP request between the PSU and the TPP. |
| PSU-User-Agent | string | The Agent header of the PSU from the HTTP request between the PSU and the TPP. |
Request Body
| Name | Type | Description |
|---|---|---|
| paymentIds | array | The IDs of the payments to include in the confirmation. |
Code
Response
Code
4. Get Payment
Lastly, make the following request to check the status of the SEPA Direct Debit payment.
Endpoint
Code
Path Parameters
| Name | Type | Description |
|---|---|---|
| paymentId | string | The ID of the payment that was created. |
Request Headers
| Name | Type | Description |
|---|---|---|
| X-Request-ID | string(uuid) | The ID of the request, unique to the call, as determined by the initiating party. |
| X-BicFi | string | The BIC of the bank to which the request is addressed. |
| PSU-ID | string | The ID used to identify the PSU at the bank. Typically a local social security number or another unique login ID. |
| PSU-Corporate-ID | string | The Corporate ID of the PSU when acting on behalf of an organization, e.g. Org. nummer for SE, KVK for NL. |
| PSU-IP-Address | string(ipv4) | The IP address of the PSU from the HTTP request between the PSU and the TPP. |
| PSU-User-Agent | string | The Agent header of the PSU from the HTTP request between the PSU and the TPP. |
Code
Response
Code
Payments can have a number of different statuses. Here, you want to check if the payment was rejected, in which case transactionStatus would have the value RJCT. If not, then you are done.

