How to Send an EFT Payout (USD to CAD)

EFT (Electronic Funds Transfer) enables cross-border payouts from US-based merchants to Canadian beneficiaries. Funds are sent in USD and converted to CAD using a locked-in exchange rate, with the converted amount deposited directly into the beneficiary's Canadian bank account. EFT is well suited for recurring cross-border payments to Canada, offering predictable FX rates and reliable settlement times.

The usual workflow for integrating with the non-hosted solution involves the following steps:

Step 1: Authenticate: Obtain an API token by validating your credentials.

Step 2: Create Beneficiary: Create and manage beneficiary accounts using API calls.

Step 3: Create a Sender: Register the originating party for the payout.

Step 4: Create Transfer Method: Add a Canadian bank account as the transfer method for your beneficiary.

Step 5: Create FX Quote: Lock in the USD-to-CAD exchange rate before creating the transfer.

Step 6: Create Transfer: Execute the cross-border payout using the FX quote.



API Endpoints Used

This guide will demonstrate step-by-step instructions using the API integration method. In this guide, you will use the following API endpoints:

Below, you will go through the necessary API calls to achieve the steps above within the i-payout system.

📘

Recipe

You can also follow our recipe by clicking the link below:

Step 1: Authenticate

To start using i-payout solutions, you will need to authenticate with your API Token. Refer to the Get a Token guide to learn how to:

Step 2: Create Beneficiary

A beneficiary is an individual designated to receive funds or payments through the i-payout system. For an EFT payout to Canada, the beneficiary must have their country set to "CA".

Use the Create Beneficiary endpoint to create a new beneficiary. The request should include all necessary details about the beneficiary in the request body and, as shown in Step 1, include the authentication to access the i-payout API. Below, you will find an example request to create a new Canadian beneficiary:

curl --request POST \
     --url "https://merchantapi.testewallet.com/api/v1/beneficiaries" \
     --header 'Authorization: Bearer <YOUR_API_TOKEN>' \
     --header 'X-MerchantId: <YOUR_MERCHANT_ID>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
        "username": "jane_smith",
        "firstName": "Jane",
        "lastName": "Smith",
        "emailAddress": "[email protected]",
        "country": "CA"
    }'
{
  "data": {
    "beneficiaryToken": "e0e4764b-9619-4deb-95c4-108ce9f0fe04"
  },
  "isSuccess": true,
  "message": "Customer created successfully",
  "statusCode": "NO_ERROR",
  "logIdentifier": "497b73624c0d47bfb0abf58df5dd99ca"
}

Step 3: Create a Sender

A sender identifies the originating party of the payout. You must create a sender before initiating a transfer. Use the Create Sender endpoint to register a new sender in the system.

The senderID and emailAddress fields are required. Only company senders are supported at this time, so you must provide the companyName field. For EFT payouts from the US to Canada, the sender country should be "US". Below, you will find an example request to create a new sender:

curl --request POST \
     --url "https://merchantapi.testewallet.com/api/v1/beneficiaries/sender" \
     --header 'Authorization: Bearer <YOUR_API_TOKEN>' \
     --header 'X-MerchantId: <YOUR_MERCHANT_ID>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
        "senderID": "SENDER_001",
        "companyName": "Acme Corp",
        "emailAddress": "[email protected]",
        "address1": "123 Main Street",
        "country": "US"
    }'
{
  "isSuccess": true,
  "message": "Sender created successfully",
  "statusCode": "NO_ERROR",
  "logIdentifier": "abc123def456",
  "data": {
    "senderToken": "f1e2d3c4-b5a6-7890-abcd-ef1234567890"
  }
}

Step 4: Create Transfer Method

To manage how funds are transferred to beneficiaries, you need to create a transfer method. To add a Canadian bank account for your beneficiary, use the Add Bank Account endpoint.

For Canadian bank accounts, use financialInstitutionNumber (the 3-digit institution number) and branchCode (the 5-digit transit number) instead of routingNumber. Set accountCurrency to "CAD" and bankCountry to "CA". Ensure that accountType1 matches the beneficiary type — use "personal" for individuals or "business" for companies. Below, you will find an example request to add a Canadian bank account:

curl --request POST \
     --url "https://merchantapi.testewallet.com/api/v1/transfer-methods/beneficiaries/<BENEFICIARY_TOKEN_FROM_STEP_2>/bank-accounts" \
     --header 'Authorization: Bearer <YOUR_API_TOKEN>' \
     --header 'X-MerchantId: <YOUR_MERCHANT_ID>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
        "accountNickName": "Jane CAD Account",
        "accountCurrency": "CAD",
        "accountNumber": "1234567",
        "accountType1": "personal",
        "accountType2": "checking",
        "bankName": "Royal Bank of Canada",
        "bankCountry": "CA",
        "financialInstitutionNumber": "003",
        "branchCode": "00016",
        "beneficiaryFirstName": "Jane",
        "beneficiaryLastName": "Smith",
        "beneficiaryCountry": "CA",
        "beneficiaryAddress1": "456 Maple Ave",
        "beneficiaryState": "ON",
        "beneficiaryCity": "Toronto",
        "beneficiaryZipCode": "M5V 2T6"
     }'
{
  "isSuccess": true,
  "message": "Bank account added successfully",
  "statusCode": "NO_ERROR",
  "logIdentifier": "def456ghi789",
  "data": {
    "token": "bankAcc123Token",
    "isDocumentVerificationRequired": false
  }
}

