Recurring
Using a payment agreement
You can use our Payment Agreements API to set up recurring SEPA Direct Debit Pro payments, giving you a unified view of all economically related transactions for a given consumer. As with one-time payments, you will need to collect the consumer's name, email, and IBAN details, obtain their approval for the direct debit mandate within your own checkout experience, and generate a mandate ID.
To create a payment agreement, provide the following information when calling our payment agreements API
Create the payment agreement
To set up a recurring agreement, you'll need to provide at minimum the following data when calling our /v1/payment-agreements API:
| Data Field | Required | Description |
|---|---|---|
| paymentMethod | M | SEPA_DIRECT_DEBIT_PRO |
| consumer.name | M | Full name of the consumer. |
| consumer.country | M | The country where the consumer is shopping. |
| instrument: BANK_ACCOUNT details.iban | M | The IBAN of the consumer's bank account. |
| instrument: BANK_ACCOUNT details.debitMandateId | M | The mandate ID you have generated in your system to identify the SEPA mandate. |
You can also include the initialPaymentCharge object in this agreement creation call to immediately initiate the first payment without making a separate call. If you include this object, you'll need to specify the exact amount.value and amount.currency of the first payment.
If you don't include an initialPaymentCharge during agreement creation, you'll need to make a separate API call to /v1/payment-agreements/{agreement\_id}/payment-charges to create the first charge.
Request
POST /v1/payment-agreements
{
"paymentMethod": "SEPA_DIRECT_DEBIT_PRO",
"consumer": {
"name": "John Smith",
"country": "FR"
},
"instrument": {
"type": "BANK_ACCOUNT",
"details": {
"iban": "FR1420041010050500013M02606",
"debitMandateId": "YOURDIRECTDEBITMANDATEID12123"
}
}
}{
"paymentMethod": "SEPA_DIRECT_DEBIT_PRO",
"consumer": {
"name": "John Smith",
"country": "FR"
},
"instrument": {
"type": "BANK_ACCOUNT",
"details": {
"iban": "FR1420041010050500013M02606",
"debitMandateId": "YOURDIRECTDEBITMANDATEID12123"
}
},
"initialPaymentCharge": {
"amount": {
"value": 1000,
"currency": "EUR"
}
}
}Response
{
"id": "agr_C9LnPTm60ACUrsV8QL627",
"status": "AUTHENTICATION_PENDING",
"description": "description",
"paymentMethod": "SEPA_DIRECT_DEBIT_PRO",
"startDate": "2026-08-26T09:34:56.451Z",
"instrumentId": "instr_5tGJxFI5J26wHmztvnLCT",
"consumer": {
"name": "John Smith",
"email": "[email protected]",
"country": "DE",
}
},
"authenticationMethods": [
{
"details": {
"requestUrl": "https://redirection-target.com",
"requestMethod": "GET"
},
"type": "REDIRECT"
}
],
"history": [
{
"id": "ahist_76ElfyeQXMLAptJPLlZAY",
"status": "AUTHENTICATION_PENDING",
"createdAt": "2026-08-26T09:34:59.143Z"
}
],
"revocations": [],
"createdAt": "2026-08-26T09:34:59.143Z",
"updatedAt": "2026-08-26T09:34:59.143Z"
}{
"id": "agr_KiOBhYpwZd7wPNsCrcPAa",
"status": "AUTHENTICATION_PENDING",
"description": "description",
"paymentMethod": "SEPA_DIRECT_DEBIT_PRO",
"startDate": "2026-08-26T09:43:39.133Z",
"amount": {
"value": 100,
"currency": "EUR"
},
"instrumentId": "instr_3kmpL2jT7gzZ4nyKfFMQV",
"consumer": {
"name": "John Smith",
"country": "DE",
},
"authenticationMethods": [
{
"details": {
"requestUrl": "https://redirection-target.com",
"requestMethod": "GET"
},
"type": "REDIRECT"
}
],
"history": [
{
"id": "ahist_KlH7W09NjFlrp7iFzEF8M",
"status": "AUTHENTICATION_PENDING",
"createdAt": "2026-08-26T09:43:40.703Z"
}
],
"revocations": [],
"createdAt": "2026-08-26T09:43:40.703Z",
"updatedAt": "2026-08-26T09:43:40.703Z"
}
Pick the desired authentication method
REDIRECT
Redirect your consumer to the returned $.authenticationMethods[?(@.type == "REDIRECT")].details.requestUrl For example, with the value of https://redirection-target.ppro.com/ using the returned $.authenticationMethods[?(@.type == "REDIRECT")].details.requestMethod HTTP method.
Pick the desired authentication method
REDIRECT
- After the consumer completes the authentication, they are redirected to the
returnUrlspecified in the payment charge creation request. - Upon redirect back to your site, retrieve the latest agreement status by performing a
GET /v1/payment-agreements/{agreementId}. Use the returned status field to determine and display the final payment outcome to the consumer. - Additionally, webhooks are triggered to notify you of the payment result. This ensures you receive the outcome even if the consumer closes their browser or fails to return to your website.
Create a recurring payments
To initiate a subsequent recurring payment, send a request against an active agreement /v1/payment-agreements/{agreement-id}/payment-charges
Request
POST /v1/payment-agreements/{agreement-id}/payment-charges
{
"amount": {
"value": 1000,
"currency": "EUR"
}
}Response
{
"id": "charge_VVJbYlQuMKyWKMIT9lnR3",
"paymentMethod": "SEPA_DIRECT_DEBIT",
"currency": "EUR",
"country": "FR",
"instrumentId": "instr_ocU6uxar4Fo4zr50tMd9T",
"status": "AUTHORIZATION_ASYNC",
"consumer": {
"name": "John Smith",
"country": "FR"
},
"authorizations": [
{
"id": "authz_IGDaGFCRrfAwVdExlRoKo",
"amount": 1000,
"status": "PROVIDER_CONFIRMATION_PENDING",
"createdAt": "2026-08-30T16:32:26.825Z",
"updatedAt": "2026-08-30T16:32:26.825Z"
}
],
"captures": [],
"refunds": [],
"voids": [],
"createdAt": "2026-08-30T16:32:26.646Z",
"updatedAt": "2026-08-30T16:32:26.825Z"
}Updated about 1 hour ago