Third-Party SEPA Payouts

Sending EUR to accounts not held in your user's name

Payment Accounts also enable outgoing SEPA transfers to third parties. The model: every payout destination carries a declared payee — the user's own account, or a third party by name — declared once, verified against the payee's bank, and screened before funds move. A destination without a declared payee cannot be paid: the payout is refused with errorCode: "30080".

Declaring the payee

At whitelisting — Whitelist Destination IBAN (POST /wallets/whitelist-iban, and its business equivalent) accepts the payee declaration alongside iban + bic:

FieldWhenMeaning
ownAccount: trueThe user's own external accountVerified against the user's legal name — no other fields allowed
beneficiaryTypeThird partyRETAIL or CORPORATE
firstName, lastNameThird party, RETAILThe individual payee's names
nameThird party, CORPORATEThe company name (1–70 characters)

On existing rows — IBANs whitelisted before Payment Accounts have no declared payee. Declare one once via POST /wallets/whitelist-iban/payee with { userId, whitelistedIbanId } plus the same declaration fields. Until then, payouts to those rows refuse with 30080.

Ad-hoc — Initiate SEPA Payment (POST /wallets/send/initiate/bank) with a raw destination (destination.iban + destination.bic) accepts the same declaration fields for a one-off payout.

A declared payee is permanent for that row: declaring a different payee on the same row is refused. Repeating the identical declaration is accepted and changes nothing.

Verification of Payee

Declaring a payee runs the SEPA Verification of Payee check against the payee's bank. The result is returned on the row (and on every later read) as:

"vop": { "status": "MATCH", "matchedName": "...", "checkedAt": "..." }
vop.statusMeaningWhat to do in your UI
MATCHThe declared name matches the account's holderProceed
CLOSE_MATCHAlmost — the bank returned the corrected nameShow matchedName to the user; the payment order and screening use the corrected name
NO_MATCHThe name does not match the account's holderWarn the user clearly before they authorise
UNAVAILABLEThe scheme could not answerRecorded; proceed with care

Verification of Payee never blocks saving the payee — the user decides whether to proceed when they authorise the payment with SCA. No provider identifiers are exposed. Accounts on the platform itself cannot be whitelisted (errorCode: "00013" — use intra transfers).

Authorising the payment

Every payout from a payment account is confirmed with strong customer authentication: initiation returns a challengeId, and Confirm Transaction requires the verification code and the end user's ip. Confirmation codes are dynamically linked to the amount and payee; a wrong code is refused (31064), attempts are limited, and challenges expire after five minutes. Users may designate trusted beneficiaries under SCA. See the SCA reference for factors (sms, totp, passkey).

Users without recorded consent on an enabled application cannot make third-party payouts at all (403 / 31128) — see gating. Their payouts to their own external account are allowed once Verification of Payee confirms the account holder's name is theirs; this check runs automatically at initiation.

SEPA Instant sending limits

Users can set per-transaction and daily SEPA Instant sending limits, changed only under SCA:

  • POST /wallets/sepa-instant-limit — request a limit change (returns a challenge)
  • POST /wallets/sepa-instant-limit/confirm — confirm with the verification code
  • POST /wallets/sepa-instant-limit/status — read the current limits and any pending request
  • POST /wallets/sepa-instant-limit/resend-otp, POST /wallets/sepa-instant-limit/cancel-request

(Business equivalents live under /wallets/business/sepa-instant-limit….) A payment above the limit is refused at initiation with errorCode: "30145".

Fees

Payout fees are charged on top of the payment amount: the payee always receives the full principal, and the paying account must cover amount + fee.

What to display to users

Rely on the existing SEPA_PAYOUT_INITIATED / SEPA_PAYOUT_COMPLETED / SEPA_PAYOUT_FAILED webhooks for state (see Bank Transfer Webhooks); their types and payloads are unchanged. On a CLOSE_MATCH payee the payout and statement carry the bank-corrected name.

Errors to handle

CodeMeaning
31128The user has not accepted the Payment Account terms (third-party EUR blocked)
30080The destination has no declared payee — declare it first
30145Above the user's SEPA Instant sending limit
31064Invalid SCA verification code
00013IBAN already whitelisted, or belongs to an internal account

Trying it out

You can simulate the full third-party payout flow — payee declaration, every Verification of Payee outcome, initiate, SCA confirm, and the payout status — on the sandbox environment. See Testing in Sandbox.