HomeGuidesRecipesAPI ReferenceChangelog
Treasury Portal Login
Guides

Initiate Sends

Send local and international currencies directly from your virtual accounts.

Overview

Sends are initiated from your virtual accounts using the Submit Payment Request endpoint. You can send payments from your primary virtual account or from a custom wallet virtual account.

Step 1: Get the Channel and Network ID

Before initiating a send, retrieve the appropriate channelId by calling the Channels endpoint. Filter the results for:

  • channelType: virtualbank
  • country: The country matching your virtual account (e.g., US, NG)
  • currency: The currency matching your virtual account (e.g., USD, NGN)

The returned channelId is required when submitting the payment request.

📘

Manual Input Network Right now, the API doesn't have a list of all banks available in all countries. Manual Input network is available to help with this, when you call the Get Networks endpoint and you filter by your selected channelId, you'll have one network left with network name "Manual Input". Pass this Network ID, alongside other destination input sent to the submit payment endpoint.

Step 2: Submit the Send Request

Call the Submit Payment Request endpoint with the channelId, sender details, destination details, and the payment amount.

POST /business/payments

{
  "source": {
    "accountType": "bank"
  },
  "sender": {
    "name": "John Doe",
    "country": "France",
    "address": "12 North Street, 100001 Paris",
    "dob": "02/01/1997",
    "email": "[email protected]",
    "idNumber": "12345567",
    "idType": "license"
  },
  "destination": {
    "accountNumber": "0400440532013000",
    "networkId": "28281f21-4705-431f-a752-9a485628c76a",
    "accountType": "bank",
    "accountName": "Acme GmbH",
    "outboundTransactionType": "SWIFT",
    "swiftCode": "COBADEFFXXX",
    "iban": "DE89370400440532013000",
    "city": "Berlin",
    "postalCode": "10115",
    "country": "DE",
    "address": "Friedrichstraße 100",
    "memo": "test payment"
  },
  "channelId": "efff976c-a53b-4baa-b81b-ec26f2121c7d",
  "sequenceId": "23444444339949949494949",
  "amount": 10,
  "reason": "other",
  "forceAccept": true
}

Key Request Fields

FieldRequiredDescription
source.accountTypeYesSet to bank for virtual account payouts
channelIdYesThe virtual bank channel ID retrieved from the Channels endpoint
networkIdYesThe ID of the manual input network
sequenceIdYesYour unique idempotency key for this payment
senderYesSender KYC details
destinationYesRecipient bank account details
destination.accountNameYesName on the recipient bank account
destination.outboundTransactionTypeYesTransfer type: ACH, WIRE, or SWIFT
destination.addressYesStreet address of the recipient
destination.cityYesCity of the recipient
destination.postalCodeYesPostal/ZIP code of the recipient
destination.countryYesISO country code of the recipient
destination.countryAreaWhen destination.country is USState/province code
destination.routingNumberWhen ACH or WIREBank routing number
destination.accountNumberWhen ACH or WIRE; or one of accountNumber/iban when SWIFTBank account number
destination.swiftCodeWhen SWIFTSWIFT/BIC code
destination.ibanOne of accountNumber/iban when SWIFTIBAN — accepted in place of accountNumber for SWIFT
destination.memoNoAn optional description for the payment and passed through to the recipient’s bank statement
amountYesThe send amount
reasonYesThe reason for the send
forceAcceptYesSet to true to auto-accept the payment

Sends from Custom Wallet Virtual Accounts

To initiate a send from a custom wallet virtual account instead of your primary virtual account wallet, include the walletId field in the request. The walletId is the id of the custom wallet returned when you created it.

POST /business/payments

{
  "source": {
    "accountType": "bank"
  },
  "walletId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "sender": {
    "name": "John Doe",
    "country": "France",
    "address": "12 North Street, 100001 Paris",
    "dob": "02/01/1997",
    "email": "[email protected]",
    "idNumber": "12345567",
    "idType": "license"
  },
  "destination": {
    "accountNumber": "0400440532013000",
    "networkId": "28281f21-4705-431f-a752-9a485628c76a",
    "accountType": "bank",
    "accountName": "Acme GmbH",
    "outboundTransactionType": "SWIFT",
    "swiftCode": "COBADEFFXXX",
    "iban": "DE89370400440532013000",
    "city": "Berlin",
    "postalCode": "10115",
    "country": "DE",
    "address": "Friedrichstraße 100"
  },
  "channelId": "efff976c-a53b-4baa-b81b-ec26f2121c7d",
  "sequenceId": "4555523234442444201",
  "amount": 10,
  "reason": "other",
  "forceAccept": true
}

The only difference from a standard send is the addition of the walletId field, which directs the send to be paid from the specified custom wallet's virtual account.

Payment Webhooks

Payment webhook events are sent as the payment progresses through its lifecycle. For details on payment webhook event types and statuses, refer to the Webhooks and Events page.



What’s Next