Bank Transfers
Learn how to create transfers to bank accounts using IBAN/SWIFT codes.
Overview
Bank transfers allow you to send money from your Paysera account to external bank accounts. This guide covers:
- Creating transfers to IBAN accounts
- International transfers with SWIFT/BIC codes
- Currency conversion
- Bank-specific requirements
Prerequisites
- MAC authentication credentials (
client_id,mac_key,mac_algorithm) - see Authentication - Sufficient account balance (including fees)
- Valid beneficiary bank details (IBAN/SWIFT)
Creating Bank Transfers
- Domestic (SEPA)
- International
- With Currency Conversion
For transfers within the SEPA (Single Euro Payments Area):
Request:
POST /transfer/rest/v1/transfers HTTP/1.1
Host: wallet.paysera.com
Authorization: MAC id="wkVd93h2uS", ts="1343811600", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="Bp22nWw9qFsz7ux5xOYkCIYJjXAz8mhxTSfJsoOKV3A="
Content-Type: application/json
{
"amount": {
"amount": "250.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "Jane Smith",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"payer": {
"account_number": "EVP9876543210"
},
"purpose": {
"details": "Invoice payment #INV-2024-001"
}
}
Response:
{
"id": "789012",
"status": "new",
"type": "bank",
"amount": {
"amount": "250.00",
"currency": "EUR"
},
"payer": {
"account_number": "EVP9876543210",
"owner_display_name": "My Company Ltd"
},
"beneficiary": {
"type": "bank",
"name": "Jane Smith",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"purpose": {
"details": "Invoice payment #INV-2024-001"
},
"created_at": 1729425600,
"out_commission": {
"amount": "0.50",
"currency": "EUR"
}
}
For transfers outside SEPA or in non-EUR currencies:
Request:
POST /transfer/rest/v1/transfers HTTP/1.1
Host: wallet.paysera.com
Authorization: MAC id="wkVd93h2uS", ts="1343811600", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="Bp22nWw9qFsz7ux5xOYkCIYJjXAz8mhxTSfJsoOKV3A="
Content-Type: application/json
{
"amount": {
"amount": "500.00",
"currency": "USD"
},
"beneficiary": {
"type": "bank",
"name": "International Corp",
"bank_account": {
"account_number": "12345678901234567890",
"bic": "BOFAUS3N",
"country_code": "US"
},
"address": {
"country": "US",
"city": "New York",
"street": "123 Wall Street",
"postal_code": "10005"
}
},
"payer": {
"account_number": "EVP9876543210"
},
"purpose": {
"details": "Business services payment"
}
}
Response:
{
"id": "789013",
"status": "new",
"type": "bank",
"amount": {
"amount": "500.00",
"currency": "USD"
},
"payer": {
"account_number": "EVP9876543210",
"owner_display_name": "My Company Ltd"
},
"beneficiary": {
"type": "bank",
"name": "International Corp",
"bank_account": {
"account_number": "12345678901234567890",
"bic": "BOFAUS3N",
"country_code": "US"
},
"address": {
"country": "US",
"city": "New York",
"street": "123 Wall Street",
"postal_code": "10005"
}
},
"purpose": {
"details": "Business services payment"
},
"created_at": 1729425600,
"out_commission": {
"amount": "15.00",
"currency": "USD"
}
}
When sending money in a different currency than your account balance:
Request:
POST /transfer/rest/v1/transfers HTTP/1.1
Host: wallet.paysera.com
Authorization: MAC id="wkVd93h2uS", ts="1343811600", nonce="nQnNaSNyubfPErjRO55yaaEYo9YZfKHN", mac="Bp22nWw9qFsz7ux5xOYkCIYJjXAz8mhxTSfJsoOKV3A="
Content-Type: application/json
{
"amount": {
"amount": "1000.00",
"currency": "GBP"
},
"beneficiary": {
"type": "bank",
"name": "UK Business Ltd",
"bank_account": {
"iban": "GB29NWBK60161331926819",
"bic": "NWBKGB2L"
}
},
"payer": {
"account_number": "EVP9876543210"
},
"purpose": {
"details": "Goods payment"
},
"auto_currency_convert": true
}
Response:
{
"id": "789014",
"status": "new",
"type": "bank",
"amount": {
"amount": "1000.00",
"currency": "GBP"
},
"payer": {
"account_number": "EVP9876543210",
"owner_display_name": "My Company Ltd"
},
"beneficiary": {
"type": "bank",
"name": "UK Business Ltd",
"bank_account": {
"iban": "GB29NWBK60161331926819",
"bic": "NWBKGB2L"
}
},
"purpose": {
"details": "Goods payment"
},
"created_at": 1729425600,
"out_commission": {
"amount": "5.00",
"currency": "EUR"
}
}
Processing the Bank Transfer
After creating the transfer, follow the standard workflow:
const crypto = require('crypto');
const CLIENT_ID = 'wkVd93h2uS';
const MAC_KEY = 'your_mac_key';
function generateMacAuth(method, uri, host) {
const timestamp = Math.floor(Date.now() / 1000);
const nonce = crypto.randomBytes(16).toString('hex');
const normalizedString = [timestamp, nonce, method, uri, host, '443', ''].join('\n') + '\n';
const mac = crypto.createHmac('sha256', MAC_KEY).update(normalizedString).digest('base64');
return `MAC id="${CLIENT_ID}", ts="${timestamp}", nonce="${nonce}", mac="${mac}"`;
}
const transferId = '789012';
// 1. Reserve the transfer
await axios.put(
`https://wallet.paysera.com/transfer/rest/v1/transfers/${transferId}/reserve`,
{},
{ headers: { 'Authorization': generateMacAuth('PUT', `/transfer/rest/v1/transfers/${transferId}/reserve`, 'wallet.paysera.com') } }
);
// 2. Provide password (if required)
await axios.put(
`https://wallet.paysera.com/transfer/rest/v1/transfers/${transferId}/provide-password`,
{ password: 'your_password' },
{ headers: { 'Authorization': generateMacAuth('PUT', `/transfer/rest/v1/transfers/${transferId}/provide-password`, 'wallet.paysera.com') } }
);
// 3. Register the transfer
await axios.put(
`https://wallet.paysera.com/transfer/rest/v1/transfers/${transferId}/register`,
{},
{ headers: { 'Authorization': generateMacAuth('PUT', `/transfer/rest/v1/transfers/${transferId}/register`, 'wallet.paysera.com') } }
);
Bank Transfer Fees
Different fees apply based on transfer type:
| Transfer Type | Fee Range | Processing Time |
|---|---|---|
| SEPA (EUR) | €0.00 - €1.00 | 1-2 business days |
| EU Non-SEPA | €2.00 - €5.00 | 2-3 business days |
| International | €10.00 - €25.00 | 3-5 business days |
| Express (if available) | Additional €15.00 | Same day |
Note: Intermediary/correspondent banks may charge additional fees.
Validating Bank Account Numbers
Before creating a transfer, validate the IBAN format:
function validateIBAN(iban) {
// Remove spaces and convert to uppercase
iban = iban.replace(/\s/g, '').toUpperCase();
// Check length (varies by country)
if (iban.length < 15 || iban.length > 34) {
return false;
}
// Check format (2 letters, 2 digits, alphanumeric)
const regex = /^[A-Z]{2}[0-9]{2}[A-Z0-9]+$/;
return regex.test(iban);
}
// Example
console.log(validateIBAN('LT123456789012345678')); // true
Common Errors
- Invalid IBAN Format
- Missing SWIFT Code
- Insufficient Funds
- Currency Not Supported
{
"error": "invalid_iban",
"error_description": "The provided IBAN is not valid",
"field": "beneficiary.account_number"
}
{
"error": "missing_swift_code",
"error_description": "SWIFT/BIC code is required for international transfers",
"field": "beneficiary.swift_code"
}
{
"error": "insufficient_funds",
"error_description": "Account balance is not sufficient to cover transfer and fees",
"required": "255.50",
"available": "250.00",
"currency": "EUR",
"breakdown": {
"transfer_amount": "250.00",
"commission": "5.50"
}
}
{
"error": "currency_not_supported",
"error_description": "Bank transfers in this currency are not currently supported",
"currency": "XXX",
"supported_currencies": ["EUR", "USD", "GBP", "PLN"]
}
Required Fields by Transfer Type
SEPA Transfers (EUR within EU)
- ✅ IBAN (beneficiary account number)
- ✅ Beneficiary name
- ✅ Amount
- ✅ Currency (EUR)
- ✅ Purpose/Reference
International Transfers
- ✅ IBAN or Account Number
- ✅ SWIFT/BIC code
- ✅ Beneficiary name and address
- ✅ Bank name and address
- ✅ Amount and currency
- ✅ Purpose/Reference
- ⚠️ Correspondent bank details (sometimes)
Next Steps
- Learn about Batch Transfers
- Review Creating a Transfer
- Explore the API Reference