International Bank Transfers

Send funds internationally from your Atlas account to a recipient's bank account using the International Bank Transfer API.

International bank transfers let you send funds from your Atlas wallet to a recipient's bank account in another country. Use this when you need to pay overseas contractors, vendors, or partners directly into their foreign bank accounts.

Gathering recipient details

International transfers are funded from your Atlas wallet in the same currency you're sending. Since swaps on Atlas originate from NGN, you must first swap NGN to your target currency and hold sufficient balance before initiating the transfer. Supported payout currencies are USD, EUR, and GBP.

Tip

See the Swapping between Currency Pairs guide to learn how to fund your foreign currency wallet.

Collect the following before making the API call:

Recipient details

  • Full name (first, last), email address, and phone number
  • Bank account number
  • Bank SWIFT code

Foreign bank details

The foreign_bank object describes the recipient's bank and the banks involved in routing the transfer.

  • bank_name and swift_code - the recipient's bank
  • address - the recipient's bank's physical address
  • routing_number - required only for US banks (ABA routing number).
  • correspondent_bank_name and correspondent_bank_swift_code - the correspondent bank that bridges your transaction to the recipient's local banking network
  • intermediary_bank_name and intermediary_bank_address - the intermediary bank, if one is involved in the routing chain

Addresses

You'll need the recipient's billing and shipping addresses.

Initiating the transfer

Make a POST request to the Initiate International Bank Transfer endpoint with the recipient and bank routing details.

Important

Ensure your Atlas wallet has sufficient balance in the transfer currency before initiating. Minimum amounts are USD 1,500 for USD payouts, EUR 1,000 for Euro payouts, and GBP 1,000 for pound sterling payouts. The request will fail with a 422 if funds are insufficient.

curl -X POST "https://atlas.tryduplo.com/api/v1/payout/bank-transfer/international" \
  -H "Authorization: Bearer your_api_key" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "amount": 1500.00,
    "type": "bank_transfer",
    "currency": "USD",
    "narration": "Contractor payment - April",
    "source_reference": "IBT_APRIL_2026_001",
    "save_as_beneficiary": true,
    "recipient": {
      "first_name": "John",
      "last_name": "Doe",
      "email": "john.doe@example.com",
      "phone_number": "+12025550142",
      "recipient_type": "individual",
      "account_number": "6172444979",
      "swift_code": "WFBIUS6S",
      "account_name": "John Doe",
      "bank_name": "Wells Fargo Bank",
      "foreign_bank": {
        "bank_name": "Wells Fargo Bank",
        "swift_code": "WFBIUS6S",
        "routing_number": "121000248",
        "address": "420 Montgomery Street, San Francisco, CA 94104, USA",
        "correspondent_bank_name": "JP Morgan Chase Bank",
        "correspondent_bank_swift_code": "CHASUS33",
        "intermediary_bank_name": "Bank of America",
        "intermediary_bank_address": "100 N Tryon St, Charlotte, NC 28255, USA"
      },
      "billing_address": {
        "street": "123 Main Street",
        "city": "New York",
        "state": "NY",
        "postal_code": "10001",
        "country": "United States"
      },
      "shipping_address": {
        "street": "123 Main Street",
        "city": "New York",
        "state": "NY",
        "postal_code": "10001",
        "country": "United States"
      }
    }
  }'

On success, you receive a confirmation that the transfer has been initiated:

JSON
{
  "requestId": "a16b8b8c-659b-49e7-ae1b-d363707a0153",
  "requestTimestamp": "2026-04-16 21:13:58.261",
  "message": "Payout initiated successfully.",
  "statusCode": 200,
  "data": {
    "id": "019d9824-abfb-723b-8007-63335a5b760e",
    "recipientAccountName": "John Doe",
    "recipientAccountNumber": "6172444979",
    "recipientBankName": "Wells Fargo Bank",
    "sourceReference": "IBT_APRIL_2026_001",
    "reference": "TRN_GWEWGFBEXWTD",
    "paymentChannel": "Bank Transfer",
    "sessionId": null,
    "parentTransactionReference": null,
    "amount": {
      "value": 1500,
      "currency": "USD",
      "formatted": "USD1500"
    },
    "balance": {
      "value": 24300,
      "currency": "USD",
      "formatted": "USD24300"
    },
    "status": "Pending",
    "narration": "Contractor payment - April",
    "createdAt": "2026-04-16 22:13:53"
  }
}

Atlas will also send an OUTFLOW_PENDING_EVENT webhook when it receives your payout request. After your request has processed, you will either get an OUTFLOW_SUCCESS_EVENT or an OUTFLOW_FAILED_EVENT depending on the final status of your transfer.

Set save_as_beneficiary: true to store the recipient's details for future transfers. You can view all your saved beneficiaries on the Atlas UI.

Paying a company recipient

When the recipient is a business rather than an individual, set recipient_type to "company" and include a company_details object:

Company Recipient
{
  "recipient_type": "company",
  "company_details": {
    "name": "Acme Corporation Ltd",
    "registration_number": "RC123456",
    "tax_id": "TIN123456789"
  }
}

All other fields remain the same. The account_name should match the legal company name registered with the recipient's bank.

Attaching supporting documents

You can attach supporting documents to a transfer by passing a metadata object with a beneficiary_supporting_documents array. Each item in the array is a URL pointing to the document.

Supporting Documents
"metadata": {
  "beneficiary_supporting_documents": [
    "https://example.com/invoice.pdf",
    "https://example.com/contract.pdf"
  ]
}

Include this at the top level of the request body alongside amount, currency, and other fields.

How is this guide?

Last updated on

On this page