sepa payout
method. The catalog is provider-agnostic: it exposes the country, EUR and
sepa, while the account is debited using the normal payout pricing and
idempotency contract.
Routing corridor
V1 registers one routing corridor:country=EU, currency=EUR,
method=sepa. EU is the catalog code for Europe, not the beneficiary’s
actual country. The actual country is taken from the first two letters of the
normalized IBAN; the IBAN must belong to the supported SEPA Instant set.
GB is excluded from SEPA Instant V1: a British IBAN fails fast with HTTP 400
before dispatch because sepaInstReachable=false. SEPA Credit Transfer for GB
is a separate future scope. GET /v1/payouts/methods returns the single
EU/EUR/sepa row when the corridor is enabled.
Beneficiary contract
Thebeneficiary object must include:
Use one idempotency key for the whole operation. The
description is optional
at the API boundary, but when present it is normalized for the SEPA wire:
diacritics are folded, the explicit European fold map below is applied, the
result must fit the provider’s corporate charset, and it is capped at 140
Unicode code points. If the text still contains a character outside that
charset, creation fails with 400 invalid_payload. When omitted, the adapter
generates a valid internal SEPA description.
Names use the same deterministic fold before the provider charset check:
An individual must resolve to both a first name and a last name. Mononyms are
not payable as
individual in V1; send the structured given_name and
first_surname fields or a multi-word name.
Create a payout
processing; use the same idempotency
key for a client retry.
EUR funding source and ordering identity
For a customer account, everysepa payout must resolve an allocated, active
virtual IBAN with purpose funding_usdt. This is the funding purpose for
customer payouts; EUR Banking withdrawals use the separate banking_eur
purpose.
Send source_virtual_iban_id at the top level when you need to select a
specific active funding_usdt virtual IBAN:
- With exactly one active
funding_usdtvirtual IBAN, omitting the parameter selects that account deterministically. - With no active source, the API returns
422 funding_account_required. - With several active sources, the API returns
422 ambiguous_source_vibanuntil you send the selected UUID. - An explicit UUID that is not owned by the account or is not active returns
404 not_foundor422 funding_account_required.
BANK_EUR is used by EUR Banking operations, not customer
payouts.
Payout holds created before this source-account gate are grandfathered: they
continue through their existing dispatch and reconciliation path and are not
rejected retroactively.
Idempotency and source selection edge cases
The source vIBAN is part of the payout intent. If the active-vIBAN set changes between two sequential requests, retrying the same idempotency key still returns the original payout. If a concurrent request observes a different source set, it returns409 idempotency_conflict; both outcomes are safe and
do not create a second debit. Do not use a new key to guess the result.
The same key cannot represent both the default source and an explicit
source_virtual_iban_id: that replay returns 409 idempotency_conflict.
This strict comparison prevents silently changing the ordering account.
Statuses and returns
Subscribe to
payout_status_changed. SEPA does not add a new webhook event.
The provider callback is verified and bridged into the same payout status
pipeline; a late callback cannot resurrect a terminal row.
Errors
Is BIC mandatory?
Is BIC mandatory?
No. The IBAN is mandatory; BIC is optional and is sent when supplied.
Can I send USD through this method?
Can I send USD through this method?
No.
sepa is EUR-only. A different currency is rejected before dispatch.Does a return create a new webhook?
Does a return create a new webhook?
No. The existing
payout_status_changed event carries the reversed
status code and the normal refund outcome.