Account Funding Transactions via API
Account Funding Transactions (AFTs) — transfer funds from a Visa account to another Visa or non-Visa account via API. Used for wallet top-ups, prepaid loads, P2P, A2A, and crypto purchases.
Overview
This page covers integrating Account Funding Transactions (AFTs) into the Paynetics Acquiring product via API. It covers functional details, integration requirements, and use cases for partners and merchants implementing AFTs in compliance with Visa regulations. Currently, Mastercard transactions are excluded.
Merchant and AFT types
AFTs involve transferring funds from a Visa account to another Visa or non-Visa account. Common use cases:
- Account top-ups: funding digital wallets via linked payment cards or bank accounts.
- Prepaid card load / reload: adding funds to prepaid cards owned by the same individual or entity.
- Person-to-person transfers: funding accounts for P2P transfers.
- Account-to-account transfers: moving funds between personal accounts.
- Purchase of liquid and cryptocurrency assets.
Out of scope. Mastercard transactions are added starting August 2025 per mandate. Pre-authorization and capture transactions are not included currently.
MCC in scope. The integration replaces standard purchase transactions with AFTs for specific Merchant Category Codes (6051, 6211, 6012, and conditionally 6540, 4829) according to Visa requirements, including additional information for cross-border transactions.
Recipient currency and country coverage. Supported settlement currencies are EUR, USD, and GBP. Processing currencies have no specific restrictions, and country support remains unchanged.
Merchant onboarding
All merchants require Visa approval to enable AFTs, which may cause onboarding delays outside Paynetics' control. AFTs require assigning a Business Application Identifier (BAI) based on the merchant's business model. Paynetics determines the correct BAI during onboarding, but partners must submit it in the transaction message and bear responsibility for accuracy.
Fees. AFT transactions have different interchange fees based on business case, indicated by the BAI attribute in the transaction message. AFT interchange fees are generally higher than standard purchase transactions.
Executing AFT
Use the POST /v1/purchase endpoint of the Acquiring API. The request validates all required fields for accurate classification and processing — AFT transactions with missing fields are rejected. Paynetics directly populates the MCC code from its system before forwarding to the processor.
Required fields
account_owner_address1/account_owner_address2— account owner street and number. Mandatory for cross-border transactions to/from Canada. Max 99 bytes EBCDIC.account_owner_street,_postal_code,_city,_country,_subdivision_code— full address fields. Mandatory for cross-border to/from US or Canada.merchant_postal_code,merchant_state— mandatory for cross-border AFTs destined to Australia or Canada.acceptor_legal_name— full acceptor legal business name. Mandatory for cross-border money/non-money transfer AFTs.sender_address,sender_city,sender_state,sender_country,sender_name— sender details. Mandatory for cross-border transactions.sender_account_number— the recipient account being funded by the AFT. Internal token, user ID token, or other unique identifier. Mandatory.recipient_name— cardholder's name. Mandatory.BAI— Business Application Identifier. Possible values:AA(account-to-account),FT(funds transfer),LA(liquid assets). Required globally.mvv— Merchant Verification Value. Required only for staging wallets, not used currently.
Paynetics checks for required fields and validates field formats upon receiving a request. An error is thrown for the first detected missing or incorrect field.
{
"reference": "string",
"reference2": "string",
"industry_specific_transaction": "string",
"client_fingerprint": {
"location_finger_print": "",
"ip_address": "127.0.0.1",
"geo_location": "string",
"device_type": "01",
"operating_type_and_version": "WI11",
"browser_type_and_version": "CH88",
"email": "johndoe@example.com"
},
"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": "2 Bahnhofstrasse",
"sender_city": "Zurich",
"sender_state": "Zurich",
"sender_country": "CHE",
"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"
},
"merchant": "string",
"amount": 1,
"currency": "string",
"card": "string",
"card_number": "string",
"card_expiration_month": "01",
"card_expiration_year": "string",
"cardholder_name": "string",
"cvv2": "1531",
"cavv": "",
"version": 2,
"balance": "efa223ea-b69d-46c4-a690-aae53d615b45",
"directory_transaction_id": "stringstringstringstringstringstring",
"eci": "00"
}
{
"code": 0,
"data": {
"card_number": "string",
"processing_code": "string",
"amount": 0,
"stan": "string",
"local_time": "string",
"local_date": "string",
"auth_code": "string",
"response_code": "string",
"card_acceptor_terminal_id": "string",
"card_acceptor_identification_code": "string",
"currency": "string",
"transaction": "string",
"error_details": "string",
"cvv_status": "string",
"avs_status": "string",
"ccti_id": "string",
"transaction_stamp": "string",
"retrieval_reference_number": "string",
"card": "string",
"original_network_response_code": "string",
"action_code": "string"
}
}
API reference
Live request / response schema, parameters, example payload, and cURL / Node / Python / PHP code samples — pulled from the OpenAPI spec for post_/v1/purchase/{init}.
purchasePath parameters
| Name | Example | Description |
|---|---|---|
init |
— |
Token returned from /v1/init. Not required |
Request body
| Field | Type | Description |
|---|---|---|
reference2
|
string (0,any) | |
industry_
|
string (0,any) | |
moto
|
boolean | |
zip
|
string (0,any) | |
address
|
string (0,any) | |
balance
|
string (0,any) | |
fee
|
number (0,any) | |
sca_
|
string (0,any) | |
mpg_
|
string (0,any) | |
card_
|
string (0,any) | |
card_
|
string (0,any) | |
merchant
|
string (0,any) | |
terminal
|
string (0,any) | |
user
|
string (0,any) | |
currency
|
string (0,any) | |
card
|
string (0,any) | |
card_
|
string (0,any) | |
reference
|
string (0,any) | |
cardholder_
|
string (2,45) | |
cvv2
|
string (0,any) | |
mid
|
string (0,any) | |
xid
|
string (28,28) | |
cavv
|
string (28,28) | |
version
|
integer (0,any) | |
directory_
|
string (36,36) | |
resolution
|
string (0,any) | |
eci
|
string (0,2) | |
recurring_
|
integer (0,any) | |
initial_
|
string (0,any) | |
transaction_
|
string (0,any) | |
settlement_
|
string (0,any) |
Example request
{
"reference2": "string",
"industry_specific_transaction": "string",
"moto": "boolean",
"zip": "string",
"address": "string",
"balance": "string",
"fee": "number",
"financial_institution_service_data": {
"date_of_birth": "2021-12-12",
"postal_code": "string",
"surname": "string"
},
"client_fingerprint": {
"location_finger_print": "",
"ip_address": "127.0.0.1",
"geo_location": "string",
"device_type": "string",
"operating_type_and_version": "WI11",
"browser_type_and_version": "CH88",
"email": "string"
},
"delivery_details": {
"delivery_name": "John Doe",
"delivery_street_name": "James Bourchier 76A",
"delivery_zip": "1407",
"delivery_city": "Sofia",
"delivery_country": "BG"
},
"sca_exemption": "string",
"wallet_payment": {
"wallet_identifier": "apple-pay",
"digital_payment_cryptogram": "string",
"remote_commerce_acceptor_identifier": "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"
},
"partner_data": {
"independent_sales_organization_id": "00001111222"
},
"market_specific_extensions": {
"mcc": "0000"
},
"additional_clearing_data": {
"merchant_street": "James Bourchier",
"merchant_postcode": "ABCDE12345"
},
"mpg_id": "string",
"card_expiration_month": "string",
"card_expiration_year": "string",
"merchant": "string",
"terminal": "string",
"user": "string",
"amount": "number",
"currency": "string",
"card": "string",
"card_number": "string",
"reference": "string",
"cardholder_name": "string",
"cvv2": "string",
"mid": "string",
"card_acceptor": {
"name": "string"
},
"xid": "string",
"cavv": "string",
"version": "integer",
"directory_transaction_id": "string",
"resolution": "string",
"eci": "string",
"recurring_type": "integer",
"initial_transaction": "string",
"transaction_stamp": "string",
"settlement_date": "string"
}
Response
| Field | Type | Description |
|---|---|---|
code
|
integer (0,any) |
Example response
{
"code": "integer",
"data": {
"card_number": "string",
"processing_code": "string",
"amount": "number",
"stan": "string",
"local_time": "string",
"local_date": "string",
"auth_code": "string",
"response_code": "string",
"card_acceptor_terminal_id": "string",
"card_acceptor_identification_code": "string",
"currency": "string",
"transaction": "string",
"external_transaction_id": "string",
"error_details": "string",
"cvv_status": "string",
"avs_status": "string",
"ccti_id": "string",
"transaction_stamp": "string",
"retrieval_reference_number": "string",
"card": "string",
"original_network_response_code": "string",
"action_code": "string",
"order": "string"
}
}