Search...
APIJSLog inGet started
Airwallex logo
Home
Platform APIs
Connected Accounts
Accounts
Payments
Transactional FX
Payouts
Issuing
Back to home
OverviewHow Airwallex Payouts work
Payout network
Use cases
Transfers
Create a transfer
Transfer statusesGenerate a confirmation letterSimulate transfer status transition
Validate a transferManage transfers
Transfers to countries/regions with capital controls
Transfers via Airwallex PayEmbedded Transfer component

Create a transfer

Update: Starting from API version 2024-09-27, the Payment resource has been renamed to Transfer. This change affects all occurrences of "payment" throughout the former Payments API and Webhook events. See more details in this changelog API.

Airwallex Transfers allows you to move funds across the globe easily to your suppliers, employees, contractors and/or own bank accounts. As a platform, you can bring your customers onto Airwallex and enhance your product offering by creating transfers on their behalf. Learn how to programmatically create transfers with our Transfer API endpoints API in the following sections.

Before you begin

  • Obtain your access token API by authenticating to Airwallex using your unique Client ID and API key. You will need the access token to make API calls.
  • Check out Payout Network for supported regions and currencies, and the country guides under it for more details on transfer methods, delivery times, and other country specific details.
  • As a platform, you can call all Transfers API endpoints on behalf of your connected accounts by specifying the connected account's open ID (in the format acct_xxxxxx) in the x-on-behalf-of header of your API request. To learn about how you can register as a platform and set up this solution, see Global Treasury and Global Finance.

Step 1: Prepare required beneficiary information

Before creating a transfer, you will need to prepare the required beneficiary information, which can vary depending on the transfer country/currency, transfer method, local clearing system, beneficiary type.

Our dynamic schema API allows you to obtain precise field requirements specific to the intended transfer scenario. Refer to the screenshot below on which fields you can specify to generate the schema.

Dynamic schema - renamed 2024

The dynamic schema comes in handy when you are checking for a handful of transfer scenarios. To obtain our full schema for beneficiaries programmatically in a JSON payload, you can call Get the API schema API to retrieve the required fields and validation rules, and/or Get the form schema API to retrieve suggested specifications on the UI components to render the fields along with the corresponding validation rules. See Using API and form schemas to learn more.

Furthermore, beneficiary information can be saved beforehand and used directly when creating a transfer by specifying the beneficiary_id instead (see Step 2).

Step 2: Create a transfer

New features

  • Transfers via Airwallex Pay: Transfer to other Airwallex accounts via Airwallex Pay by specifying DIGITAL_WALLET for type under the beneficiary object.
  • Schedule transfers: Create future-dated transfers up to 180 days with the flexibility to lock in the FX rate with an upfront prepayment using the lock_rate_on_create field. Learn more in Fund deduction.

Call Create a new transfer API with the required beneficiary and transaction information (currency, amount, date, reference) to create a transfer.

Beneficiary information can be specified within the request in two ways:

  1. Beneficiary ID

    If you prefer to save beneficiary information with Airwallex in advance to simplify the transfer creation process, you can call Create a new beneficiary API, and a unique beneficiary_id will be returned. This can be used in place of the beneficiary object to create the transfer subsequently.

    See Create beneficiaries and Manage beneficiaries to learn more.

  2. Directly within the request

    If you prefer to manage all beneficiary information outside of Airwallex, you can provide beneficiary information directly under the beneficiary object each time when calling Create a new transfer API.