Step 5: Create FX Quote

Before creating a cross-border transfer, you should lock in the exchange rate by requesting an FX quote. Use the Create FX Quote endpoint to get a rate for the USD-to-CAD currency pair. The returned quote is valid for 30 minutes.

curl --request POST \
     --url "https://merchantapi.testewallet.com/api/v1/transfers/quote" \
     --header 'Authorization: Bearer <YOUR_API_TOKEN>' \
     --header 'X-MerchantId: <YOUR_MERCHANT_ID>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
        "sourceCurrency": "USD",
        "destinationCurrency": "CAD"
    }'
{
  "isSuccess": true,
  "message": "Success",
  "statusCode": "NO_ERROR",
  "logIdentifier": "fxq789abc012",
  "data": {
    "quoteIdentifier": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "sourceCurrencyCode": "USD",
    "destinationCurrencyCode": "CAD",
    "sourceAmount": 0.0,
    "destinationAmount": 0.0,
    "fxRate": 1.3650,
    "dateAddedUtc": "2026-07-15T12:00:00Z",
    "dateExpiresUtc": "2026-07-15T12:30:00Z"
  }
}

Step 6: Create Transfer

With the beneficiary, transfer method, sender, and FX quote created, you can now execute the payout. Use the Create Transfer endpoint to transfer funds by linking the beneficiaryToken from Step 2, the senderToken from Step 3, and the fxQuoteId from Step 5.

For EFT payouts, set destinationType to "Bank". Specify destinationAmount in CAD — the sourceAmount in USD is calculated automatically based on the FX rate and fees. Below, you will find an example request to create a new transfer:

curl --request POST \
     --url "https://merchantapi.testewallet.com/api/v1/transfers" \
     --header 'Authorization: Bearer <YOUR_API_TOKEN>' \
     --header 'X-MerchantId: <YOUR_MERCHANT_ID>' \
     --header 'accept: application/json' \
     --header 'content-type: application/json' \
     --data '{
          "merchantTransactionId": "TX-EFT-001",
          "beneficiaryToken": "<BENEFICIARY_TOKEN_FROM_STEP_2>",
          "senderToken": "<SENDER_TOKEN_FROM_STEP_3>",
          "autoApprove": true,
          "comments": "Payment for services",
          "dateExpire": "2026-12-31",
          "destinationAmount": 136.50,
          "sourceCurrency": "USD",
          "destinationCurrency": "CAD",
          "destinationType": "Bank",
          "fxQuoteId": "<QUOTE_IDENTIFIER_FROM_STEP_5>",
          "bankAccount": {
              "accountNickName": "Jane CAD Account",
              "accountCurrency": "CAD",
              "accountNumber": "1234567",
              "accountType1": "personal",
              "accountType2": "checking",
              "bankName": "Royal Bank of Canada",
              "bankCountry": "CA",
              "financialInstitutionNumber": "003",
              "branchCode": "00016",
              "beneficiaryCountry": "CA",
              "beneficiaryAddress1": "456 Maple Ave",
              "beneficiaryState": "ON",
              "beneficiaryCity": "Toronto",
              "beneficiaryZipCode": "M5V 2T6"
          }
     }'
{
  "isSuccess": true,
  "message": "Transfer created successfully",
  "statusCode": "NO_ERROR",
  "logIdentifier": "abc123def456",
  "data": {
    "token": "trans789token",
    "dateCreated": "2026-07-15T12:00:00Z",
    "dateUpdated": "2026-07-15T12:00:00Z",
    "statusId": 1,
    "status": "CREATED",
    "fxRate": 1.3650,
    "beneficiaryFee": 0.0,
    "merchantFee": 2.00,
    "senderToken": "f1e2d3c4-b5a6-7890-abcd-ef1234567890"
  }
}

Monitor Transfer Status

After creating a transfer, there are two ways to track its progress:

Option A: Transfer Reports (Recommended)

Use the Get Transfers Report endpoint to retrieve the status and details of your transfers on demand. This is the primary way to check on transfers, especially when processing multiple payments and you need to review statuses in bulk. You can filter results by beneficiary, status, date range, currency, and more. The maximum pageSize is 100 records per request.

Option B: Webhook Notifications

For real-time updates without polling the API, subscribe to webhook events. We recommend the following events:

  • TRANSFER.CREATED : triggers when a transfer is created, confirming the payout was initiated.
  • TRANSFER.STATUS.UPDATED : triggers when the transfer status changes (e.g., PROCESSING, APPROVED, DECLINED, CANCELLED, ON_HOLD, SETTLED).

Transfers placed on ON_HOLD may include sub-statuses with additional detail.

To start receiving webhook notifications, follow the How to Set Up Webhooks guide. For a full list of available events and example payloads, see Webhook Events.

Other Available Payout Methods

Follow the links below to learn more about other available payout methods:



Did this page help you?