Perform a domestic payment
Understand the process for initiating a local bank-to-bank transfer to a saved domestic beneficiary. This guide will walk you through the process of making a payment using a previously created recipient profile.
The user in this document pertains to both the individual and business user types.
For Singapore-issued customer accounts: Domestic payout refers to the movement of funds from the platform, via a provisioned SGD Virtual Account (VA), to any Singaporean local bank or financial institution that has enabled the FAST (Fast and Secure Transfers) electronic fund transfer service.
For Singapore-issued partner (program owner) accounts:
Domestic payout is only enabled for User (Individual/Business) SGD Virtual Accounts. This feature is disabled for Partner SGD Corporate Virtual Accounts.
Since the corporate virtual account will be directly tied to the Program Owner Account and the prefund, the direct withdrawal of funds from the program will be restricted.
For the withdrawal of surplus prefund and other settlement fund movement, you may reach out to your MatchMove Relationship Manager for specific arrangements.
Use Cases
- You want to implement a feature in your application that will allow users to send domestic payment transactions to their defined recipients.
- You want to implement a feature in your application that will allow users to withdraw funds to their local bank accounts (defined as a recipient).
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's virtual account must be in an
activestatus. - The user account's current
deduct_limitsandtransfer_out_limitsmust have enough buffer to accommodate the incoming debit amount. - The user account must have a balance that is equal to or higher than the payment amount.
- A valid domestic recipient must have already been defined and must be in an
activestatus.
API Workflow
1
Retrieve and select a beneficiary from the active beneficiaries
All the defined beneficiary accounts belonging to the customer account will be listed. In your frontend, you will need to display this list and allow the user to select the beneficiary they want to send funds to.
Call Get Beneficiary Bank Accounts (GET /users/wallets/payouts/domestic/bank_accounts) to get the list of all the beneficiaries associated with a user.
Get Beneficiary Bank Account request
curl --location 'https://{{payouts_base_url}}/{{program_code}}/v1/users/wallets/payouts/domestic/bank_accounts' \
--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Authorization: ••••••'Get Beneficiary Bank Account response
{
"total_records": 8,
"records_per_page": 10,
"total_pages": 1,
"page": 1,
"links": [
{
"rel": "self",
"href": "https://{{server}}/{{program_code}}/v1/users/wallets/payouts/domestic/bank_accounts?page=1&records_per_page=10&return_all=false",
"method": "GET"
}
],
"data": [
{
"id": "fd85e7f1-ec52-41a4-916b-88e687af859f",
"bank_account_number": "6377021438014797",
"bank_holder_name": "John Williams",
"bank_code": "MAYPSGS0XXX",
"bank_name": "MatchMove Pay Pte Ltd",
"mode": "wallet",
"entity_type": null,
"status": "inactive",
"is_active": 0,
"created_at": "2024-05-08T17:04:01+08:00",
"updated_at": null,
"activated_at": null
},
{
"id": "0f665f5e-462a-4b7c-a75c-479a91ee401b",
"bank_account_number": "6377021438014795",
"bank_holder_name": "Twelve Success",
"bank_code": "MAYPSGS0XXX",
"bank_name": "MatchMove Pay Pte Ltd",
"mode": "wallet",
"entity_type": null,
"status": "inactive",
"is_active": 0,
"created_at": "2024-01-22T17:05:01+08:00",
"updated_at": "2024-05-09T17:03:30+08:00",
"activated_at": null
},
{
"id": "bf5c7633-230e-4b83-a890-a21170405753",
"bank_account_number": "123123123123333",
"bank_holder_name": "Kelvin",
"bank_code": "ANZBSGS0XXX",
"bank_name": "ANZ Bank",
"mode": "bank",
"entity_type": null,
"status": "inactive",
"is_active": 0,
"created_at": "2024-04-08T17:45:22+08:00",
"updated_at": null,
"activated_at": null
},
{
"id": "a9dbcca8-4f48-4aa9-adce-726f191dcaed",
"bank_account_number": "6377021438014796",
"bank_holder_name": "Twel Success",
"bank_code": "MAYPSGS0XXX",
"bank_name": "MatchMove Pay Pte Ltd",
"mode": "wallet",
"entity_type": null,
"status": "active",
"is_active": 1,
"created_at": "2024-05-08T15:43:21+08:00",
"updated_at": "2025-02-24T15:03:35+08:00",
"activated_at": null
},
{
"id": "2fb1eb0f-0b20-461b-9109-ec0798eeaf45",
"bank_account_number": "6377021438014708",
"bank_holder_name": "Hey Success",
"bank_code": "MAYPSGS0XXX",
"bank_name": "MatchMove Pay Pte Ltd",
"mode": "wallet",
"entity_type": null,
"status": "inactive",
"is_active": 0,
"created_at": "2024-05-08T17:14:24+08:00",
"updated_at": null,
"activated_at": null
},
{
"id": "bd5ab473-a0a6-451d-abe5-c827e67980e5",
"bank_account_number": "6377021438014798",
"bank_holder_name": "Gero Success",
"bank_code": "MAYPSGS0XXX",
"bank_name": "MatchMove Pay Pte Ltd",
"mode": "wallet",
"entity_type": null,
"status": "inactive",
"is_active": 0,
"created_at": "2024-05-08T17:09:24+08:00",
"updated_at": null,
"activated_at": null
},
{
"id": "c2cb551f-3ce5-407b-84dc-2a5d83f7e52d",
"bank_account_number": "131246491919",
"bank_holder_name": "merry",
"bank_code": "BNPASGS0XXX",
"bank_name": "BNP Paribas",
"mode": "bank",
"entity_type": null,
"status": "active",
"is_active": 1,
"created_at": "2024-05-16T20:25:08+08:00",
"updated_at": "2024-07-11T13:10:01+08:00",
"activated_at": null
},
{
"id": "9d1a885d-b264-4b73-9057-eec2565a49c3",
"bank_account_number": "5543213122",
"bank_holder_name": "MATCHMOV HELLO Success",
"bank_code": "ANZBSGS0XXX",
"bank_name": "ANZ Bank",
"mode": "bank",
"entity_type": null,
"status": "active",
"is_active": 1,
"created_at": "2025-08-07T16:14:45+08:00",
"updated_at": "2025-08-07T16:14:45+08:00",
"activated_at": "2025-08-07T16:14:45+08:00"
}
]
}On the beneficiary selection screen, only beneficiaries with status=active must be available for selection.
Otherwise, the bank transfer transaction will fail later if the beneficiary is not active.
Once the user (sender) has selected their intended domestic recipient, please take note of the bank account ID since this will be required as an input for sending a domestic payout transaction. e.g., from the response above, it will be "id": "fd85e7f1-ec52-41a4-916b-88e687af859f"
4
Send a domestic payout transaction
Finally, we initiate the outgoing domestic payout to the selected beneficiary of the customer.
Call the Credit Bank Account (POST /v1/users/wallets/payouts/domestic/fund_transfers/credit) to send the domestic payout transaction.
Credit Bank Account request
curl --location 'https://{{payouts_base_url}}/{{program_code}}/v1/users/wallets/payouts/domestic/fund_transfers/credit' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Accept: application/json' \
--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Authorization: ••••••' \
--data-urlencode 'bank_account_id=9d1a885d-b264-4b73-9057-eec2565a49c3' \
--data-urlencode 'client_ref_id={{transfer_comments}}' \
--data-urlencode 'amount=10' \
--data-urlencode 'currency=SGD' \
--data-urlencode 'purpose_of_transfer={{transfer_purpose}}'Credit Bank Account response
{
"id": "c9535919-cd4d-4b62-4256-a3f89559b452",
"client_ref_id": "{{transfer_comments}}",
"amount": 10,
"fee": 0,
"currency": "SGD",
"unique_payment_id": "20251208MAYPSGS0BRT1548907",
"payment_reference_id": "DEBIT-c9535919-cd4d-4b62-4256-a3f89559b452",
"ref_id": "000002F7000000000026000000000018",
"purpose_of_transfer": "{{transfer_purpose}}",
"transfer_type": "transfer_out",
"status": "pending",
"description": null,
"bank_account": {
"id": "9d1a885d-b264-4b73-9057-eec2565a49c3",
"bank_code": "ANZBSGS0XXX",
"bank_name": "ANZ Bank",
"bank_account_number": "5543213122",
"bank_holder_name": "MATCHMOV HELLO Success"
},
"created_at": "2025-12-08T13:20:31+08:00",
"updated_at": null
}Domestic Payout API-required fields enumerations:
purpose_of_transferallowed values are listed in the Domestic Transfer Purpose Enumeration (GET /users/enumerations/transfers/purpose)
*The enumeration is part of the Identity API category; you can access them by using the {{identity_base_url}}. See Utilize Enumerations section to learn more.
Other field notes:
client_ref_idFor domestic payouts, this field is used to pass the sender transfer comments{{transfer_comments}}that will be passed to the receiving bank.
Once the domestic transfer transaction is sent, its status will initially be set by default to PENDING. The processing time of this transaction will follow the network processing SLA.
Since this transaction is asynchronous, notifications on the transaction status updates will be sent via webhooks.
Related Links
On this page
- Perform a domestic payment