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.

AFT PAGE REQUEST — POST /v1/{operation}/page
{
  "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
}
DOMESTIC PAYMENT PAGE
{
  "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
}
CROSS-BORDER PAYMENT PAGE
{
  "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
}
VALIDATION ERRORS
{
  "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.

POST /v1/{operation}/page
Operation init_web

Path parameters

NameExampleDescription
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
bgenrofres
transaction_type string (0,any) purchase preauthorization
purchasepreauthorization
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_url string (0,any) Url
error_url string (0,any) Url
redirect boolean
balance string (0,any)
recurring_end_date string (0,any)
recurring_frequency 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

CodeDescription
302Success
esc
navigate open esc close
Copied