Skip to main content

Collect Payments Automatically

SEPA Direct Debit lets you pull funds directly from customer accounts — ideal for subscriptions, recurring billing, and scheduled collections. Inventi routes your direct debits through CENTROlink (Bank of Lithuania) and EKS (Bank of Latvia) to reach accounts across Europe.
What happens when you collect a payment:
  1. You submit a direct debit request via API with a valid mandate
  2. Inventi validates and forwards to CENTROlink or EKS
  3. The debtor’s bank processes the collection
  4. You receive status updates via webhooks

Supported Schemes

SDD Core

Consumer direct debits with extended refund rights (8 weeks unconditional, 13 months for unauthorized)

SDD B2B

Business-to-business collections with limited refund rights and faster settlement

API Reference

Business Requirements

Every direct debit must reference a valid SEPA mandate signed by the debtor. Store mandate details including:
  • Mandate reference (unique identifier)
  • Signing date
  • Debtor name and IBAN
  • Sequence type (FRST, RCUR, OOFF, FNAL)
Collections without valid mandates will be rejected or returned by the debtor’s bank.
Submit collections with appropriate lead time:
  • SDD Core: 2 business days before due date (D-2) for recurring, 5 days (D-5) for first collection
  • SDD B2B: 1 business day before due date (D-1)
Late submissions may be rejected or processed on the next available settlement date.
Debtors can dispute direct debits:
  • Core scheme: 8 weeks unconditional refund right, 13 months for unauthorized debits
  • B2B scheme: No refund right (pre-authorized by debtor’s bank)
Build automated handling for returns and refunds to update your billing system promptly.
Always send an Idempotency-Key header when creating direct debits. If your request times out, retry with the same key to prevent duplicate collections.
Duplicate direct debits can result in customer complaints and chargebacks.

Transaction Lifecycle

Transaction Statuses

StatusDescriptionTiming
CreatedDirect debit initiatedImmediate
To signAwaiting approval (if configured)Until signed
SignedApproved, queued for due dateUntil D-2/D-1
AcceptedSubmitted to debtor’s bankSettlement date
CompletedFunds collectedD+0 to D+2

Create a Direct Debit

curl -X POST https://api.pgw-sandbox.finventi.com/v1/createSepaDDPayment \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: {uuid}" \
  -d '{
    "creditor_iban": "LT543210010000000003",
    "creditor_name": "Your Company",
    "debtor_iban": "DE89370400440532013000",
    "debtor_name": "Customer Name",
    "amount": 4999,
    "currency": "EUR",
    "mandate_id": "MNDT-2024-001",
    "mandate_date": "2024-01-15",
    "sequence_type": "RCUR",
    "remittance_info": "Monthly subscription - January 2024"
  }'

Request Fields

creditor_iban
string
required
Your collection account IBAN
creditor_name
string
required
Your company name
debtor_iban
string
required
Customer’s IBAN to debit
debtor_name
string
required
Customer’s name as on mandate
amount
integer
required
Amount in cents
currency
string
required
Currency code (EUR)
mandate_id
string
required
Unique mandate reference
mandate_date
string
required
Mandate signing date (YYYY-MM-DD)
sequence_type
string
required
FRST (first), RCUR (recurring), OOFF (one-off), FNAL (final)
remittance_info
string
Payment description shown to debtor

Handle Returns and Reversals

Return a direct debit before settlement when the collection cannot be processed.
curl -X POST https://api.pgw-sandbox.finventi.com/v1/transactions/{id}:return \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "AM04",
    "additionalInfo": "Insufficient funds"
  }'
Common return reasons:
CodeDescription
AM04Insufficient funds
AC04Closed account
MD01No valid mandate
MS02Missing information

Collection Flow

Webhook Integration

Each status transition triggers a webhook notification:
trx_id
string
required
Transaction identifier
direction
string
required
OUTBOUND for collections you initiated
status
string
required
Current transaction status
amount
integer
required
Amount in cents
mandate_id
string
Mandate reference for the collection
return_reason
string
Reason code if returned or rejected

Data Model

Store these fields for complete tracking:
trx_id
string
required
Platform transaction ID (primary key)
mandate_id
string
required
Reference to customer mandate
sequence_type
string
required
FRST, RCUR, OOFF, or FNAL
idempotency_key
string
required
Your generated key for retry safety
current_status
string
required
Latest transaction status
return_reason
string
Reason code if returned

Integration Checklist

1

Implement mandate management

Store valid mandates with references, dates, and sequence tracking
2

Use idempotency

Generate and persist an Idempotency-Key for each collection
3

Submit with correct timing

Ensure collections are submitted with appropriate lead time (D-2/D-5 for Core, D-1 for B2B)
4

Handle returns and reversals

Build automated processing for failed collections and customer disputes
5

Track sequence types

Update sequence type from FRST to RCUR after first successful collection
6

Implement webhook receiver

Process status updates to keep your billing system synchronized

What’s Next?