SDD Mandates API
- 1 1. Introduction
- 1.1 1.1. Preface
- 1.2 1.2. URLs
- 2 2. Prerequisites & important notes
- 3 3. SDD mandates API endpoints
- 4 4. Mandate sign up endpoint
- 4.1 4.1. Request
- 4.2 4.2. Response
- 5 5. Mandate ID endpoint
- 5.1 5.1. Request
- 5.2 5.2. Response
- 6 6. Mandate cancel endpoint
- 6.1 6.1. Request
- 6.2 6.2. Response
- 7 7. List of mandates endpoint
- 7.1 7.1. Request
- 7.2 7.2. Response
- 8 8. Mandate trigger endpoint
- 8.1 8.1. Request
- 8.2 8.2. Response
- 9 9. HTTP status codes
- 10 10. Mandate states
- 11 11. SIIN for SDD
- 12 Appendix: Mandate types
1. Introduction
1.1. Preface
SDD is a Europe-wide direct debit system that allows merchants to collect Euro-denominated payments from accounts in the 36 SEPA countries and associated territories. SDD has now been implemented in all Eurozone countries and non-Eurozone SEPA countries. In these countries, all Euro-denominated payments must be collected via the SEPA payment scheme.
What is an API?
An Application Programming Interface (API) is a way for two or more apps to communicate with each other. An API is a type of software interface offering a service to other pieces of software. APIs work by sharing data between apps, systems, and devices. This happens through a request and response cycle. A user initiates a request for data by interacting with an app. The request is sent to an API, which retrieves the data and then returns it to a user. A document that describes how to build or use such a connection or interface is called an API specification.
What is SEPA?
SEPA (Single Euro Payment Area) is a system of transactions that was created by the European Union. SEPA harmonises the way in which cashless payments are transacted between Euro countries. Types of SEPA transfers:
SEPA Credit Transfer (SCT) uses an IBAN (International Bank Account Number) and sometimes a BIC (Bank Identifier Code) to transfer money from one bank account to another. A beneficiary obtains the money within a business day after a payment has been received.
SEPA Instant is where money is transferred from one bank account to another in a matter of seconds and does not involve any intermediaries in the process. However, for this function to work, both the sending and receiving banks must be registered as SEPA Instant members.
SEPA Direct Debits (SDD) are an option for recurring payments.
Signed consent and authorisation given by a debtor (merchant’s client) to a creditor (merchant) and to a creditor’s (merchant’s) financial institution to enable:
A creditor to initiate a debit from a debtor’s nominated payment account.
A debtor’s financial institution to comply with such instructions.
A mandate can be issued and signed in paper or electronic format.
Whilst a mandate is a single agreement, it may be triggered several times in its lifetime.
1.2. URLs
It is very important to note that all base URLs are defined by the {baseUrl}
.
So, substitute {baseUrl}
with one of the base URLs in the table below, depending on the whether the Stage or Production environment is used:
Environment | URL |
---|---|
Stage | https://mandates-stage.sepagateway.eu |
Production | https://mandates.sepagateway.eu |
2. Prerequisites & important notes
2.1. Onboarding
In order to use this set of APIs, the merchant must already be onboarded and be in possession of a valid token.
Contact the ISX relationship management team for assistance.
2.2. Character sets
All content is restricted to the Latin character set as defined below:
a b c d e f g h i j k i m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
/ - ? : ( ) . , ' +
Space
Content must not start or end with a '/' & must not contain '//'.
3. SDD mandates API endpoints
The SDD Mandates API consists of 5 API endpoints:
API endpoint | Type | Description |
---|---|---|
/merchant/signup | POST | This API endpoint is used to create a mandate. |
/merchant/{mandateID} | GET | This API endpoint is used to identify a mandate for editing or cancelling. |
/merchant/cancel | POST | This API endpoint is used to cancel a mandate. |
/merchant/list | GET | This API endpoint is used to list all mandates created by a merchant. |
/merchant/trigger | POST | This API endpoint is used to execute mandates created by a merchant. |
What is an API endpoint?
An API endpoint is a digital location where an API receives requests about a specific resource on its server. An endpoint is typically a uniform resource locator (URL) that provides the location of a resource on the server.
4. Mandate sign up endpoint
This API endpoint is used to create a mandate.
This is a POST endpoint.
4.1. Request
4.1.1. Schema
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
first_name | string | 70 | yes | The first name of the client. |
middle_name | string | 70 | no | The middle name of the client. |
last_name | string | 70 | yes | The last name of the client. |
mobile | string | 50 | yes | The mobile telephone number of the client. |
string | 200 | yes | The email address must include an @ symbol & at least one period. | |
acno | string | 34 | yes | This value must be a valid IBAN. |
residential_address_street_number | string |
| yes | The street number of the client address. |
residential_address_street | string |
| yes | The street of the client address. |
residential_address_city | string |
| yes | The city of the client address. |
residential_address_subdivision | string |
| no | The province of the client address. |
residential_address_country | string |
| yes | The country of the client address. |
residential_address_secondary | string |
| no | The apartment, suite, etc. of the client address. |
residential_address_postal_code | string |
| yes | The postal code of the client address. |
amount | decimal | 7 | yes | Value must be a whole number (not cents). |
currency | string | 3 | yes | Currently, the value is always “EUR”. |
type | string | 9 | yes | Values: Null, “Frequent”, “Recurring”, “Limited”, “OneOff“. |
recurring | string | 20 | conditional | Currently, the value is always “Monthly”. |
debitDate | integer |
| conditional | Value must be from 1 or 31 inclusive. |
identifier | string | 50 | yes | Refers to a reference of a merchant’s client. |
verify | boolean |
| yes | Values: true or false. If the value is “true“, then open banking verification must be performed in order to verify the account ownership (i.e., authentication). |
return_url | string |
| no | The value is a URL set by a merchant. When an end user has completed the form & clicks the ‘Done’ button, then the system uses the defined URL to redirect the end user. |
redirect | boolean |
| no | Values: true or false. If the value is “false“, then the eMandate UI is not shown, a mandate is created & an API response that a mandate was created is returned. |
4.1.2. Sample request body
{
"client": {
"first_name": "John",
"middle_name": "",
"last_name": "Doe",
"mobile": "+440000000000",
"email": "john.doe@mail.com",
"acno": "LT601010012345678901",
"residential_address_street_number": "173",
"residential_address_street": "New Bond Street",
"residential_address_city": "London",
"residential_address_subdivision": "",
"residential_address_country": "United Kindgom",
"residential_address_secondary": "",
"residential_address_postal_code": "W1S 4RF"
},
"transaction": {
"amount": 500,
"currency": "EUR",
"type": "Limited",
"recurring": "None",
"debitDate": 31
},
"account": {
"identifier": "John_Doe_01"
},
"verify": true,
"return_url": "https://www.example.com"
}
With the use of the above JSON script, a user is given very limited control in what can be changed in terms of “transaction“. For allowing a user more flexibility, refer to Section 4.1.3. below for more information.
4.1.3. (a) Sample request body
If a merchant wishes to allow a user to choose the type of mandate and fine-tune its associated fields, the “amount“, “type“, “recurring“, and “debitDate“ fields of the JSON must be removed.
{
"client": {
"first_name": "John",
"middle_name": "",
"last_name": "Doe",
"mobile": "+440000000000",
"email": "john.doe@mail.com",
"acno": "LT601010012345678901",
"residential_address_street_number": "173",
"residential_address_street": "New Bond Street",
"residential_address_city": "London",
"residential_address_subdivision": "",
"residential_address_country": "United Kindgom",
"residential_address_secondary": "",
"residential_address_postal_code": "W1S 4RF"
},
"transaction": {
"currency": "EUR"
},
"account": {
"identifier": "John_Doe_01"
},
"verify": true
}
4.1.3. (b) Sample request body with no redirect
{
"client": {
"first_name": "Joe",
"middle_name": "",
"last_name": "Doe",
"mobile": "+440000000000",
"email": "joe.doe@mail.com",
"acno": "MT34CFTE28004000000000000002260",
"residential_address_street_number": "string",
"residential_address_street": "string",
"residential_address_city": "string",
"residential_address_subdivision": "string",
"residential_address_country": "Malta",
"residential_address_secondary": "string",
"residential_address_postal_code": "string"
},
"transaction": {
"amount": 500,
"currency": "EUR",
"type": "Frequent",
"recurring": "None",
"debitDate": 31,
"reference": "string"
},
"account": {
"identifier": "string"
},
"verify": false,
"redirect": false
}
4.2. Response
4.2.1. Schema
Field | Data type | Comments |
---|---|---|
url | string | Used to populate the iFrame of a website. |
success | boolean | Values: true or false. |
state | string | Values: “Recorded”, “Created”, “Declined“, “Cancelled“ or “Active”. |
mandate_created | boolean | Values: true or false. |
4.2.2. Sample response body
4.2.3. Request URL
https://{baseUrl}/merchant/signup
5. Mandate ID endpoint
This API endpoint is used to identify a mandate for editing or cancelling.
This is a GET endpoint.
5.1. Request
5.1.1. Parameter
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
mandateId | string | 35 | yes | The ID of the mandate e.g., LTLND-202403-00000055. |
5.2. Response
5.2.1. Schema
Field | Data type | Comments |
---|---|---|
url | string | Used to populate the iFrame of a website. |
success | boolean | Values: true or false. |
state | string | Values: “Recorded”, “Created”, “Declined“, “Cancelled“ or “Active”. |
mandate_created | boolean | Values: true or false. |
5.2.2. Sample response body
5.2.3. Request URL
https://{baseUrl}/merchant/
The parameter is added to the end of the request URL: https://{baseUrl}/merchant/LTLND-202403-00000055
6. Mandate cancel endpoint
This API endpoint is used to cancel a mandate.
This is a POST endpoint.
6.1. Request
6.1.1. Schema
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
mandateID | string | 35 | yes | The ID of the mandate e.g., LTLND-202403-00000055. |
reference | string | 35 | yes |
|
identifier | string | 50 | yes | Refers to a reference of a merchant’s client. |
6.1.2. Sample request body
6.2. Response
6.2.1. Schema
Field | Data type | Comments |
---|---|---|
mandateID | string | The ID of the mandate e.g., LTLND-202403-00000055. |
cancelled | boolean | Values: true or false. |
6.2.2. Sample response body
6.2.3. Request URL
https://{baseUrl}/merchant/cancel
7. List of mandates endpoint
This API endpoint is used to list all mandates created by a merchant.
This is a GET endpoint.
7.1. Request
7.1.1. Parameters
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
SortOrder | string |
|
| Values: Asc or Desc. |
SortBy | string |
|
| Currently, the only option is “Created”. |
MandateId | string |
|
| The ID of the mandate e.g., LTLND-202403-00000055. |
StartDate | string |
|
| Format: yyyy-mm-dd. |
EndDate | string |
|
| Format: yyyy-mm-dd. |
State | string |
|
| Values: Null, Recorded, Created, Declined, Cancelled or Active. |
Page | integer |
|
|
|
RowsPerPage | integer |
|
|
|
7.2. Response
7.2.1. Schema
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
mandateID | string | 35 |
| The ID of the mandate e.g., LTLND-202403-00000055. |
reference | string | 35 |
|
|
amount | number |
|
| Value is from 0.01 or 1000000 inclusive. |
currency | string | 3 |
| Currently, the value is always “EUR”. |
debitDate | integer |
|
| Value is from 1 or 31 inclusive. |
debtorIBAN | string | 50 |
| The debtor’s IBAN, which is a valid IBAN. |
created | string |
|
| Format: yyyy-mm-dd. |
recurring | string |
|
| Currently, the value is always “Monthly”. |
type | string |
|
| Values: Null, “Frequent”, “Recurring” or “Limited”. |
status | string |
|
| Values: “Recorded”, “Created”, “Declined“, “Cancelled“ or “Active”. |
page | integer |
|
|
|
pageSize | integer |
|
|
|
totalItems | integer |
|
|
|
totalPages | integer |
|
|
|
7.2.2. Sample response body
7.2.3. Request URL
https://{baseUrl}/merchant/list
The parameters are added to the end of the request URL: https://{baseUrl}/merchant/list?SortOrder=Desc&SortBy=Created&StartDate=2024-03-21&EndDate=2024-03-21&Page=1&RowsPerPage=50
8. Mandate trigger endpoint
This API endpoint is used to execute mandates created by a merchant.
This is a POST endpoint.
8.1. Request
8.1.1. Parameters
Field | Data type | Max. length | Mandatory | Comments |
---|---|---|---|---|
amount | number | 7 | yes | Value must be from 0.01 or 1000000 inclusive or can be null. |
currency | string | 3 | yes | Currently, the value is always “EUR”. |
mandateid | string | 35 | yes | The ID of the mandate e.g., LTLND-202403-00000055. |
reference | string | 35 | yes |
|
identifier | string | 50 | yes | Refers to a reference of a merchant’s client. |
8.1.2. Sample response body
8.2. Response
8.2.1. Schema
Field | Data type | Comments |
---|---|---|
success | boolean | Values: true or false. |
failReason | string |
|
8.2.2. Sample response body
8.2.3. Request URL
https://{baseUrl}/merchant/trigger
9. HTTP status codes
The above endpoints will return HTTP status codes after processing.
HTTP status codes are classified as follows:
HTTP status code range | Description |
---|---|
100-199 | |
200-299 | |
300-399 | |
400-499 | |
500-599 |
In the event that any of the above endpoints return error codes, refer to this link for more information.
10. Mandate states
The mandate states are classified as follows:
State | Description |
---|---|
Cancelled | Mandate has been cancelled. Mandate cannot be triggered and/or edited. |
Active | Mandate has been set up & active. Mandate can be edited and/or cancelled. |
Declined | Mandate has been declined. Mandate cannot be triggered and/or edited. |
Created | Mandate has been created, but pending activation. Mandate can be edited and/or cancelled. |
Recorded | Mandate has been recorded on the database, but has not been processed yet. |
11. SIIN for SDD
SIIN notifications for SDD are described here.
Appendix: Mandate types
Type | Description | Duration | Unique attributes | Example |
---|---|---|---|---|
Frequent | Allow monthly limit with multiple ad hoc debits within a month as long as it does not exceed the limit. | Monthly | Multiple ad hoc debits. No fixed date within a month. End user triggers. | End user signs up to betting site & has fixed mandate of €250 per month to use. User buys lottery ticket today, buys lottery ticket in 4 days & buys lottery ticket in 2 weeks. Every end/start of month, limit is reset & user can do another €250. |
Recurring | Allow monthly single fixed amount to be debited within a month on fixed date only once. | Monthly | Single fixed debit on fixed date within a month. No involvement of merchant. | End user signs mandate to pay Netflix bill monthly. They know amount is fixed at €14.95. They set mandate to be automatically executed on 20th of each month. |
Limited | Allow monthly limit with a single ad hoc debit within a month only once. It cannot exceed limit & can only be triggered by a merchant up to a mandate date. | Monthly | Single ad hoc debit. Fixed date within a month to execute by a merchant. Merchant must trigger. | End user signs mandate to pay electricity bill. They set mandate that EAC must debit their account until 25th of month otherwise it will fail. User also set a limit of €350 on mandate so EAC cannot exceed this limit. EAC can only trigger this mandate once. If amount is more than limit, then mandate will not be triggered. |
OneOff | A fixed amount that is scheduled to take place only once. | No monthly limit renewal | After it is executed successfully, then the mandate is cancelled regardless if the transfer is successful or rejected. The mandate is cancelled immediately after the first trigger event or it expires after 36 months if the mandate is not triggered. |
|
© ISX Financial EU PLC 2024. All rights reserved.