Recurring

Create the payment agreement

You can use our Payment Agreements API to set up recurring SEPA Direct Debit 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 an SEPA Managed Mandate payment agreement, provide the following information when calling our payment agreements API

FieldDescription
paymentMethodSEPA_DIRECT_DEBIT_MANAGED_MANDATE
amount.valueThe amount to be paid in the smallest units of the currency used.
amount.currencyEUR
consumer.nameFull name of the consumer.
consumer.countryThe country of residence of the consumer.
consumer.emailThe consumer’s email address
instrument: BANK_ACCOUNT
details.iban
The IBAN of the consumer's bank account.
authenticationSettings: REDIRECT
settings.returnUrl
Specify the URL to which the consumer should be redirected after completing the payment. This is required for the REDIRECT payment flow.

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 when creating the agreement, post successful consent provided by the consumer, you'll need to make a separate API call to /v1/payment-agreements/{agreementId}/payment-charges to create the first charge.

Request

POST /v1/payment-agreements

{
  "paymentMethod": "SEPA_DIRECT_DEBIT_MANAGED_MANDATE",
  "consumer": {
    "name": "John Smith",
    "country": "FR",
		"email":"[email protected]"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "iban": "FR1420041010050500013M02606"
    }
  },
  "authenticationSettings": [
    {
      "type": "REDIRECT",
      "settings": {
        "returnUrl": "https://www.ppro.com"
      }
    }
  ]
}
{
  "paymentMethod": "SEPA_DIRECT_DEBIT_MANAGED_MANDATE",
  "consumer": {
    "name": "John Smith",
    "country": "FR",
		"email":"[email protected]"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "iban": "FR1420041010050500013M02606r"
    }
  },
  "authenticationSettings": [
    {
      "type": "REDIRECT",
      "settings": {
        "returnUrl": "https://www.ppro.com"
      }
    }
  ],
  "initialPaymentCharge": {
    "amount": {
      "value": 1000,
      "currency": "EUR"
    }
  }
}

Response

You'll receive our standard payment agreement response (see responses in the API Reference).

{
    "id": "agr_cd71HxVBEWNc0Yvd677RN",
    "status": "AUTHENTICATION_PENDING",
    "paymentMethod": "SEPA_DIRECT_DEBIT_MANAGED_MANDATE",
    "startDate": "2026-06-30T04:18:38.271Z",
    },
    "instrumentId": "instr_pB3UmejlwJ8Uv8CsDyxUg",
    "consumer": {
        "name": "John Smith",
        "email": "[email protected]",
        "country": "FR"
    },
    "authenticationMethods": [
        {
            "details": {
                "requestUrl": "https://redirection-target.ppro.com",
                "requestMethod": "GET"
            },
            "type": "REDIRECT"
        }
    ],
    "history": [
        {
            "id": "ahist_J2fYSDomggNY0Ym9TDp0O",
            "status": "AUTHENTICATION_PENDING",
            "createdAt": "2026-06-30T04:18:38.542Z"
        }
    ],
    "revocations": [],
    "createdAt": "2026-06-30T04:18:38.542Z",
    "updatedAt": "2026-06-30T04:18:38.542Z"
}
{
    "id": "agr_hGFfVaqkiVyznst2UXNLP",
    "status": "AUTHENTICATION_PENDING",
    "paymentMethod": "SEPA_DIRECT_DEBIT_MANAGED_MANDATE",
    "startDate": "2026-06-30T04:20:14.457Z",
    "amount": {
        "value": 1000,
        "currency": "EUR"
    },
    "instrumentId": "instr_wz0JlQoSmXh1FhYxIWHFX",
    "consumer": {
        "name": "John Smith",
        "email": "[email protected]",
        "country": "FR"
    },
    "authenticationMethods": [
        {
            "details": {
                "requestUrl": "https://redirection-target.ppro.com"
                "requestMethod": "GET"
            },
            "type": "REDIRECT"
        }
    ],
    "history": [
        {
            "id": "ahist_GbjpbJ67FzMJsrN9HlQeB",
            "status": "AUTHENTICATION_PENDING",
            "createdAt": "2026-06-30T04:20:14.614Z"
        }
    ],
    "revocations": [],
    "createdAt": "2026-06-30T04:20:14.614Z",
    "updatedAt": "2026-06-30T04:20:14.614Z"
}

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

  1. After the consumer completes the authentication, they are redirected to the returnUrl specified in the payment charge creation request.
  2. 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.
  3. 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": 1100,
    "currency": "EUR"
  }
}

Response

{
  "id": "charge_fmUbxp5wZi1zZj4mUDn4S",
  "paymentMethod": "SEPA_DIRECT_DEBIT_MANAGED_MANDATE",
  "currency": "EUR",
  "country": "FR",
  "instrumentId": "instr_UJ5dpTkpNZxL7kPgRSM7v",
  "status": "AUTHORIZATION_ASYNC",
  "consumer": {
    "name": "John Smith",
    "country": "FR"
  },
  "authorizations": [
    {
      "id": "authz_5WhS0eutxeiOHHLbAP7ad",
      "amount": 1100,
      "status": "AUTHORIZATION_ASYNC",
      "createdAt": "2025-04-14T12:30:56.522Z",
      "updatedAt": "2025-04-14T12:30:56.522Z"
    }
  ],
  "captures": [],
  "refunds": [],
  "voids": [],
  "createdAt": "2025-04-14T12:30:55.957Z",
  "updatedAt": "2025-04-14T12:30:56.522Z"
}


Did this page help you?