Account Funding Transactions Payment Page
AFT functionality through the Paynetics payment page — same Visa flow as the API integration but with the hosted page handling card capture and 3DS.
Overview
This page covers integrating AFT functionality into Paynetics' Acquiring product for payment-page users. It details functional specifications, integration requirements, and use case scenarios. These requirements apply exclusively to Visa transactions; Mastercard is currently excluded.
Merchant and AFT types
AFTs allow moving funds from a Visa account to another Visa or non-Visa account. Common applications include digital wallet top-ups, prepaid card reloading, peer-to-peer transfers, account-to-account transfers, and purchases of liquid and cryptocurrency assets.
MCC in scope. Specific MCCs 6051, 6211, 6012, and conditionally 6540, 4829 — to align with Visa requirements.
Settlement currencies. EUR, USD, and GBP. No restrictions on processing currencies.
Merchant onboarding
All merchants require Visa approval for AFT enablement, potentially causing onboarding delays beyond Paynetics' control. Merchants need a Business Application Identifier (BAI) assigned based on business model. Partners must submit the correct BAI in transaction messages and assume responsibility for accuracy.
Executing AFT via Payment Page
Execute AFT using the POST /v1/{operation}/page endpoint of the Acquiring API. Required attributes vary by country and domestic versus cross-border status. Domestic transactions are those where merchant, acquirer registration country, and card issuance country match.
Required fields for cross-border AFTs include acceptor_legal_name, full sender address (sender_address / sender_city / sender_state / sender_country), sender_name, sender_account_number, recipient_name, and BAI. For cross-border to/from Canada, the full account-owner address block is also mandatory.
Paynetics validates required fields and format upon receipt. Transactions missing required fields or failing validation are rejected with a 11001 validation error identifying the specific missing or incorrect field.
{
"amount": 11.2,
"currency": "BGN",
"language": "bg",
"transaction_type": "Type of transaction to be performed",
"reference": "payment123",
"reference2": "payment123",
"card": "a8db5888-4d44-4f78-97da-ced9baa59bd2",
"user": "123e4567-e89b-12d3-a456-426655440000",
"success_url": "https://test.com",
"error_url": "https://test.com",
"redirect": true,
"balance": "string",
"aft": {
"account_owner_address1": "James Bourchier 76A",
"account_owner_address2": "James Bourchier 76A",
"account_owner_street": "James Bourchier",
"account_owner_postal_code": "1407",
"account_owner_city": "Sofia",
"account_owner_country": "BGR",
"merchant_postal_code": "1000",
"merchant_state": "Sofia",
"acceptor_legal_name": "Paynetics",
"sender_address": "James Bourchier 76A",
"sender_city": "Sofia",
"sender_state": "Sofia",
"sender_country": "BGR",
"sender_name": "John Doe",
"sender_account_number": "efa213ea-b69d-46c4-a690-dde53d615b85",
"recipient_name": "John Doe",
"bai": "AA",
"account_owner_subdivision_code": "abc",
"mvv": "13456ABCD"
},
"recurring_end_date": "2025-01-30T14:27:33.930Z",
"recurring_frequency": 0
}
{
"amount": 0.2,
"currency": "BGN",
"language": "bg",
"transaction_type": "purchase",
"merchant": "string",
"reference": "payment123",
"reference2": "payment123",
"card": "string",
"user": "string",
"success_url": "https://www.paynetics.digital",
"error_url": "https://test.com",
"redirect": true,
"balance": "string",
"aft": {
"bai": "AA"
},
"recurring_end_date": "2025-01-30T08:22:07.186Z",
"recurring_frequency": 0
}
{
"amount": 0.2,
"currency": "EUR",
"language": "en",
"transaction_type": "purchase",
"merchant": "string",
"reference": "payment123",
"reference2": "payment123",
"card": "string",
"user": "string",
"success_url": "https://www.paynetics.digital",
"error_url": "https://test.com",
"redirect": true,
"balance": "string",
"aft": {
"account_owner_address1": "James Bourchier 76A",
"account_owner_address2": "James Bourchier 76A",
"account_owner_street": "James Bourchier",
"account_owner_postal_code": "1407",
"account_owner_city": "Sofia",
"account_owner_country": "BGR",
"merchant_postal_code": "1000",
"merchant_state": "BGR",
"acceptor_legal_name": "Paynetics",
"sender_address": "James Bourchier 76A",
"sender_city": "Sofia",
"sender_state": "BGR",
"sender_country": "BGR",
"sender_name": "John Doe",
"sender_account_number": "efa213ea-b69d-46c4-a690-dde53d615b85",
"recipient_name": "John Doe",
"bai": "AA",
"account_owner_subdivision_code": "abc",
"mvv": "13456ABCD"
},
"recurring_end_date": "2025-01-30T08:22:07.186Z",
"recurring_frequency": 0
}
{
"code": 11001,
"message": "services.general.validation_error",
"key": "services.general.validation_error",
"errors": {
"aft_acceptor_legal_name": "This value should not be blank.",
"aft_sender_address": "This value should not be blank.",
"aft_sender_city": "This value should not be blank.",
"aft_sender_country": "This value should not be blank.",
"aft_sender_name": "This value should not be blank.",
"aft_sender_account_number": "This value should not be blank.",
"aft_recipient_name": "This value should not be blank.",
"aft_bai": "This value should not be blank."
}
}
API reference
Live request / response schema, parameters, example payload, and cURL / Node / Python / PHP code samples — pulled from the OpenAPI spec for post_/v1/{operation}/page.
init_webPath parameters
| Name | Example | Description |
|---|---|---|
operation |
— |
Request body
| Field | Type | Description |
|---|---|---|
amount
|
number (0,any) | Amount of transaction |
currency
|
string (0,any) | Currency of transaction |
language
|
string (0,any) | Language for page |
transaction_
|
string (0,any) | purchase preauthorization |
reference
|
string (0,30) | Reference of payment |
reference2
|
string (0,any) | Reference of payment |
card
|
string (10,any) | Token of previously tokenize card |
user
|
string (0,any) | User |
success_
|
string (0,any) | Url |
error_
|
string (0,any) | Url |
redirect
|
boolean | |
balance
|
string (0,any) | |
recurring_
|
string (0,any) | |
recurring_
|
integer (0,any) |
Example request
{
"amount": 11.2,
"currency": "BGN",
"language": "bg",
"transaction_type": "Type of transaction to be preformed",
"reference": "payment123",
"reference2": "payment123",
"card": "a8db5888-4d44-4f78-97da-ced9baa59bd2",
"user": "123e4567-e89b-12d3-a456-426655440000",
"success_url": "https://test.com",
"error_url": "https://test.com",
"redirect": "boolean",
"balance": "string",
"aft": {
"account_owner_address1": "James Bourchier 76A",
"account_owner_address2": "James Bourchier 76A",
"account_owner_street": "James Bourchier",
"account_owner_postal_code": "ABCDE12345",
"account_owner_city": "Sofia",
"account_owner_country": "BGR",
"merchant_postal_code": "ABCDE123",
"merchant_state": "SOF",
"acceptor_legal_name": "Paynetics",
"sender_address": "James Bourchier 76A",
"sender_city": "Sofia",
"sender_state": "SF",
"sender_country": "BGR",
"sender_name": "John Doe",
"sender_account_number": "efa213eab69d46c4a690",
"recipient_name": "John Doe",
"bai": "string",
"account_owner_subdivision_code": "abc",
"mvv": "13456ABCD"
},
"recurring_end_date": "string",
"recurring_frequency": "integer"
}
Response
| Field | Type | Description |
|---|---|---|
code
|
integer (0,any) |
Example response
{
"code": "integer",
"data": {
"url": "string"
}
}
Errors
| Code | Description |
|---|---|
302 | Success |