SEPA Bank Details
Get SEPA bank account details for receiving EUR transfers.
Before You Start
Read the following guides before proceeding:
| Guide | Why |
|---|---|
| Getting Started | Platform overview and setup |
| Api Basics | Required headers and request configuration |
| Authentication | How to obtain access tokens |
| Onboarding | User and wallet registration |
| KYC | KYC verification requirements |
| Recipients | Recipient 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
| Status | Description |
|---|---|
Active | Account is provisioned and ready to use |
ActivationNotStarted | Available but requires manual activation via API |
InProgress | Activation requested, waiting for provisioning |
NotFulfilled | User needs to complete additional verification first |
NotAvailable | Not 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
| Parameter | Type | Description |
|---|---|---|
page_number | integer | Page number, 0-indexed (default: 0) |
page_size | integer | Items 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
| Field | Description |
|---|---|
id | Composite 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. |
currency | Account currency (EUR for SEPA) |
status | Account status: Active, Pending, Blocked, Closed |
account_holder | Name on the account |
account_type | Sepa for SEPA accounts |
details.iban | IBAN for receiving transfers |
details.bic | BIC/SWIFT code |
Account Status
| Status | Description |
|---|---|
Pending | Account details being provisioned |
Active | Ready to receive transfers |
Blocked | Temporarily suspended |
Closed | Permanently closed |
Receiving SEPA Transfers
To receive a SEPA transfer:
- Retrieve the user's SEPA account details using the endpoint above
- Provide the IBAN and BIC to the sender
- 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 Reason | Description |
|---|---|
ErrorNotFound | User not found or not verified |
ErrorInvalidStatus | User account not active |
Error Response Format
{
"error_reason": "ErrorNotFound",
"error_description": "User not found",
"error_category": {
"category": "CategoryNotFound",
"http_status_code": 404
},
"error_details": []
}Updated 8 days ago
