Account Funding Transactions (AFT)

Overview

Account Funding Transactions (AFT) are specialized payment types mandated by Visa and Mastercard for specific use cases such as cryptocurrency purchases and wallet loading transactions. MoneyHash now supports AFT natively within the Intent API, allowing you to automatically flag transactions with the appropriate network-specific metadata without changing your existing integration.

What is AFT?

AFT is a transaction type that enables money movement from one account to another, typically used for:

  • Cryptocurrency purchases
  • Wallet funding
  • P2P transfers
  • Bill payments
  • Government disbursements
  • And other account-to-account transfers

When you mark a transaction as AFT, payment networks receive the necessary metadata to properly process and categorize the transaction according to their requirements.

Implementation

To enable AFT for a transaction, add the aft flag and aft_data object to your Intent creation request.

Basic Structure

{
  "amount": 50,
  "amount_currency": "usd",
  "operation": "purchase",
  "aft": true,
  "aft_data": {
    "type": "cryptocurrency",
    "purpose": "crypto_purchase",
    "sender": {
      // Sender information
    },
    "recipient": {
      // Recipient information
    }
  }
}

API Reference

New Fields

FieldTypeRequiredDescription
aftbooleanNoDefault false. When true, aft_data becomes mandatory.
aft_dataobjectConditionalAFT metadata block. Required when aft is true.
aft_data.typeenumYesTransaction type. See Transaction Types.
aft_data.purposeenumYesTransaction purpose. See Transaction Purposes.
aft_data.senderobjectYesSender information with minimal KYC data.
aft_data.recipientobjectYesRecipient information with account details.

Sender Object

FieldTypeRequiredDescription
first_namestringNoSender’s first name
last_namestringNoSender’s last name
addressstringNoSender’s address
postal_codestringNoSender’s postal code
citystringNoSender’s city
countrystringYesSender’s country (ISO-2 code)

Recipient Object

FieldTypeRequiredDescription
account_typeenumYesType of recipient account. See Account Types.
idstringYesRecipient’s wallet/account ID or number
first_namestringNoRecipient’s first name
last_namestringNoRecipient’s last name
addressstringNoRecipient’s address
postal_codestringNoRecipient’s postal code
citystringNoRecipient’s city
countrystringYesRecipient’s country (ISO-2 code)

Enum Values

Transaction Types

ValueDescription
account_to_accountDirect account-to-account transfer
supplier_paymentsPayments to suppliers
bank_initiated_p2pBank-initiated peer-to-peer transfer
bill_paymentBill payment transaction
cash_depositCash deposit to account
card_bill_paymentCredit card bill payment
funds_disbursementGeneral funds disbursement
funds_transferGeneral funds transfer
government_disbursementGovernment-issued payments
loyaltyLoyalty program rewards
merchant_settlementMerchant settlement payment
gambling_payoutGambling winnings payout
payrollSalary/payroll payment
p2pPeer-to-peer transfer
prepaid_topupPrepaid card or account top-up
wallet_transferDigital wallet transfer
cryptocurrencyCryptocurrency purchase or transfer
b2b_paymentBusiness-to-business payment
debit_topupDebit account top-up
otherOther transaction types

Transaction Purposes

ValueDescription
family_supportFinancial support for family
expatriationExpatriate-related transfers
travelTravel-related expenses
educationEducation-related payments
medicalMedical expenses
emergency_needEmergency financial need
savingsSavings transfer
giftsGift payments
otherOther purposes
salarySalary payment
crowd_lendingCrowdfunding or peer lending
crypto_purchaseCryptocurrency purchase
high_risk_securitiesHigh-risk securities trading
donationsCharitable donations
financial_servicesFinancial services payment
insuranceInsurance-related payment
investmentInvestment transaction
it_servicesIT services payment
leisureEntertainment/leisure expenses
pensionPension payment
royaltiesRoyalty payments
high_riskHigh-risk transaction

Account Types

ValueDescription
walletDigital wallet
bank_accountBank account
ibanInternational Bank Account Number
card_numberCard number

Examples

Cryptocurrency Purchase

{
  "amount": 100,
  "amount_currency": "usd",
  "operation": "purchase",
  "webhook_url": "https://webhook.site/example",
  "aft": true,
  "aft_data": {
    "type": "cryptocurrency",
    "purpose": "crypto_purchase",
    "sender": {
      "first_name": "John",
      "last_name": "Doe",
      "address": "123 Main St",
      "postal_code": "10001",
      "city": "New York",
      "country": "US"
    },
    "recipient": {
      "account_type": "wallet",
      "id": "crypto_wallet_123",
      "first_name": "John",
      "last_name": "Doe",
      "country": "US"
    }
  }
}

Wallet Top-up

{
  "amount": 50,
  "amount_currency": "eur",
  "operation": "purchase",
  "aft": true,
  "aft_data": {
    "type": "wallet_transfer",
    "purpose": "other",
    "sender": {
      "first_name": "Maria",
      "last_name": "Garcia",
      "country": "ES"
    },
    "recipient": {
      "account_type": "wallet",
      "id": "digital_wallet_456",
      "first_name": "Maria",
      "last_name": "Garcia",
      "country": "ES"
    }
  }
}

P2P Transfer

{
  "amount": 25,
  "amount_currency": "gbp",
  "operation": "purchase",
  "aft": true,
  "aft_data": {
    "type": "p2p",
    "purpose": "family_support",
    "sender": {
      "first_name": "James",
      "last_name": "Smith",
      "country": "GB"
    },
    "recipient": {
      "account_type": "bank_account",
      "id": "acc_789123",
      "first_name": "Sarah",
      "last_name": "Smith",
      "country": "GB"
    }
  }
}

Validation Rules

Required Fields

  • When aft is true, aft_data must be provided
  • aft_data.type and aft_data.purpose must be valid enum values
  • sender.country and recipient.country must be valid ISO-2 country codes
  • recipient.account_type must be a valid enum value
  • recipient.id must be provided

Optional Fields

  • All address fields except country are optional
  • Name fields are optional but recommended for better transaction processing

Error Responses

Invalid AFT data will return a 400 error with detailed validation messages:

{
  "error": "validation_error",
  "message": "Invalid AFT data",
  "details": [
    {
      "field": "aft_data.type",
      "message": "Invalid transaction type. Must be one of: account_to_account, cryptocurrency, ..."
    },
    {
      "field": "aft_data.sender.country",
      "message": "Invalid country code. Must be a valid ISO-2 code."
    }
  ]
}

Dashboard Integration

AFT data is automatically captured and displayed in your MoneyHash Dashboard:

  1. Navigate to Transactions
  2. Select the specific transaction
  3. View AFT details in the “Funding Info” tab

This provides full visibility into AFT metadata for monitoring and compliance purposes.

Best Practices

  1. Use Appropriate Types: Select the most accurate type and purpose values for your use case
  2. Provide Complete Data: While many fields are optional, providing comprehensive sender and recipient information improves transaction success rates
  3. Validate Country Codes: Ensure country codes are valid ISO-2 format
  4. Monitor Dashboard: Regularly check the Funding Info tab to verify AFT data is being captured correctly
  5. Test Thoroughly: Test AFT transactions in your development environment before going live