SEPA Bank Details

Get SEPA bank account details for receiving EUR transfers.

Before You Start

Read the following guides before proceeding:

GuideWhy
Getting StartedPlatform overview and setup
Api BasicsRequired headers and request configuration
AuthenticationHow to obtain access tokens
OnboardingUser and wallet registration
KYCKYC verification requirements
RecipientsRecipient management

Overview

Each verified user can receive EUR transfers via SEPA. The system provides dedicated IBAN and BIC details for each user. Incoming SEPA transfers are automatically converted to the user's unified balance (WEUR).

SEPA accounts are provisioned automatically after the user completes verification. No additional API calls are required to create the account.


Checking SEPA Availability

Before retrieving bank details, verify that the user has access to SEPA accounts by checking their capabilities.

GET /api/v2/user

The response includes the SepaAccount capability:

{
  "capabilities": [
    {
      "type": "SepaAccount",
      "status": "Active"
    }
  ]
}

Capability Status

StatusDescription
ActiveAccount is provisioned and ready to use
ActivationNotStartedAvailable but requires manual activation via API
InProgressActivation requested, waiting for provisioning
NotFulfilledUser needs to complete additional verification first
NotAvailableNot available for user's country of residence

SEPA accounts are provisioned automatically when verification completes — no activation call required. For account types that require manual activation (ACH), see Activating Bank Accounts.

See Bank Account Availability for supported countries.


Get Bank Accounts

Retrieve the user's bank account details including SEPA information.

GET /api/v1/bank/accounts

Query Parameters

ParameterTypeDescription
page_numberintegerPage number, 0-indexed (default: 0)
page_sizeintegerItems per page (default: 25)

Code Examples

const response = await fetch(`${baseUrl}/api/v1/bank/accounts`, {
  headers: {
    'Authorization': `Bearer ${accessToken}`,
    'X-User-Address': userEoaAddress,
    'X-Chain-Id': chainId
  }
});
const { accounts } = await response.json();

const sepaAccount = accounts.find(a => a.account_type === 'Sepa');
if (sepaAccount) {
  console.log('IBAN:', sepaAccount.details.iban);
  console.log('BIC:', sepaAccount.details.bic);
}
response = requests.get(
    f"{base_url}/api/v1/bank/accounts",
    headers={
        "Authorization": f"Bearer {access_token}",
        "X-User-Address": user_eoa_address,
        "X-Chain-Id": chain_id
    }
)
accounts = response.json()["accounts"]

sepa_account = next((a for a in accounts if a["account_type"] == "Sepa"), None)
if sepa_account:
    print("IBAN:", sepa_account["details"]["iban"])
    print("BIC:", sepa_account["details"]["bic"])
req, _ := http.NewRequest("GET", baseURL+"/api/v1/bank/accounts", nil)
req.Header.Set("Authorization", "Bearer "+accessToken)
req.Header.Set("X-User-Address", userEoaAddress)
req.Header.Set("X-Chain-Id", chainId)

resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()

var result struct {
    Accounts []BankAccountResponse `json:"accounts"`
}
json.NewDecoder(resp.Body).Decode(&result)

for _, account := range result.Accounts {
    if account.AccountType == "Sepa" {
        fmt.Println("IBAN:", account.Details.IBAN)
        fmt.Println("BIC:", account.Details.BIC)
    }
}

Response

{
  "accounts": [
    {
      "id": "1334726cbd7641c09b4124e3e52f53fe:8d5a65eb59d94afea64374d45591fe9f",
      "currency": "EUR",
      "status": "Active",
      "account_holder": "Alex Grey",
      "account_type": "Sepa",
      "details": {
        "iban": "DE89370400440532013000",
        "bic": "COBADEFFXXX"
      }
    }
  ]
}

Response Fields

FieldDescription
idComposite identifier in format {account_id}:{details_id}. The account_id corresponds to the account id from webhooks, and details_id corresponds to the details id from webhooks.
currencyAccount currency (EUR for SEPA)
statusAccount status: Active, Pending, Blocked, Closed
account_holderName on the account
account_typeSepa for SEPA accounts
details.ibanIBAN for receiving transfers
details.bicBIC/SWIFT code

Account Status

