Transfers
Use the Transfers API to move funds between Paynetics-managed accounts or to external bank accounts. The transfer type is determined by the combination of currency, debtor & creditor account identifiers, the is_instant flag for eligible EUR transfers, and Paynetics program / network routing configuration.
General behaviour
A transfer request must include:
amountcurrencydebtorcreditor
Depending on the transfer type, additional fields may be required, such as iban, sort_code, account_number, name, address, country, cop, vop, and is_instant.
For some transfer flows, Paynetics may place the transfer into a review / decision queue. In such cases, the transfer can later be retrieved and processed through the queue endpoints below.
{
"code": 0,
"data": {
"transaction": "8b06d551-5453-48e5-842c-c1e2d969da84"
}
}
Queue overview
Based on instance-level configuration, the Internal Wire Transfer (IWT) will be placed in a queue where an external system can decide what should happen with the transfer.
The system will automatically return the transfer in cases where the destination account is:
not found,
closed, or
blocked.
Once the transfer has been added to the queue, a webhook is sent to the external system carrying the token (identifier) of the queue record.
Retry policy
If the webhook is not acknowledged on the first attempt, the system will retry up to 3 more times.
An example of this webhook can be found on the TRANSACTION.SUSPENDED entry in our webhooks page.
List
queue_listPath parameters
| Name | Example | Description |
|---|---|---|
page
|
1 |
Starting from page 1 |
limit
|
20 |
Maximum per page 1000 |
Query parameters
| Name | Example | Description |
|---|---|---|
merchant
|
62513902-9ace-42e9-8cf4-7b16161bdae8 |
Identifier of merchant in Paynetics system |
Response
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code
|
integer (0,any) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data
|
object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Example response
{
"code": 0,
"data": {
"items": [
{
"amount": 1.23,
"currency": "EUR",
"token": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"reference": "Transfer",
"merchant": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"user": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"account": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"balance": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"is_instant": false,
"wires": {
"sender_name": "Company 123",
"sender_iban": "AT483200000012345864",
"sender_bank_name": "Bank 123",
"sender_bank_country": "AT",
"sender_bank_code": "RLNWATWWXXX",
"sender_sort_code": "123456",
"sender_account_number": "1234578",
"receiver_iban": "BG75PATC40022171680259",
"receiver_name": "John Doe",
"receiver_bank_name": "Paynetics AD",
"receiver_bank_country": "BG",
"receiver_bank_code": "PATCBGSFXXX",
"receiver_sort_code": "123456",
"receiver_account_number": "1234578",
"network": "string"
}
}
],
"total_items": "integer"
}
}
Paginated list of queue records waiting for an external decision.
Detail
queue_detailsPath parameters
| Name | Example | Description |
|---|---|---|
token
|
20 |
Token of the queue entry |
Response
| Field | Type | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code
|
integer (0,any) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
data
|
object | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Example response
{
"code": 0,
"data": {
"amount": 1.23,
"currency": "EUR",
"token": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"reference": "Transfer",
"merchant": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"user": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"account": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"balance": "d39ed40b-078c-494f-86de-1a86d4ab5f26",
"is_instant": false,
"wires": {
"sender_name": "Company 123",
"sender_iban": "AT483200000012345864",
"sender_bank_name": "Bank 123",
"sender_bank_country": "AT",
"sender_bank_code": "RLNWATWWXXX",
"sender_sort_code": "123456",
"sender_account_number": "1234578",
"receiver_iban": "BG75PATC40022171680259",
"receiver_name": "John Doe",
"receiver_bank_name": "Paynetics AD",
"receiver_bank_country": "BG",
"receiver_bank_code": "PATCBGSFXXX",
"receiver_sort_code": "123456",
"receiver_account_number": "1234578",
"network": "string"
}
}
}
Fetch a single queue record by its token.
Process
queue_processPath parameters
| Name | Example | Description |
|---|---|---|
token
|
20 |
Token of the queue entry |
Response
| Field | Type | Description |
|---|---|---|
code
|
integer (0,any) |
Example response
{
"code": 0
}
Decision endpoint — instructs the system to release the queued transfer to the destination account.
Return
queue_returnPath parameters
| Name | Example | Description |
|---|---|---|
token
|
20 |
Token of the queue entry |
Request body
| Field | Type | Description |
|---|---|---|
return_
|
string (0,any) required |
Example request
{
"return_reason": "beneficiary-account-closed"
}
Response
| Field | Type | Description |
|---|---|---|
code
|
integer (0,any) |
Example response
{
"code": 0
}
Decision endpoint — returns the funds to the originating account and removes the record from the queue.
Internal transfer
transferRequest body
| Field | Type | Description | |||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
amount
|
number (0,any) required | Amount to be deducted from customer account | |||||||||||||||||||||||||||||||||
currency
|
string (0,any) required | ISO 4217 code. External wires: EUR or GBP. | |||||||||||||||||||||||||||||||||
code
|
string (0,any) | ||||||||||||||||||||||||||||||||||
link
|
string (0,any) | Link to another transaction. Required when code is ST019 or ST020. | |||||||||||||||||||||||||||||||||
reference
|
string (0,any) | ||||||||||||||||||||||||||||||||||
reference2
|
string (0,any) | ||||||||||||||||||||||||||||||||||
reference3
|
string (0,any) | ||||||||||||||||||||||||||||||||||
reference4
|
string (0,any) | ||||||||||||||||||||||||||||||||||
origin_
|
string (0,255) | Origin of the funds (free text) | |||||||||||||||||||||||||||||||||
description
|
string (0,any) | ||||||||||||||||||||||||||||||||||
is_
|
boolean | EUR: true requests SEPA Instant (omitted = SEPA). GBP: omitted or true = Faster Payments, false = CHAPS. | |||||||||||||||||||||||||||||||||
debtor
|
object required | Sender of the funds | |||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
creditor
|
object required | Receiver of the funds | |||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||
cop
|
string (0,any) | Confirmatino of Payee token | |||||||||||||||||||||||||||||||||
vop
|
string (0,any) | Verification of Payee token | |||||||||||||||||||||||||||||||||
skip_
|
boolean | Skip fees for this transfer (requires instance permission). | |||||||||||||||||||||||||||||||||
value_
|
string (0,any) | Requested value date (Y-m-d). External wires only. | |||||||||||||||||||||||||||||||||
Example request
{
"amount": 1.23,
"currency": "EUR",
"code": "string",
"link": "520bec3b-8051-4a2b-928c-81d32b6bfa41",
"reference": "Payment for goods",
"reference2": "Items 1,2,3",
"reference3": "Additional Info",
"reference4": "Additional Info",
"origin_of_funds": "salary",
"description": "Merchant 123",
"is_instant": false,
"debtor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"external_identifier": "123456789",
"iban": "BG85PATC40021918158842",
"sort_code": "123456",
"account_number": "12345678",
"address": "BG, Sofia, James Bouchier 76 A",
"name": "John Doe",
"country": "BG",
"city": "Sofia",
"postcode": "1000"
},
"creditor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"external_identifier": "123456789",
"iban": "BG85PATC40021918158842",
"sort_code": "123456",
"account_number": "12345678",
"address": "BG, Sofia, James Bouchier 76 A",
"name": "John Doe",
"country": "BG",
"city": "Sofia",
"postcode": "1000"
},
"cop": "a5b968e4-ec62-4072-a37f-6b59e35a4e36",
"vop": "a5b968e4-ec62-4072-a37f-6b59e35a4e36",
"skip_fees": false,
"value_date": "2026-10-01"
}
Response
| Field | Type | Description | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
code
|
integer (0,any) | ||||||||||
data
|
object contains required | ||||||||||
|
|||||||||||
Example response
{
"code": 0,
"data": {
"transaction": "8b06d551-5453-48e5-842c-c1e2d969da84",
"trn_status": 0
}
}
Errors
| Code | Description |
|---|---|
11000 | services.general.error — downstream unavailable |
11001 | services.general.validation_error — e.g. currency not EUR/GBP for an external wire, missing SEPA reference, link missing for ST019/ST020 |
11010 | services.idempotency.key.invalid — Idempotency-Key reused with a different payload |
16013 | services.balances.balance_not_updated |
16014 | services.balances.insufficient_funds |
16015 | services.balances.cop_response_failed / debtor_balance_not_found |
16016 | services.balances.creditor_balance_not_found |
16017 | services.balances.conversion_rate_not_available |
16018 | services.balances.blocked_amount |
16019 | services.balances.transfer_to_same_balance |
16020 | services.balances.transfer_to_same_main_account |
16021 | services.balances.vop_response_failed / KYC limit reached |
16030 | services.balances.movement_not_allowed_for_account_type — Reserved account cannot fund an outbound wire |
17001 | services.wires.unsupported_currency_for_account — debtor has no balance in the requested currency |
20001 | services.wires.sepa_instant_not_supported_by_creditor_bank |
20010 | services.wires.operation_not_allowed |
20011 | services.wires.missing_origin_of_funds |
20012 | services.wires.operation_not_permitted |
20013 | services.wires.monitoring_rule_block |
20014 | services.wires.internal_creditor — creditor is a Paynetics account, use an internal transfer |
Use an internal transfer to move funds between two accounts or cards managed within the Paynetics ecosystem. This is the preferred option when both the debtor and creditor are internal Paynetics entities and can be identified using internal references such as balance identifiers.
Typical use cases
- Wallet-to-wallet transfer
- Transfer between two users on the same platform
- Transfer between internal balances
- Card / account movement within the same Paynetics program
Characteristics
- Processed as an internal Paynetics transfer
- Typically real-time
- Does not require external bank routing
- Usually identified by internal account references rather than external bank details
Notes
- Use
balanceas the identifier whenever both parties are Paynetics-managed. - Use
external_identifierto identify a debtor or creditor account / card. cop,vop, andis_instantare not typically needed for internal transfers.- A successful response returns a transaction identifier.
{
"amount": 25.50,
"currency": "EUR",
"reference": "Wallet transfer",
"description": "Internal transfer between platform users",
"debtor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"external_identifier": "customer_001",
"name": "John Doe",
"country": "BG"
},
"creditor": {
"balance": "555f4f2c-6a05-43bb-93ab-7ab76ce5658d",
"external_identifier": "customer_002",
"name": "Jane Doe",
"country": "BG"
}
}
SEPA transfer
Use a SEPA transfer to send a standard EUR bank transfer to an external bank account identified by IBAN. Suitable for regular EUR transfers within the SEPA area where instant execution is not required.
Typical use cases
- Supplier payments in EUR
- Payroll in EUR
- EUR payouts to customer bank accounts
- Standard bank transfer to a beneficiary in the SEPA zone
Characteristics
- External bank transfer
currencymust beEUR- Creditor is typically identified by
iban - May require beneficiary name, address, and country
- Can optionally use Verification of Payee (
vop) before sending
Notes
- Set
currencytoEUR. - Use
is_instant: falsefor standard SEPA. vopis recommended where beneficiary verification is required or supported.- Additional beneficiary data may be required depending on compliance and network rules.
{
"amount": 125.75,
"currency": "EUR",
"reference": "Invoice 2026-041",
"reference2": "Customer payment",
"description": "SEPA credit transfer",
"origin_of_funds": "Salary",
"is_instant": false,
"debtor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"iban": "BG85PATC40021918158842",
"address": "BG, Sofia, James Bouchier 76 A",
"name": "John Doe",
"country": "BG"
},
"creditor": {
"iban": "DE89370400440532013000",
"address": "DE, Berlin, Alexanderplatz 1",
"name": "Acme GmbH",
"country": "DE"
},
"vop": "a5b968e4-ec62-4072-a37f-6b59e35a4e36"
}
SEPA Instant transfer
Use a SEPA Instant transfer to send an eligible EUR bank transfer for near real-time settlement. Use this option when the transfer is eligible for the SEPA Instant rail and immediate processing is required.
Typical use cases
- Urgent customer payout
- Real-time merchant settlement
- Emergency disbursement
- Instant EUR transfer to a verified beneficiary
Characteristics
- External EUR bank transfer
- Routed through SEPA Instant when eligible
- Uses the same transfer endpoint as standard SEPA
- Controlled by the
is_instantflag
Notes
- Set
currencytoEUR. - Set
is_instanttotrue. - Instant execution depends on beneficiary reachability, scheme support, and Paynetics program configuration.
- If a transfer cannot be routed as instant, handling depends on platform configuration and business rules.
{
"amount": 15.00,
"currency": "EUR",
"reference": "Urgent payout",
"description": "SEPA Instant transfer",
"origin_of_funds": "Merchant settlement",
"is_instant": true,
"debtor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"iban": "BG85PATC40021918158842",
"address": "BG, Sofia, James Bouchier 76 A",
"name": "Merchant 123",
"country": "BG"
},
"creditor": {
"iban": "FR7630006000011234567890189",
"address": "FR, Paris, Rue Example 10",
"name": "John Doe",
"country": "FR"
},
"vop": "a5b968e4-ec62-4072-a37f-6b59e35a4e36"
}
FPS transfer
Use an FPS transfer to send a GBP domestic bank transfer to a UK beneficiary using sort code and account number. Suitable for UK domestic payouts and account-to-account transfers over the Faster Payments rail.
Typical use cases
- GBP supplier payments in the UK
- Domestic customer payouts
- UK account-to-account transfers
- Real-time or near real-time GBP disbursements
Characteristics
- Domestic UK transfer
currencymust beGBP- Creditor is typically identified by
sort_code+account_number - Can use Confirmation of Payee (
cop) before sending
Notes
- Set
currencytoGBP. - Use
sort_codeandaccount_numberfor UK domestic routing. - Use
copwhere Confirmation of Payee verification is required or recommended. - Do not use
is_instantfor FPS transfers.
{
"amount": 85.40,
"currency": "GBP",
"reference": "Supplier payout",
"reference2": "April settlement",
"description": "FPS transfer",
"origin_of_funds": "Business revenue",
"debtor": {
"balance": "444f4f2c-6a05-43bb-93ab-7ab76ce5658c",
"sort_code": "123456",
"account_number": "12345678",
"address": "GB, London, 1 Example Street",
"name": "Merchant 123 Ltd",
"country": "GB"
},
"creditor": {
"sort_code": "112233",
"account_number": "87654321",
"address": "GB, Manchester, 10 High Street",
"name": "Supplier Ltd",
"country": "GB"
},
"cop": "a5b968e4-ec62-4072-a37f-6b59e35a4e36"
}
Request fields & routing
Schema reference for the Transfers API: every field accepted on a transfer request, the debtor/creditor object shape, a side-by-side guide for picking the right transfer type, and the routing rules that determine the final rail.
Top-level fields
| Field | Type | Description |
|---|---|---|
amount | number | Amount to transfer. |
currency | string | Transfer currency, e.g. EUR or GBP. |
code | string | Optional transfer code if used by the client integration. |
link | string | Optional link to another transaction. |
reference | string | Primary transfer reference. |
reference2 | string | Additional transfer reference. |
reference3 | string | Additional transfer reference. |
reference4 | string | Additional transfer reference. |
origin_of_funds | string | Optional source-of-funds descriptor. |
description | string | Free-text transfer description. |
is_instant | boolean | Only applicable to SEPA EUR transfers. |
cop | string | Confirmation of Payee token. |
vop | string | Verification of Payee token. |
debtor | object | Party from whom the funds are debited. |
creditor | object | Party receiving the funds. |
Debtor / creditor fields
The debtor and creditor objects may include one or more of the following fields depending on the transfer type.
| Field | Type | Description |
|---|---|---|
balance | string | Internal Paynetics balance identifier. |
external_identifier | string | External or client-side identifier for the account holder. |
iban | string | IBAN used for SEPA or other IBAN-based transfers. |
sort_code | string | UK bank sort code. |
account_number | string | Local bank account number. |
address | string | Full address of the debtor or creditor. |
name | string | Full legal or personal name of the debtor or creditor. |
country | string | Country code or country of the party. |
Transfer type selection guide
| Transfer type | Currency | Typical creditor identifier | Optional validation | Instant flag |
|---|---|---|---|---|
| Internal transfer | EUR / GBP / other supported | balance, internal identifier | not required | not used |
| SEPA transfer | EUR | iban | vop | false |
| SEPA Instant | EUR | iban | vop | true |
| FPS transfer | GBP | sort_code + account_number | cop | not used |
Routing rules
The final transfer rail is determined by:
- Transfer currency
- Debtor and creditor account identifiers
- Whether
is_instantis set for EUR transfers - Paynetics program and network configuration
- Beneficiary validation and eligibility checks where applicable
Clients should provide the most appropriate identifiers for the intended transfer type and rely on Paynetics routing rules to determine the final execution path.
Best practices
- Use internal identifiers for transfers between Paynetics-managed accounts.
- Use IBAN for SEPA and SEPA Instant transfers.
- Use sort code + account number for UK domestic GBP transfers.
- Use VoP before SEPA transfers when beneficiary verification is required.
- Use CoP before FPS transfers when beneficiary verification is required.
- Provide
name,address, andcountryfor external transfers unless already known from the customer profile. - Use
is_instant: trueonly for eligible EUR instant transfers.
Confirmation of Payee
copRequest body
| Field | Type | Description |
|---|---|---|
account_
|
string (0,any) | |
sort_
|
string (0,any) | |
account_
|
string (0,any) | |
account_
|
string (0,any) | |
secondary_
|
string (0,any) | |
user
|
string (0,any) | |
merchant
|
string (0,any) |
Example request
{
"account_number": "Account Number",
"sort_code": "Sort Code",
"account_type": "Business|Personal",
"account_name": "Account Owner Name",
"secondary_reference": "Secondary Reference",
"user": "User Token",
"merchant": "Merchant Token"
}
Response
| Field | Type | Description | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code
|
integer (0,any) | |||||||||||||||||||||||||
data
|
object contains required | |||||||||||||||||||||||||
|
||||||||||||||||||||||||||
Example response
{
"code": 0,
"data": {
"token": "0ba5e81d-c43b-4008-b2d6-0d390f6f8c08",
"report": {
"match": "true",
"reason": "Reason Code",
"name": "Account Owner Name"
}
}
}
Confirmation of Payee (CoP) — verify that an account name and identifier match before initiating a transfer.
{
"account_number": "12345678",
"sort_code": "112233",
"account_type": "Business",
"account_name": "Supplier Ltd",
"secondary_reference": "Supplier onboarding",
"user": "User Token",
"merchant": "Merchant Token"
}
Verification of Payee
vopRequest body
| Field | Type | Description |
|---|---|---|
iban
|
string (0,any) | |
account_
|
string (0,any) | Individual account holder name. Mutually exclusive with organisation_id. |
organisation_
|
string (0,any) | Legal Entity Identifier or equivalent organisation identifier. Mutually exclusive with account_holder_name. |
secondary_
|
string (0,any) | |
user_
|
string (0,any) | |
merchant_
|
string (0,any) |
Example request
{
"iban": "GB82WEST12345698765432",
"account_holder_name": "John Doe",
"organisation_id": "549300DTUYXVMJXZNY75",
"secondary_reference": "Secondary Reference",
"user_token": "user_token",
"merchant_token": "merchant_token"
}
Response
| Field | Type | Description | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
code
|
integer (0,any) | ||||||||||||||||
data
|
object | ||||||||||||||||
|
|||||||||||||||||
Example response
{
"code": 0,
"data": {
"vop_token": "0ba5e81d-c43b-4008-b2d6-0d390f6f8c08",
"result": "MTCH",
"matched_name": "Account Owner Name",
"timestamp": "2026-03-12T10:22:11.123Z"
}
}
Errors
| Code | Description |
|---|---|
11000 | services.general.error |
11001 | services.general.validation_error |
Verification of Payee (VoP) — verify the legal name and account identifier of an EU SEPA payee before initiating a transfer.
{
"iban": "DE89370400440532013000",
"account.holder.name": "Acme GmbH",
"secondary.reference": "Invoice payment",
"user.token": "user_token",
"merchant.token": "merchant_token"
}