Refer to the dynamic schema API for precise field requirements specific to the intended transfer scenario. If you specify a parameter that is either not required or not on the full schema, it will be ignored and removed from the response. Please find below further considerations on some of the required parameters:

  • beneficiary: beneficiary details should be provided directly in this object if beneficiary_id is not used:

    • type: Specify whether the beneficiary type is a BANK_ACCOUNT or a DIGITAL_WALLET (including Airwallex Pay). The value will default to BANK_ACCOUNT if not specified.
    • bank_details or digital_wallet: Required beneficiary bank account details or digital wallet parameters (depending on the type specified), varies according to the specified transfer scenario. Please refer to dynamic schema API or call Get the API schema API to obtain the corresponding parameter requirements.
    • address: required address parameters such as street address, city, state and postcode will vary according to the specified address country. Please refer to dynamic schema API or call Get the API schema API to obtain the corresponding parameter requirements.
    • entity_type: Specify whether the beneficiary is an individual (PERSONAL) or a business (COMPANY).
    • company_name, OR first_name and last_name: The beneficiary’s name according to the entity_type.
  • transfer_currency: The currency (3-letter ISO 4217 code) in which the beneficiary receives. It must match account_currency of the beneficiary’s bank account details. See Payout Network for supported currencies.

  • source_currency: The currency (3-letter ISO 4217 code) in which to fund the transfer. If it is different from transfer_currency, an underlying currency conversion will be booked (Refer to Transactional FX for more details).

  • transfer_amount OR source_amount: Please only specify one of these two amounts in their respective currencies. The other amount will be calculated and returned in the response.

    Actual amounts with transfer fees applied (if any) are returned as amount_beneficiary_receives and amount_payer_pays in the response. If a transfer was initially created and submitted for approval, these amounts are tentative based on the exchange rate at the time of creation until the transfer status changes to SCHEDULED, at which point the exchange rate is confirmed. By default, transfer fees are charged to the payer i.e. added to transfer_amount and resulted in amount_payer_pays. If you wish to pass on the fees to the beneficiary, you can specify using the fee_paid_by parameter (see below for more details).

  • transfer_method: Specify SWIFT to create an international SWIFT transfer; or LOCAL to create a transfer via the local clearing system, which is faster and more cost-effective. See Payout Network for supported transfer methods by countries/regions and currencies.

  • reference: A user-specified reference that may be displayed to the beneficiary on their bank statement, depending on whether this is supported by the local clearing system and our banking partners. Contact your Account Manager to confirm whether display of reference is supported for your transfer scenarios.

In addition, you may also choose to specify the following optional parameters in your request to further customize the transfer or leverage other related features:

  • beneficiary.additional_info.personal_email: Specify this parameter if you want the beneficiary to receive an email notification upon transfer being dispatched. Please contact your Account Manager to enable this feature beforehand.

  • fee_paid_by: By default, transfer fees will be charged to the PAYER and included in the amount_payer_pays within the response. If you wish to pass on the fees to the beneficiary, set the value to BENEFICIARY.

  • swift_charge_option: By default, SHARED will be applied, in which case the SWIFT charges will be shared between the payer and the beneficiary, i.e. the beneficiary will receive the amount_beneficiary_receives less corresponding SWIFT charges by the beneficiary bank. If you want the beneficiary to receive the full amount_beneficiary_receives, set the value to PAYER to cover the additional SWIFT charges.

  • transfer_date: Specify a current or future date (ISO 8601 format) for when the transfer should be processed. If left blank, the transfer date will default to the earliest possible date and your transfer will be dispatched as soon as possible.

    For transfers with the same source and transfer currency, you can specify a date up to 180 days into the future. For transfers with currency conversions, generally you can specify a date up to 90 days into the future (varies by currency pairs). Longer tenors up to 180 days (varies by currency pair) is possible with our FX forwards product. Please confirm the acceptable value dates by currency pair with your Account Manager.

    For transfers created and submitted for approval, the transfer_date will be updated if it was approved after the original specified date; at which point the transfer status transitions to SCHEDULED and transfer_date is fixed. The date when the transfer is SENT will be returned in dispatch_date.

  • lock_rate_on_create: Specify whether to lock the conversion rate for a future-dated transfer upon creation. This field should only be specified for transfers with currency conversions. The value will default to TRUE if not specified.

    • If TRUE: The transfer is created with a confirmed conversion rate. A prepayment (amount varies by currency pair and tenor) is held upfront to cover any FX delta fee in the event of transfer cancellation, and the full amount will be deducted on the scheduled transfer_date. Further details are returned under the prepayment object.
    • If FALSE: The transfer is created with an unconfirmed conversion rate, which will be confirmed on the scheduled transfer_date, when the full amount will be deducted.

      See Fund deduction for more details.

  • quote_id: Specify the quote_id returned from a previously created quote to fix the conversion rate of the transfer. You must also ensure that the source_currency and transfer_currency in your transfer request match the sell_currency and buy_currency from the quote. Quotes cannot be applied for creating and submitting a transfer for approval.

    If not specified, the system will automatically book the underlying currency conversion based on transfer_date and lock_rate_on_create parameters. See Transactional FX to learn more about the options you have in performing conversions and how you can leverage the corresponding API endpoints.

  • payer or payer_id: Specify the payer information other than the Airwallex account owner with POBO (Pay On Behalf Of) enabled on a case-by-case approval basis. Similar to beneficiaries, the payer information may be provided directly within the payer object, or by specifying the payer_id of a saved payer. See Create a payer for more information. By default, Airwallex identifies the payer as the Airwallex account owner creating the transfer (connected account owner in a platform use case), and it is not necessary to specify the payer information.

