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
| Field | Type | Required | Description |
|---|---|---|---|
aft | boolean | No | Default false. When true, aft_data becomes mandatory. |
aft_data | object | Conditional | AFT metadata block. Required when aft is true. |
aft_data.type | enum | Yes | Transaction type. See Transaction Types. |
aft_data.purpose | enum | Yes | Transaction purpose. See Transaction Purposes. |
aft_data.sender | object | Yes | Sender information with minimal KYC data. |
aft_data.recipient | object | Yes | Recipient information with account details. |
Sender Object
| Field | Type | Required | Description |
|---|---|---|---|
first_name | string | No | Sender’s first name |
last_name | string | No | Sender’s last name |
address | string | No | Sender’s address |
postal_code | string | No | Sender’s postal code |
city | string | No | Sender’s city |
country | string | Yes | Sender’s country (ISO-2 code) |
Recipient Object
| Field | Type | Required | Description |
|---|---|---|---|
account_type | enum | Yes | Type of recipient account. See Account Types. |
id | string | Yes | Recipient’s wallet/account ID or number |
first_name | string | No | Recipient’s first name |
last_name | string | No | Recipient’s last name |
address | string | No | Recipient’s address |
postal_code | string | No | Recipient’s postal code |
city | string | No | Recipient’s city |
country | string | Yes | Recipient’s country (ISO-2 code) |
Enum Values
Transaction Types
| Value | Description |
|---|---|
account_to_account | Direct account-to-account transfer |
supplier_payments | Payments to suppliers |
bank_initiated_p2p | Bank-initiated peer-to-peer transfer |
bill_payment | Bill payment transaction |
cash_deposit | Cash deposit to account |
card_bill_payment | Credit card bill payment |
funds_disbursement | General funds disbursement |
funds_transfer | General funds transfer |
government_disbursement | Government-issued payments |
loyalty | Loyalty program rewards |
merchant_settlement | Merchant settlement payment |
gambling_payout | Gambling winnings payout |
payroll | Salary/payroll payment |
p2p | Peer-to-peer transfer |
prepaid_topup | Prepaid card or account top-up |
wallet_transfer | Digital wallet transfer |
cryptocurrency | Cryptocurrency purchase or transfer |
b2b_payment | Business-to-business payment |
debit_topup | Debit account top-up |
other | Other transaction types |
Transaction Purposes
| Value | Description |
|---|---|
family_support | Financial support for family |
expatriation | Expatriate-related transfers |
travel | Travel-related expenses |
education | Education-related payments |
medical | Medical expenses |
emergency_need | Emergency financial need |
savings | Savings transfer |
gifts | Gift payments |
other | Other purposes |
salary | Salary payment |
crowd_lending | Crowdfunding or peer lending |
crypto_purchase | Cryptocurrency purchase |
high_risk_securities | High-risk securities trading |
donations | Charitable donations |
financial_services | Financial services payment |
insurance | Insurance-related payment |
investment | Investment transaction |
it_services | IT services payment |
leisure | Entertainment/leisure expenses |
pension | Pension payment |
royalties | Royalty payments |
high_risk | High-risk transaction |
Account Types
| Value | Description |
|---|---|
wallet | Digital wallet |
bank_account | Bank account |
iban | International Bank Account Number |
card_number | Card 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
aftistrue,aft_datamust be provided aft_data.typeandaft_data.purposemust be valid enum valuessender.countryandrecipient.countrymust be valid ISO-2 country codesrecipient.account_typemust be a valid enum valuerecipient.idmust be provided
Optional Fields
- All address fields except
countryare 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:
- Navigate to Transactions
- Select the specific transaction
- View AFT details in the “Funding Info” tab
This provides full visibility into AFT metadata for monitoring and compliance purposes.
Best Practices
- Use Appropriate Types: Select the most accurate
typeandpurposevalues for your use case - Provide Complete Data: While many fields are optional, providing comprehensive sender and recipient information improves transaction success rates
- Validate Country Codes: Ensure country codes are valid ISO-2 format
- Monitor Dashboard: Regularly check the Funding Info tab to verify AFT data is being captured correctly
- Test Thoroughly: Test AFT transactions in your development environment before going live
Updated 4 days ago