EUR payouts

Send EUR to European bank accounts over SEPA, settled from your EUR international account. Recipients are identified by IBAN + BIC.

See the Payouts overview for common fields + customer attribution, and the NGN page for the shared payout object + management endpoints.

Prerequisites

  • International accounts enabled on your merchant account.
  • An active EUR account to send from. In the individual flow this is the sender’s own virtual account (sender_account_not_provisioned if missing); in the business/treasury flow it’s your merchant international account (no_active_international_account if missing). See the error table.
  • A sender for compliance — sender_customer_id (preferred) or an inline sender block.
  • For attribution reads on the customer feed: the API key needs customer_transaction_view.
POST/v1/beneficiaries

A saved EUR beneficiary captures the address the receiving network needs (the inline path does not).

PathFieldRequiredNotes
Beneficiarybank.ibanyesRecipient IBAN.
Beneficiarybank.bic_codeyes8–11 char BIC/SWIFT.
Beneficiaryaddress.street / city / zip_codeyesReceiving-network compliance.
BeneficiarynameyesRecipient name.
Request
curl https://api.swappr.me/api/v1/beneficiaries \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "currency": "EUR",
    "name": "Hans Müller",
    "bank": {
      "iban": "DE89370400440532013000",
      "bic_code": "COBADEFFXXX",
      "bank_name": "Commerzbank"
    },
    "address": {
      "street": "Friedrichstraße 1",
      "city": "Berlin",
      "zip_code": "10117"
    },
    "external_reference": "vendor-de-7"
  }'

POSTCreate a EUR payout

POST/v1/payouts

amount_minor is in cents (100000 = €1,000.00). Prefer the by-beneficiary path; the inline recipient is soft-deprecated for FX.

The inline path is the simpler shape — iban + bic_code + name:

PathFieldRequiredNotes
Inlinerecipient.ibanyesRecipient IBAN.
Inlinerecipient.bic_codeyes8–11 char BIC/SWIFT.
Inlinerecipient.nameyesRecipient name.

Sender attribution

EUR requires the sending customer to be identified — sender_customer_id (preferred) or an inline sender block; the two are complementary (inline fields win per-field, the referenced customer’s KYC backfills gaps). customer_id must match sender_customer_id if both are passed.

Response

201 Created with the payout object (currency: "EUR"). Status transitions to paid on network confirmation — listen for the payout.paid webhook.

Errors

CodeHTTPCause
fx_features_not_enabled403International accounts not enabled
no_active_international_account403(Business/treasury) No active merchant EUR international account
sender_account_not_provisioned422(Individual) The sending customer has no active EUR virtual account — issue one via POST /v1/customers/{id}/virtual_accounts
missing_field400/422Required recipient field absent (iban, bic_code, name)
beneficiary_not_found404beneficiary_id unknown / not yours / wrong env
beneficiary_currency_mismatch400beneficiary_id is not a EUR beneficiary
sender_info_required422No sender_customer_id and no complete inline sender block
customer_id_mismatch400customer_idsender_customer_id
idempotency_key_conflict409Same Idempotency-Key, different body
provider_error502Downstream rail unreachable; retry-safe with the same key

Shared management endpoints are on the NGN page.

Request — by beneficiary (preferred)
curl https://api.swappr.me/api/v1/payouts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_minor": "100000",
    "currency": "EUR",
    "beneficiary_id": "ben_cmo8x2p9q0...",
    "sender_customer_id": "cust_cmoji8...",
    "customer_id": "cust_cmoji8...",
    "merchant_reference": "DE-INV-55"
  }'
Request — inline recipient (soft-deprecated for FX)
curl https://api.swappr.me/api/v1/payouts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_minor": "100000",
    "currency": "EUR",
    "recipient": { "iban": "DE89370400440532013000", "bic_code": "COBADEFFXXX", "name": "Hans Müller" },
    "sender_customer_id": "cust_cmoji8...",
    "merchant_reference": "DE-INV-55"
  }'

Webhook events

payout.processingpayout.paid / payout.failed (+ payout.reversed). customer_id / customer_reference included when set.