Recurring

Recurring SEPA Direct Debit payments can be initiated either directly from a payment instrument or through our payment agreements API.

Using a payment instrument

To make a recurring SEPA Direct Debit payment, you'll need to provide the following data at minimum when calling our /v1/payment-charges API:

Data FieldDescription
paymentMethodSEPA_DIRECT_DEBIT
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 where the consumer is shopping.
instrumentIdThe payment instrument of a previous SEPA DIRECT DEBIT payment charge.
You must ensure that the mandate is still valid for the current payment.

Request:

POST /v1/payment-charges

{
  "paymentMethod": "SEPA_DIRECT_DEBIT",
  "amount": {
    "value": 1000,
    "currency": "EUR"
  },
  "consumer": {
    "name": "John Smith",
    "country": "FR"
  },
  "instrumentId": "instr_cH9PMbAMsoVGYLeA1C9cL"
}

Response:

You'll receive the standard SEPA Direct Debit response here.

Using a payment agreement

You can use our Payment Agreements API to set up recurring SEPA Direct Debit payments, giving you a comprehensive solution to view and track all associated transactions.

Similar to one-time payments, you’ll need to collect the consumer’s name, email, and IBAN details, obtain their approval for the direct debit mandate, and generate a mandate ID.

Create the payment agreement

To set up a recurring agreement for SEPA DD, you'll need to provide at minimum the following data when calling our /v1/payment-agreements API:

Data FieldRequiredDescription
paymentMethodMSEPA_DIRECT_DEBIT
consumer.nameMFull name of the consumer.
consumer.countryMThe country where the consumer is shopping.
instrument: BANK_ACCOUNT
details.iban
MThe IBAN of the consumer's bank account.
instrument: BANK_ACCOUNT
details.debitMandateId
MThe 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",
  "consumer": {
    "name": "John Smith",
    "country": "FR"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "iban": "FR1420041010050500013M02606",
      "debitMandateId": "YOURDIRECTDEBITMANDATEID12123"
    }
  }
}
{
  "paymentMethod": "SEPA_DIRECT_DEBIT",
  "consumer": {
    "name": "Connor Sumer",
    "country": "NL"
  },
  "instrument": {
    "type": "BANK_ACCOUNT",
    "details": {
      "iban": "FR1420041010050500013M02606",
      "debitMandateId": "YOURDIRECTDEBITMANDATEID12123"
    }
  },
  "initialPaymentCharge": {
    "amount": {
      "value": 1000,
      "currency": "EUR"
    }
  }
}

Response

{
  "id": "agr_v2tXTPKpmslWIJjUOIUtm",
  "status": "ACTIVE",
  "paymentMethod": "SEPA_DIRECT_DEBIT",
  "startDate": "2025-04-15T16:10:26.270Z",
  "instrumentId": "instr_ocU6uxar4Fo4zr50tMd9T",
  "consumer": {
    "name": "John Smith",
    "country": "FR"
  },
  "history": [
    {
      "id": "ahist_q08s0A5sQMUN32TFVdVq9",
      "status": "ACTIVE",
      "createdAt": "2025-04-15T16:10:26.439Z"
    }
  ],
  "createdAt": "2025-04-15T16:10:26.439Z",
  "updatedAt": "2025-04-15T16:10:26.439Z"
}
{
  "id": "agr_1vP51hJpDCzbZGu6Ch4Ah",
  "status": "ACTIVE",
  "paymentMethod": "SEPA_DIRECT_DEBIT",
  "startDate": "2025-04-15T16:15:18.892Z",
  "instrumentId": "instr_7Km0BopbXA0Pd0PtHwPDU",
  "consumer": {
    "name": "John Smith",
    "country": "FR"
  },
  "history": [
    {
      "id": "ahist_zqCTA06XqK9EsoBlUM9Tb",
      "status": "ACTIVE",
      "createdAt": "2025-04-15T16:15:20.026Z"
    }
  ],
  "initialPaymentChargeId": "charge_b5Lv9OQMrQWu1dAEgRe5f",
  "createdAt": "2025-04-15T16:15:20.026Z",
  "updatedAt": "2025-04-15T16:15:20.026Z"
}

Handling the result

As SEPA Direct Debit does not require a dedicated consumer authentication step, the agreement details will be returned directly in the response with the agreement status set to ACTIVE.

If an initial payment charge is included in the request, its status will initially be set to AUTHORIZATION_ASYNC for up to 5 days. During this period, the consumer's bank may still reject or reverse the transaction. If no rejection or reversal is received, the charge status will automatically transition to CAPTURED, and a corresponding webhook notification will be sent. If the transaction is rejected or reversed during this period, the charge status will be updated to FAILED, along with the applicable failure reason code.

The same processing and status transition behavior applies to subsequent recurring charges.

Create a recurring payment

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": "2025-04-15T16:32:26.825Z",
      "updatedAt": "2025-04-15T16:32:26.825Z"
    }
  ],
  "captures": [],
  "refunds": [],
  "voids": [],
  "createdAt": "2025-04-15T16:32:26.646Z",
  "updatedAt": "2025-04-15T16:32:26.825Z"
}