Fund deduction

Under the pre-funding workflow, fund deduction experience varies by transfer types.

Transfer dateTransfer TypeFund deduction
Same-dayTransfer without currency conversionsImmediately deducted
Same-day*Transfer with currency conversionsImmediately deducted
Future-datedTransfer without currency conversionsDeducted at 9am on the transfer_date
Future-datedScheduled transfer with confirmed conversion rateprepayment immediately deducted; the remaining transfer amount deducted at 9am on the transfer_date
Future-datedScheduled transfer with unconfirmed conversion rateDeducted at 9am on the transfer_date

* For transfers with currency conversions, a same-day transfer is one where the transfer_date is scheduled before the next business day; otherwise, it is considered a future-dated transfer. For example, a transfer created on Friday and scheduled on the weekend is considered a same-day transfer.

  • If a transfer was initially created and submitted for approval, funds will not be deducted from the Wallet until the transfer is approved. Please ensure that you have sufficient balance in your Wallet when creating transfers.
  • For future-dated transfers, funds will be deducted from the Wallet on transfer date from 9am, on a first-in first-out basis based on the earliest transfer_date then created_at time. If the Wallet balance is insufficient, funding will be retried every 30 minutes until midnight. Transfers not funded by then will be automatically cancelled the following day.

Alternatively under the post-funding workflow, customers without sufficient balance are permitted to create transfers in advance, which will be processed once funded automatically or manually:

  • Auto-funding mode: Funds will be deducted from the Wallet on transfer date from 9am, on a first-in first-out basis based on the earliest transfer_date, and the earliest created_at time. Funding will be retried every 30 minutes if wallet balance is insufficient.
  • Manual-funding mode: Transfers will not be processed unless funding instructions are confirmed to be processed on transfer date by calling Confirm funding for a transfer API.

The Airwallex location that you are onboarded with will determine your account time zone. To learn more about fund deduction models and settlement timing, please see Funding and Settlement Models.

Transfer fee

The fee component of a transfer is calculated by Airwallex and communicated back via fee_currency and fee_amount in the API response, while amount_payer_pays and amount_beneficiary_receives represent the actual amounts that you will pay and the recipient will receive respectively (with fees applied). If a transfer was initially created and submitted for approval, fee_amount, amount_payer_pays and amount_beneficiary_receives are tentative based on the exchange rate at the time of creation until the transfer status changes to SCHEDULED, at which point the exchange rate is confirmed.

The transfer fee is set to be paid by the payer by default, while you can pass on the fees to the beneficiary instead by specifying BENEFICIARY for the fee_paid_by parameter in your request. See more details above in the description of request parameters.

Errors

Airwallex uses conventional HTTP response codes API to indicate the success or failure of an API request.

A HTTP 400 status code indicates an error that has been triggered due to the information provided in the request. See Error codes to learn about all possible errors associated with the HTTP 400 status when creating a transfer.

Example request

To create a transfer to a saved beneficiary using beneficiary_id:

Shell

To create a transfer by directly providing beneficiary information:

Shell

If you are registered as a platform account, you can call this endpoint on behalf of your connected accounts by specifying the open ID in the x-on-behalf-of header.

Example response

JSON

Step 3: Retrieve a transfer

Call Get transfer by ID API or Get list of transfers API to retrieve transfer details. Additionally, you can subscribe to Transfers webhook events to receive any transfer status transitions (the payload will be in the same manner as Create a new transfer API). See Transfer statuses for more information.

Retrieve a list of transfers

Call Get list of transfers API to retrieve details for transfers based on specific conditions.

You can specify the date range of transfer creation (from_created_at and to_created_at, inclusively) whithin the endpoint URL of the request, and the response will be in the same format as in the response of Create a new transfer API. You can also use optional parameters such as transfer_currency and status to filter your transfers, and the pagination parameters (page_num, page_size) to refine the results.

Example request

Shell

If you are registered as a platform account, you can call this endpoint on behalf of your connected accounts by specifying the open ID in the x-on-behalf-of header.

Retrieve details of a transfer

Call Get transfer by ID API to retrieve details of a transfer by specifying the transfer_id.

A successful request will return response in the same format as Create a new transfer API.

Example request

Shell

If you are registered as a platform account, you can call this endpoint on behalf of your connected accounts by specifying the open ID in the x-on-behalf-of header.

Was this page helpful?
On this page
Was this page helpful?