StatusDescription
PendingAccount details being provisioned
ActiveReady to receive transfers
BlockedTemporarily suspended
ClosedPermanently closed

Receiving SEPA Transfers

To receive a SEPA transfer:

  1. Retrieve the user's SEPA account details using the endpoint above
  2. Provide the IBAN and BIC to the sender
  3. Monitor incoming transfers via the Activities webhook

Important Notes

  • Incoming EUR is automatically converted to WEUR in the user's unified balance
  • SEPA transfers typically settle within 1-2 business days

Webhooks

Bank Account Updates

Wirex sends webhook notifications when bank account details are created or updated.

Endpoint: POST {your_webhook_base_url}/webhook/accounts/fiat

Account Created

{
  "change_type": "Created",
  "id": "1334726cbd7641c09b4124e3e52f53fe",
  "account_type": "Fiat",
  "currency": "EUR",
  "status": "Active",
  "balance": {
    "amount": 0,
    "available_amount": 0
  },
  "details": [],
  "owner_type": "Personal",
  "created_at": "2024-01-15T10:00:00Z"
}

Details Changed (SEPA Details Added)

{
  "change_type": "DetailsChanged",
  "id": "1334726cbd7641c09b4124e3e52f53fe",
  "account_type": "Fiat",
  "currency": "EUR",
  "status": "Active",
  "balance": {
    "amount": 0,
    "available_amount": 0
  },
  "details": [
    {
      "id": "8d5a65eb59d94afea64374d45591fe9f",
      "type": "Sepa",
      "status": "Pending",
      "transport_currency": "EUR"
    }
  ],
  "owner_type": "Personal"
}

Incoming SEPA Transfer

When a SEPA transfer is received, you receive an activity webhook.

Endpoint: POST {your_webhook_base_url}/v2/webhooks/activities

{
  "id": "ea6fbc2c-b8da-4a7b-99d1-6a2220352d02",
  "user_address": "0x1d595bFAc81F231Ebc30950B8B08F2beEb97934B",
  "type": "Sepa",
  "status": "Completed",
  "direction": "Inbound",
  "source": {
    "type": "SepaBankAccount",
    "bank_account": {
      "iban": "GB82WEST12345698765432",
      "bic": "WESTGB2L",
      "owner_name": "Alex Grey",
      "is_business": false
    }
  },
  "destination": {
    "type": "Wallet",
    "wallet": {
      "address": "0x6fb0fCA78F4b717fbAaB89c96754200355554832"
    }
  },
  "source_amount": {
    "amount": 55.93,
    "currency": "EUR"
  },
  "destination_amount": {
    "amount": 55.93,
    "token_symbol": "WEUR",
    "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
  },
  "reference": "Payment reference",
  "operations": [
    {
      "hash": "0x456789abcdef123456789abcdef123456789abcdef123456789abcdef12345678",
      "operation_amount": {
        "amount": 55.93,
        "token_symbol": "WEUR",
        "token_address": "0x5c55F314624718019A326F16a62A05D6C6d8C8A2"
      },
      "transaction_amount": {
        "amount": 55.93,
        "currency": "EUR"
      },
      "rate": {
        "ticker": "EUR/WEUR",
        "rate": 1
      }
    }
  ],
  "created_at": "2024-01-01T09:00:00.000Z",
  "activity_steps": [
    {
      "type": "Initiated",
      "status": "Completed",
      "created_at": "2024-01-01T09:00:00.000Z",
      "completed_at": "2024-01-01T09:00:00.000Z"
    },
    {
      "type": "BankIn",
      "status": "Completed",
      "created_at": "2024-01-01T09:00:00.000Z",
      "completed_at": "2024-01-01T09:00:30.000Z"
    },
    {
      "type": "CryptoIn",
      "status": "Completed",
      "created_at": "2024-01-01T09:00:30.000Z",
      "completed_at": "2024-01-01T09:00:45.000Z"
    }
  ]
}

Error Handling

Validation Errors

Error ReasonDescription
ErrorNotFoundUser not found or not verified
ErrorInvalidStatusUser account not active

Error Response Format

{
  "error_reason": "ErrorNotFound",
  "error_description": "User not found",
  "error_category": {
    "category": "CategoryNotFound",
    "http_status_code": 404
  },
  "error_details": []
}