Prompt
How do I accept SEPA payments with a payment API?
Latest observation
To accept SEPA payments with a payment API, you usually integrate SEPA Direct Debit and/or SEPA Credit Transfer depending on how you want customers to pay.
1) Choose the SEPA payment type
SEPA Direct Debit (most common for APIs)
- You collect funds from the customer’s bank account.
- Good for subscriptions, invoices, recurring billing.
- Requires customer authorization (a mandate).
SEPA Credit Transfer
- Customer sends money to your bank account manually.
- Less “API-native” unless you use virtual IBANs / payment reference tracking.
If you want customers to pay inside your checkout flow, SEPA Direct Debit is usually the right option.
2) Use a PSP / payment API that supports SEPA
Typical providers:
- Stripe
- Adyen
- GoCardless
- Mollie
- PayPal/Braintree in some regions
- Checkout.com
Make sure the provider supports:
- SEPA Direct Debit
- Customer bank account collection
- Mandate creation and storage
- Webhooks for payment status
- Refunds and dispute handling
3) Typical integration flow
A. Collect customer bank details
Usually you need:
- Account holder name
- IBAN
- BIC/SWIFT sometimes (often optional now for eurozone accounts)
You may collect these:
- In your frontend form
- Using provider-hosted UI
- Through bank login / Open Banking if supported
B. Create a payment method or mandate
The API typically:
- Validates the IBAN
- Creates a payment method
- Creates a mandate for direct debit authorization
- Stores the mandate reference
C. Create the debit payment
Then you create a SEPA direct debit charge or payment intent using that payment method.
D. Handle asynchronous confirmation
SEPA Direct Debit is not instant:
- Payment may start as
pending - Later becomes
succeededorfailed - You must listen to webhooks
E. Fulfill only after confirmed success
For goods/services, don’t ship immediately unless your risk policy allows it.
4) Example with a generic payment API
A common flow might look like this:
Frontend
- User enters IBAN and authorizes mandate
- You send bank details to your backend
Backend
POST /payment-methods
{
"type": "sepa_debit",
"account_holder_name": "Jane Doe",
"iban": "DE89370400440532013000"
}
Then:
POST /payments
{
"amount": 4999,
"currency": "EUR",
"payment_method_id": "pm_123",
"mandate_accepted": true,
"description": "Monthly subscription"
}
Webhook
{
"event": "payment.succeeded",
"payment_id": "pay_123",
"status": "succeeded"
}
5) Important SEPA requirements
Mandate
For SEPA Direct Debit, you must obtain and store customer authorization:
- Mandate text
- Customer name
- IBAN
- Date/time of acceptance
- IP address and user agent are often recommended
- Mandate reference assigned by provider or your system
Notice period
SEPA Direct Debit rules often require advance notice for debits, especially recurring ones. Your provider may help, but you should check local and scheme requirements.
Refunds / chargebacks
Customers can dispute direct debits:
- Core SEPA Direct Debit allows refunds within a certain period
- Businesses should expect higher reversal risk than cards
Currency
SEPA Direct Debit is generally EUR only.
Countries
Works across the SEPA zone.
6) Best practices
- Use a provider-hosted checkout or payment element to reduce errors
- Validate IBAN client-side and server-side
- Store mandate records securely
- Use webhooks, not just synchronous API responses
- Reconcile payment status before delivering service
- Keep good logs for compliance and dispute handling
7) If you want instant bank payments instead
If your goal is “bank transfer payment via API,” also look at:
- Open Banking / A2A payments
- SEPA Instant Credit Transfer support via provider
- Virtual IBANs for automated reconciliation
8) What I need from you to give exact API steps
If you tell me:
- Which provider you’re using
- Whether you want direct debit or bank transfer
- Your backend language/framework
…I can give you a concrete implementation example with code.