Overview
An Account Funding Transaction (AFT) pulls funds from a card and deposits or transfers those funds into another account. The primary use cases for AFTs are:
- Funding an account owned by the same person; for example, topping up a pre-paid card or adding funds to a digital wallet account.
- Funding an account owned by a different person; for example, P2P payments or pulling funds from a merchant’s card account for disbursing payroll to its employees.
Merchants can implement AFTs using Nuvei’s server-to-server REST 1.0 API and Web SDK integration methods.
Availability
- Visa Direct; Mastercard Send in the EU; other cards and markets to be supported in a future release.
- AFT-enabled merchants only.
- Domestic transactions and, in selected markets, cross-border transactions.
- Works with Sale and Auth & Settle flows. P2P payment uses a dedicated API.
- Cashier supports AFTs for wallet transfers and for fund transfers.
Prerequisites
AFTs are relevant only for merchants offering funding transactions. To begin using AFTs, contact Nuvei to configure your merchant account to use this transaction type. After your account is configured, Nuvei converts your standard transactions into AFTs; you do not have to modify your existing integration.
REST Implementation
This topic describes the steps to integrate AFTs into the standard Server-to-Server REST payment flow.
1. Perform the standard Server-to-Server REST integration steps up to the Payment step.
2. Perform the Payment step.
There are two possible flows for a /payment
request: 3DS or non-3DS.
Include the following recipientDetails
block and its parameters in the relevant /payment
request.
recipientDetails.firstName
– Destination account holder’s first name.recipientDetails.lastName
– Destination account holder’s last name.
For non-domestic AFTs, the merchant should include the following sender data:
Parameter Description | Parameter | Requirements | Format |
---|---|---|---|
Sender first name | firstName under billingAddress | Required on non-domestic and Europe intra-EEA AFTs |
|
Sender last name | lastName under billingAddress |
||
Sender address | address under billingAddress |
|
|
Sender city | city under billingAddress |
|
|
Sender state | state under billingAddress | Required on non-domestic AFTs to/from US and Canada | ISO county/province/state/territory/union territory code |
Sender country | country under billingAddress | Required on non-domestic AFTs | 2-letter ISO country code |
Select the relevant flow:
- 3D-Secure v2 (which contains the “first”
/payment
request) - Non-3DS (without liability shift)
/payment
request:
Example of a Non-3DS /payment
Request Showing the recipientDetails
Block
{ "sessionToken":"<sessionToken from /getSessionToken>", "merchantId":"<your merchantId>", "merchantSiteId":"<your merchantSiteId>", "clientRequestId":"<unique request ID in merchant system>", "amount":"200", "currency":"USD", "userTokenId":"<unique customer identifier in merchant system>", "clientUniqueId":"<unique transaction ID in merchant system>", "paymentOption":{ "card":{ "cardNumber":"4000027891380961", "cardHolderName":"John Smith", "expirationMonth":"12", "expirationYear":"2030", "CVV":"217" } }, "relatedTransactionId":"<transactionId returned from initPayment>", "billingAddress":{ "country":"US", "email":"[email protected]" }, "deviceDetails":{ "ipAddress":"<customer's IP address>" }, "recipientDetails": { "firstName": "string", "lastName": "string" }, "timeStamp":"<YYYYMMDDHHmmss>", "checksum":"<calculated checksum>" }
The /payment
response contains:
isAFT
– Indicates whether the transaction was processed as a Sale (False) or as an AFT transaction (True).isAFTOverriden
- True – Merchant can submit Sales and AFT transactions.
- False – Merchant can only submit AFT transactions.
/settleTransaction
and /refundTransaction
responses also contain isAFT
, which indicates whether the original payment transaction was processed as a Sale or an AFT transaction.
Example of a Non-3DS /payment
Response
{ "internalRequestId":691376548, "status":"SUCCESS", "errCode":0, "reason":"", "merchantId":"479748173730597238", "merchantSiteId":"204388", "version":"1.0", "clientRequestId":"20230612095910", "sessionToken":"4bb43678-9d50-46a9-8980-73e2658117ee", "orderId":"370540478", "isAFT":"True", "isAFTOverridden": "True", "userTokenId":"asdadsw4", "paymentOption":{ "userPaymentOptionId":"91315468", "card":{ "ccCardNumber":"4****5032", "bin":"400002", "last4Digits":"5032", "ccExpMonth":"12", "ccExpYear":"25", "acquirerId":"19", "cvv2Reply":"", "avsCode":"", "cardType":"Credit", "cardBrand":"VISA", "issuerBankName":"River Valley Credit Union", "issuerCountry":"GB", "isPrepaid":"false", "threeD":{ } } }, "transactionStatus":"APPROVED", "gwErrorCode":0, "gwExtendedErrorCode":0, "issuerDeclineCode":"", "issuerDeclineReason":"", "transactionType":"Sale", "transactionId":"711000000023888533", "externalTransactionId":"", "authCode":"111407", "customData":"", "fraudDetails":{ "finalDecision":"Accept" }, "externalSchemeTransactionId":"", "orderTransactionId":1201801248 }
The /payment
DMN includes the following AFT-specific parameters:
isAFT
=True or FalseisAFTOverridden
=True or FalserecipientFirstName
=RecFNamerecipientLastName
=RecLName
3. Continue with the next relevant Server-to-Server REST integration steps, according to the payment flow you are implementing.
Web SDK Implementation
To integrate AFTs using Web SDK, perform the steps for the relevant Web SDK flow and:
- Include the
recipientDetails
block and its parameters in the server-side/openOrder
API request:recipientDetails.firstName
– Destination account holder’s first name.recipientDetails.lastName
– Destination account holder’s last name.
- For non-domestic AFTs – In the
createPayment()
request, include sender data according to the table above.