Create transfer
POST https://wallet.paysera.com/transfer/rest/v1/transfers
Create transfer in the system. Created transfer is invisible and will be deleted if no more actions are performed.
Authorization
This endpoint requires MAC (Message Authentication Code) authentication.
Authorization Header Format:
Authorization: MAC id="CLIENT_ID", ts="TIMESTAMP", nonce="RANDOM_STRING", mac="MAC_HASH", ext="body_hash=BODY_HASH"
Example:
Authorization: MAC id="a9b8c7d6e5f4g3h2", ts="1234567890", nonce="xyz123abc456def", mac="dGhpcyBpcyBhIHJhbmRvbSBtYWMgaGFzaCB2YWx1ZQ==", ext="body_hash=cmFuZG9tQm9keUhhc2hWYWx1ZQ%3D%3D"
For more details, see the Authentication section.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
bank_key | string | An optional parameter that specifies the bank key to be used for routing the transfer. If provided, the transfer will only be created if the specified bank key matches an available routing option. This acts as a safeguard to ensure that transfers are executed through the correct banking route. If an incorrect or non-matching bank key is specified, the transfer request will be rejected. If the parameter is not provided, routing will proceed as normal without this additional validation. | |
amount | object | ✓ | Amount to transfer |
beneficiary | object | ✓ | Recipient details |
payer | object | ✓ | Sender details |
final_beneficiary | object | This is used where available (for example in SEPA transfers) to provide information about final beneficiary of transfered funds. Just ignore if it's not required in your case | |
perform_at | integer | Timestamp when Transfer should be perfomed. Leave empty to perform as soon as possible | |
charge_type | string | It's used only for some bank transfers. It's used when banks could charge additional commissions in between payer and beneficiary bank or when beneficiary bank could charge additional commissions. SHA is shared, OUR is payer side. For OUR commission is greater but beneficiary should not be charged - whole specified amount should reach beneficiary. Unfortunatelly, this is still not the case for some rare conditions | |
urgency | string | For SEPA transfers, standard means that transfer is made from your IBAN, it's processed only in work days. urgent means that transfer is made from our IBAN and is faster to reach the beneficiary | |
notifications | object | ||
purpose | object | Transfer purpose and details | |
password | object | It's used only for internal Paysera transfers. Ignore if not explicitly needed | |
cancelable | boolean | Indicates if the transfer can be canceled. Defaults to true. When you set it to false always wait for the statuses ready, processing or done, as it's transfer statuses from which this parameter starts working. | |
auto_currency_convert | boolean | Indicates if currency convert could be used. Defaults to false. | |
auto_charge_related_card | boolean | Indicates if related card can be charged. Defaults to false. | |
auto_process_to_done | boolean | Indicates if the transfer should be processed automatically if possible. Defaults to true. | |
reserve_until | integer | Only for internal Paysera transfers. Designates the time when, if not confirmed, transfer funds will return to sender. UNIX timestamp | |
callback | object | Webhook configuration for receiving real-time transfer status updates. | |
validation_groups | array | When simulating the transfer, you can specify validation groups to skip all other validations. Defaults to null. |
amount
| Field | Type | Required | Description |
|---|---|---|---|
amount | string | ✓ | Transfer amount |
currency | string | ✓ | Currency code (ISO 4217), 3 characters |
beneficiary
| Field | Type | Required | Description |
|---|---|---|---|
type | string | ✓ | Beneficiary type: paysera, payza, webmoney, tax, bank, privatbank, single_window. The matching *_account object must be provided for the given type — for example bank_account when the type is bank. No other *_account can be provided in this case |
name | string | Beneficiary name (required when transfer is made to other bank) | |
person_type | string | natural or legal. This is optional and designates whether beneficiary is legal entity or a person | |
address | object | Beneficiary address. Accepts address_line and country_code only | |
additional_information | object | Beneficiary city and country. Required on transfers that are not SEPA | |
identifiers | object | It's optional and should be provided if you know identifier (like company code, personal code etc.) of beneficiary. KPP and TAX code could be required in Russia | |
client_identifier | object | Beneficiary identification type - legal document that verifies the identity of the account. Only one identification type is allowed | |
bank_account | object | Provide when type is bank | |
paysera_account, payza_account, webmoney_account, tax_account, privatbank_account, single_window_account | object | Provide the one matching type |
beneficiary.address
| Field | Type | Required | Description |
|---|---|---|---|
address_line | string | Address line. This is the street address only — the city and the country belong in additional_information and are ignored if placed here | |
country_code | string | Country code. This is not used when creating a transfer — the beneficiary's country must be supplied in additional_information.country |
beneficiary.additional_information
| Field | Type | Required | Description |
|---|---|---|---|
type | string | ✓ | natural or legal. Designates whether beneficiary is legal entity or a person |
city | string | Beneficiary city, for example London | |
country | string | Use upper case ISO 3166-1 alpha-2 codes, for example US | |
state | string | Beneficiary state | |
postal_code | string | Beneficiary postcode | |
bank_branch_code | string | Bank branch code |
beneficiary.bank_account
| Field | Type | Required | Description |
|---|---|---|---|
iban | string | IBAN number | |
account_number | string | Account number | |
country_code | string | We use ISO 3166-1 alpha-2 for country codes. This is not required if IBAN is specified. This is the country of the beneficiary bank, not of the beneficiary | |
bic | string | This should be SWIFT bank code, if available for that transfer | |
bank_code | string | This is local bank code and depends on Country. It's not required if IBAN is provided | |
sort_code | string | Sort code | |
bank_title | string | Bank title | |
bank_address | object | Bank address. Accepts address_line and country_code | |
correspondent_bank | object | Accepts account_number, bank_code and bank_title |
payer
| Field | Type | Required | Description |
|---|---|---|---|
account_number | string | ✓ | This is your account number in Paysera system |
reference | string | Only used for tax transfers | |
client_identifier | object | Identifier of the payer. Required for Lithuanian budget payments to VMI from a private client: send the payer's personal code as {"type": "personal_number", "value": "..."}. Allowed type values: personal_number, company_code, customer_code, passport_number, tax_payer_code | |
first_name | string | ||
last_name | string | ||
mobile_phone_number | string | ||
birth_date | string | For example 1999-07-05 | |
country_code | string | For example LT | |
region | string | ||
city | string | ||
street | string | ||
house | string | ||
apartment | string | ||
birth_country_code | string | For example UA | |
document | object | Accepts type (passport, identity_card, residence_permit), series, number, issued_date and issuer |
purpose
| Field | Type | Required | Description |
|---|---|---|---|
details | string | Transfer purpose details. Always required, unless it's SEPA transfer and reference is specified | |
reference | string | Payment reference. For Lithuanian budget payments to VMI or SODRA, send the payment code (įmokos kodas) in this field, for example 5660. On SEPA transfers send either details or reference, not both | |
vo_code | string | VO code is used only for transfers to Russia | |
ocr_code | string | OCR code is used for transfers to Norway, Sweden, Finland and Denmark | |
code | string | cash_in, cash_out, payment or app_transfer. Leave this one empty unless explicitly required to fill | |
purpose_code | string | Purpose code is to classify the nature of the transfer. See /public/transfer/rest/v1/purpose-codes for a list of codes. Optional unless required for specific destinations | |
details_options | object | Accepts preserve (boolean). For some countries, like Great Britain, details can be really short. In such cases we usually put a link to our page where beneficiary could find all the details of the transfer. In some cases it's important that beneficiary would receive original details, as it could include reference number etc. This field controls this behaviour |
Example
Request
Endpoint: POST https://wallet.paysera.com/transfer/rest/v1/transfers
Content-Type: application/json
Authorization: MAC id="CLIENT_ID", ts="TIMESTAMP", nonce="RANDOM_STRING", mac="MAC_HASH", ext="body_hash=BODY_HASH"
{
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "John Doe",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"payer": {
"account_number": "EVP7654321"
},
"purpose": {
"details": "Payment for services"
}
}
Response
{
"id": "12345678",
"hash": "abc123def456",
"status": "done",
"created_at": 1729425600,
"performed_at": 1729425660,
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "John Doe",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"payer": {
"account_number": "EVP7654321"
},
"cancelable": true,
"allowed_to_cancel": true,
"initiator": {
"user_id": 321
},
"out_commission": {
"amount": "0.50",
"currency": "EUR"
}
}
Example: Lithuanian budget payment to VMI
A budget payment to the Lithuanian tax authority (VMI) or to SODRA is a transfer to the institution's bank account. Send the payment code (įmokos kodas) in purpose.reference and do not send purpose.details. Send the payer's personal code in payer.client_identifier (use company_code instead of personal_number when the payer is a company). The payment code tells VMI which tax is paid. The identification code tells VMI who is paying.
Request
Endpoint: POST https://wallet.paysera.com/transfer/rest/v1/transfers
Content-Type: application/json
Authorization: MAC id="CLIENT_ID", ts="TIMESTAMP", nonce="RANDOM_STRING", mac="MAC_HASH", ext="body_hash=BODY_HASH"
{
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "Valstybinė mokesčių inspekcija",
"bank_account": {
"iban": "LT247300010112394300",
"bic": "HABALT22"
}
},
"payer": {
"account_number": "EVP7654321",
"client_identifier": {
"type": "personal_number",
"value": "12345678901"
}
},
"purpose": {
"reference": "5660"
}
}
AUTHORIZATION: HTTP
REQUEST
Base URL
https://wallet.paysera.com
Body REQUIRED
{
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "John Doe",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"payer": {
"account_number": "EVP7654321"
},
"purpose": {
"details": "Payment for services"
}
}
RESPONSE
Transfer created successfully
{
"id": "12345678",
"hash": "abc123def456",
"status": "done",
"created_at": 1729425600,
"performed_at": 1729425660,
"amount": {
"amount": "100.00",
"currency": "EUR"
},
"beneficiary": {
"type": "bank",
"name": "John Doe",
"bank_account": {
"iban": "LT123456789012345678"
}
},
"payer": {
"account_number": "EVP7654321"
},
"cancelable": true,
"allowed_to_cancel": true,
"initiator": {
"user_id": 321
},
"out_commission": {
"amount": "0.50",
"currency": "EUR"
}
}