Perform an account-to-account (P2P) transfer
Learn how to facilitate an account-to-account transfer between two users on your platform. This guide covers the process for moving funds internally from one user's balance to another.
The user in this document pertains to both the individual and business user types.
Use Cases
- You want to transfer funds from one user account (source) to another user account (recipient) for payments of goods or services rendered by the recipient.
- You want to implement a feature in your application that will allow users (source) to pay another user (recipient) for payments of goods or services rendered by the recipient.
- You want to implement a feature in your application that will allow business users (source) to transfer rebates and rewards to another user (recipient) in the platform.
- You want to implement a feature in your application that will allow business users (source) to credit salaries and benefits to another user (recipient) in the platform.
Prerequisites
- The user profile risk assessment status must not be
risk_flagged. - The user profile must be in an
activestatus. - The user must have an
approvedKYC or KYB status. - The user account or wallet must be in an
activestatus. - The user account's current
topup_limitsandpurse_max_limitmust have enough buffer to accommodate the incoming credit amount.
API Workflow
1
Finish your internal validations
Ensure that your internal validations are completed. Confirm the receipt of funds to the wallet if the transfer relies on external dependencies.
2
Prepare the payload
To facilitate compliance and tracking, prepare the required payload to tag all transactions and identify the source of funds.
Additional transaction metadata
details.pp- Payment processor, which identifies which type of payment was processed or executeddetails.transaction_comments- Any message or internal comments on the transactiondetails.payment_ref- The payment reference identifier generated by the payment service providerdetails.source_account- The fund source account or card number for the debit or creditdetails.source_bank_name- The fund source bank name or the bank issuer of the card (when available)details.source_network_name- The name of the network where the transaction is processed, e.g., Mastercard, VISA, etc. (when available)
3
Credit funds to the user account from the prefund
Call the Create Credit or Transfer Transaction (POST /users/wallets/funds) to add funds to the user account. This action will utilise the funds from the program prefund account balance and add it to the program account balance.
Create Credit or Transfer Transaction request (source: prefund, recipient: user account)
curl --location 'https://{{accounts_base_url}}/{{product_code}}/v1/users/wallets/funds' \--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: ••••••' \
--data-urlencode 'email=john.doe@matchmove.com' \
--data-urlencode 'amount=50' \
--data-urlencode 'details={
\"pp\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\",
\"transaction_comments\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\",
\"payment_ref\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\",
\"source_account\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\",
\"source_bank_name\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\",
\"source_network_name\":\"<SEE_ANTI_SCAM_MEASURES_DOC>\"
}'Reference: Anti-scam Measures
Create Credit or Transfer Transaction response (source: prefund, recipient: user account)
{
"id": "edde2e3c44428660970d11e0b53888b9c3de744c82a3568c70c6f5c8c0023e98",
"ref_id": "000002C1000000000003000000000278",
"user_id": "cb532825ef5397a0571b3b66f20780d7",
"wallet_id": "4cc5efa24dc483f578dcccc17ac6b459",
"confirm": "skip",
"sor_transaction": null,
"category_details": [
{
"name": "DEFAULT",
"amount": "50.00",
"currency": "USD"
}
]
}4
Handle errors gracefully
As a financial payment platform, we subject every transaction to a series of checks and validations to ensure adherence to the limits configured for the account. Any resulting failures or errors are communicated via the response payload structure shown below. A comprehensive list of error codes for this API is available on the API reference page.
Sample error response
{
"id":"683e98350c1e8",
"code":400,
"status":"user_parameter_validation_failed",
"title":"User Parameter Validation Failed",
"description":"Field required not met; amount must be greater than 0",
"link":"https://developer.matchmove.com/docs/optimus-prime/docs/Overview/4.%20Handle%20Errors/b.-Error-List.md#user_parameter_validation_failed",
"timestamp":"2025-06-03 14:06:41 +08"
}5
Display / notify transaction status to end user
Closed-loop transactions, like account crediting, do not have any webhook events associated with them. Since these types of transactions are synchronous, the response and status will be received immediately after API execution.
For partners who intend to send a push notification via in-app, email, or SMS — the API response payload containing transaction details and other metadata can be used in message content. To learn more about closed-loop transaction notifications, head to the Anti-Scam Measures section.
Related Links
On this page
- Perform an account-to-account (P2P) transfer