Payments
Description
Payments are one of the main features of the platform. They can be used to send money to a Recipient and Payment Address outside the Send Ecosystem (further - Payouts), or to move money between Wallets within the Send Ecosystem (further - Transfers).
Creating a Recipient with a Payment Address is mandatory if you want to make a Payout. A Recipient refers to the individual or corporate you want to pay. The Payment Address is the banking details the Recipient holds. A Recipient can hold multiple Payment Addresses.
A Recipient & Payment Address must be Active before creating a Payout
Recipients
How to create a Recipient
To create a Recipient you need to send a POST /recipients
request including the accessToken
you’ve received
during the Authentication process in the headers.
Each Recipient is linked to the Trading Account specified in the create Recipient request.
Payment Address must be added within the request to create a Recipient. If the Recipient has several Payment Addresses they can be added in a separate request later on.
Depending on whether your Recipient is a corporate or an individual, the request to create a Recipient will require different sets of data.
This request must contain the following:
tradingAccountId
;recipientType
;firstName
,lastName
andphysicalAddress
Object (for Individual Recipients only)corporateName
,corporateRegistrationNumber, corporateCountryofRegistration
andphysicalAddress
Object (for corporate Recipients only)paymentAddresses
Object
The required fields will differ based on where the payments are being sent so please refer to Country Payout Guides page.
While in Processing status
, Recipient undergo a Compliance Check (if any action is required at this point, Send will reach out via established channels to rectify any issues/gather necessary documentation).
At this point, if Compliance fails the Recipient it will go into a Rejected status
. Otherwise the Recipient will go into Active status
.
To receive updates on the Recipient status changes please refer to Webhooks.
Request example for POST /recipients
{
"tradingAccountId": "zyxw3214-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"clientReferenceName": "string",
"firstName": "Kim",
"lastName": "Alex",
"middleName": "Doe",
"recipientType": "individual",
"countryOfResidence": "AU",
"physicalAddress": {
"city": "Christchurch",
"country": "NZ",
"postcode": 8011,
"state": "string",
"addressLine1": "1 Short Street",
"addressLine2": "string",
"streetName": "string",
"streetNumber": "string",
"streetType": "string",
"unitNumber": "string"
},
"phoneCountryCode": "61",
"phoneNumber": 78945678,
"email": "[email protected]",
"dateOfBirth": "2001-04-07T00:00:00.000Z",
"taxIdentifier": "string",
"paymentAddresses": [
{
"payoutType": "swift",
"routingCode": "12345789",
"accountReference": "49995300",
"accountName": "My Account Name",
"externalReference": "ref-12345789",
"currency": "AUD",
"clientAddressName": "My payment address",
"bankCountry": "AU",
"accountType": "checking"
}
]
}
In response to your request you will receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Within the successful response you will receive all the data you’ve provided with the following data included:
recipientId
which can be used to refer to the Recipientstatus
createdAt
andupdatedAt
dates and time.paymentAddress
Object details
Response example for POST /recipients
{
"item": {
"tradingAccountId": "zyxw3214-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"clientReferenceName": "string",
"firstName": "Kim",
"lastName": "Alex",
"middleName": "Doe",
"recipientType": "individual",
"countryOfResidence": "AU",
"physicalAddress": {
"city": "Christchurch",
"country": "NZ",
"postcode": 8011,
"state": "string",
"addressLine1": "1 Short Street",
"addressLine2": "string",
"streetName": "string",
"streetNumber": "string",
"streetType": "string",
"unitNumber": "string"
},
"phoneCountryCode": "61",
"phoneNumber": 78945678,
"email": "[email protected]",
"dateOfBirth": "2001-04-07T00:00:00.000Z",
"taxIdentifier": "string",
"createdAt": "2019-08-24T14:15:22Z",
"updatedAt": "2019-08-24T14:15:22Z",
"status": "submitted",
"recipientId": "1k2l3m4-9i0j-7g8h-9i0j-1k2l3m4n5o62",
"paymentAddresses": [
{
"paymentAddressId": "1a2b3c4d-5e6f-7g8h-9i0j-1k2l3m4n5o61",
"payoutType": "swift",
"routingCode": "12345789",
"accountReference": "49995300",
"accountName": "My Account Name",
"externalReference": "ref-12345789",
"currency": "AUD",
"clientAddressName": "My payment address",
"bankCountry": "AU",
"accountType": "checking"
"createdAt": "2019-08-24T14:15:22Z",
"updatedAt": "2019-08-24T14:15:22Z",
"status": "pending"
}
]
}
}
Recipient & Payment Address Status Flow
If you wish to make a Recipient or Payment Address Inactive, you will need to contact Send through agreed channels
SWIFT vs Local Payouts
You will need to stipulate the payoutType
in the Payment Address. This can either be Local or SWIFT. In general Send will work with any Client to figure out the best Payment rails for their use case but please keep the following in mind:
-
SWIFT network is higher cost than Local but is considered a better rail for high priority and high value payments.
-
SWIFT network may also suffer from intermediary bank fees which can result in funds not arriving whole (f.e. a bank in the middle takes out $10 as a processioning fee)
-
Local rails have different processing timelines based on the country but usually take 1-2 days.
-
SWIFT usually arrives within a few hours (especially in Major currencies)
NZD Local Payouts
NZD Local Payouts can only be made when a Trade and Payout are linked in the same request via POST/trades/spot.
Single currency NZD Payouts via the POST/payments/payout must be sent via SWIFT.
How to add a Payment Address to an existing Recipient
If you need to add more Payment Addresses for the Recipient you can add it as a separate request.
To add a Payment Address for an existing Recipient you need to send a signed POST /recipients/{recipientId}/paymentAddresses
request.
This request must contain the following:
payoutType
- Type of payment to be made. Please ensure you cross reference which routing details you are supplying with thepayoutType
to avoid any Payment failures.routingCode
- Routing code of the recipients bank, usually a local clearing code (ie BSB) or a SWIFT code.accountReference
- Specific account number for the Recipient's bank address. Usually a local account number or an IBAN.currency
- Currency of the Recipient's account.bankCountry
- Where the recipient's bank address is located.
Request example for POST /recipients/{recipientId}/payment-addresses
{
"payoutType": "swift",
"routingCode": "12345789",
"accountReference": "49995300",
"accountName": "My Account Name",
"externalReference": "ref-12345789",
"currency": "AUD",
"clientAddressName": "My payment address",
"bankCountry": "AU",
"accountType": "checking"
}
In response to your request you can receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Within the successful response you will receive all the data you’ve provided with the following data included:
paymentAddresstId
which can be used to refer to the Recipientstatus
createdAt
,updatedAt
dates and time.
Response example for POST /recipients/{recipientId}/payment-addresses
{
"item": {
"paymentAddressId": "string",
"payoutType": "swift",
"routingCode": "12345789",
"accountReference": "49995300",
"accountName": "My Account Name",
"externalReference": "ref-12345789",
"currency": "AUD",
"clientAddressName": "My payment address",
"bankCountry": "AU",
"accountType": "checking",
"createdAt": "2024-08-09T05:58:17.918Z",
"updatedAt": "2024-08-09T05:58:17.918Z",
"status": "submitted"
}
}
While in Processing status
, Payment Address undergo a Compliance Check (if any action is required at this point, Send will reach out via established channels to rectify any issues/gather necessary documentation).
At this point, if Compliance fails the Payment Address it will go into a Rejected status
. Otherwise the Payment Address will go into Active status
.
Payouts
How to make a Payout
To make a Payout externally to an individual or corporate, you must first create a Recipient with a valid Payment Address. Both Recipient and Payment Address must have an Active status
.
After that you need to send a POST /payments/payout
request including the accessToken
you’ve received during the Authentication process in the headers.
Within the request you must specify the following:
-
fromWalletId
-
recipientId
andpaymentAddressId
(valid and active) -
Payment
currency
andamount
Please note thatfromWallet
should have the same currency as the currency provided in the request.
Any currencies that require conversion should come via the Trade endpoint.
Available currencies list depends on the contract agreement between you and Send and is based on whitelisting. -
paymentReason
andreference
-
The
paymentReason
is required to ensure the payout is processed successfully. The reason that can be selected will vary based on the country the payout is sent to. -
The
reference
is what the Recipient will see on the Transaction when they receive it.
The length of the reference may vary depending on the rails of the Payment.
Certain countries have specific payment reasons that must be provided. Please refer to the Payment Reasons for further information.
Request example for POST /payments/payout
{
"paymentReason": "buying_a_vehicle",
"reference": "string",
"currency": "AUD",
"amount": 10000,
"fromWalletId": "4321dcba-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"recipientId": "4567xyzw-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"paymentAddressId": "1234abcd-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"externalReference": "string"
}
After the creation of the Payout request it undergoes a number of validation checks before creating the Payment Transaction and sending back a response.
In response to your request you will receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Within the successful response you will receive all the data you’ve provided with the paymentTransactionId
, paymentType
(for payouts it will always be “payout”), payoutType
(either “swift” or “local”), status
of the Transaction, createdAt
and updatedAt
dates and time.
To receive updates on the Payment Transaction status
changes please refer to Webhooks.
Response example for POST /payments/payout
{
"item": {
"paymentTransactionId": "string",
"paymentReason": "string",
"reference": "string",
"paymentType": "payout",
"currency": "AUD",
"amount": 0,
"fromWalletId": "string",
"recipientId": "string",
"paymentAddressId": "string",
"rejectReason": "string",
"status": "submitted",
"createdAt": "2024-08-09T05:58:17.918Z",
"updatedAt": "2024-08-09T05:58:17.918Z",
"paymentDate": "2024-08-09",
"externalReference": "string",
"payoutType": "swift"
}
}
If a Payout has been returned
If a Payout to a particular Payment Address has returned then it is recommended to create another Payment Address for that Recipient as any other subsequent Payments will probably return as well.
How do Payouts work
Before a Payout is created it undergoes a round of checks to make sure everything is set correctly and no data is missing. These checks include:
-
Required data is provided;
-
Recipient and Payment Address are valid and active;
-
currency
of Payout matches the fromWalletID; -
currency
is available for payments; -
paymentReason
has been provided.
Provided these validations pass, the status
of the Payout will be set to “Processing” and a response with the paymentTransactionID
will be sent back to you.
While in Processing status
, Payouts undergo a Compliance Check (if any action is required at this point, Send will reach out via established channels to rectify any issues/gather necessary documentation).
At this point, if Compliance fails the Payout it will go into a Rejected status
.
If a Payout was made via POST/trade, it will move to Pending Trade Settlement status when it has passed Compliance and stay there until the linked Trade is settled.
If however the Payout is booked via POST/payments/payout it will stay in Awaiting Funds status until the Wallet has been funded.
Once either of these occur, the Payout will move to Pending Release for the final checks before sending to the Recipient and moving the status to Released.
If the linked Trade fails/is rejected/is cancelled before the Payout is released it will move to Rejected status.
If a Payout is rejected by the bank for a particular reason Send will refund the Wallet and set the status
of the the Payout to Returned. If that happens you will be notified via the Webhooks so you will know the exact reason of the failure.
If you wish to cancel a Payout that has been created, you will need to contact Send via the agreed channels.
Send will not retry failed Payouts automatically
In case if your Payment failed you will have to rebook it again.
Payout Status Flow
The Payout status flow differs slightly depending on if it is a single currency Payout via the POST /payments/payout
or a Payout with a linked trade via POST /trade
. If it's a single currency Payout it will be in Awaiting Funds until it has been funded. For a Payout with a linked trade, it will be in Pending Trade Settlement until the Trade hits the settlement day and has also been funded.
Trade
settlementDate
vs PaymentpaymentReleaseDate
When booking a linked trade and payment, usually the
settlementDate
andpaymentReleaseDate
will be the same. However depending on when the trade is specifically funded and the time taken to process the Payout, thepaymentReleaseDate
may change. This is usually when booking trades into exotics where, due to liquidity restrictions, the payment may only be able to be released up to 2 days after funding of the trade. Another example is if a Trade is booked right before a cut-off, in this instance the Trade may settle, however the payment could miss its cut-off and be sent the following day.
Transfers
How to make a Transfer
To make a Transfer (to send funds to another Send Wallet) you need to make sure that a toWallet
exists prior to making the Transfer. Transfers can be done between the Wallets from different Trading Accounts.
After that you need to send a POST /payments/transfer
request including the accessToken
you’ve received
during the Authentication process in the headers.
Within the request you must specify the following:
fromWalletId
toWalletId
currency
andamount
paymentReason
andreference
Currencies must match
Please, make sure that both
toWallet
andfromWallet
have the samecurrency
and it should match thecurrency
provided in the request. If the currencies differ, the Trades endpoint should be called.
Request example for POST /payments/transfer
{
"paymentReason": "buying_a_vehicle",
"reference": "My reference",
"currency": "AUD",
"amount": 50000,
"fromWalletId": "4321dcba-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"toWalletId": "1234abcd-e5f6-7g8h-9i0j-k1l2m3n4o5p6",
"externalReference": "string"
}
After the creation of the Transfer request it undergoes a number of validation checks before creating Payment Transaction and sending back a response.
In response to your request you will receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Within the successful response you will receive all the data you’ve provided with the paymentTransactionId
, paymentType
(for transfers it will always be “transfer”), status
of the Transaction, createdAt
and updatedAt
dates and time.
PaymentTransactionId
can be used to refer to that Payment Transaction.
To receive updates on the Payment Transaction status changes please refer to Webhooks.
Response example for POST /payments/transfer
{
"item": {
"paymentTransactionId": "string",
"paymentReason": "string",
"paymentDate": "2024-08-09",
"reference": "My reference",
"paymentType": "payout",
"currency": "AUD",
"amount": 50000,
"fromWalletId": "string",
"toWalletId": "string",
"status": "submitted",
"createdAt": "2024-08-09T05:58:17.918Z",
"updatedAt": "2024-08-09T05:58:17.918Z",
"externalReference": "string"
}
}
Most transfers will process instantaneously.
How do Transfers work
Before a Transfer is created it undergoes a round of checks to make sure everything is set correctly and no data is missing.
After the system has checked that the following conditions have been met:
-
needed data is provided;
-
toWallet
is valid and active (for Transfers) -
currency
match the Wallets
The status
of the Transer will be set to “Processing” and response with the paymentTransactionID
will be sent back to you.
While in Processing status
, Transfers undergo a Compliance Check (if any action is required at this point, Send will reach out via established channels to rectify any issues/gather necessary documentation).
At this point, if Compliance fails the Transfer it will go into a Rejected status
.
Once Compliance pass the Transfer it will go into Awaiting Funds status
until the funds have been received. Once received, the Transfer will go to Settled status
Transfer Status Flow
Fetching Information
Fetching all Recipients for the Trading Account
To request all the Recipients for the specific Trading Account you can send a signed GET accounts/{tradingaccountId}/recipients
request.
In response to your request you will receive either a SUCCESS 200
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid accountId
in the API key, a SUCCESS response will return the information for all the Recipients for a specific Trading Account.
Note that standard pagination rules are applied for the response.
Fetching all Payment Addresses for the Recipient
To request all the Payment Addresses for the specific Recipient you can send a signed GET recipients/{recipientId}/payment-addresses
request.
In response to your request you will receive either a SUCCESS 200
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid recipientId
in the API key, a SUCCESS response will return the information for all the Payment Addresses for a specific Recipient.
Note that standard pagination rules are applied for the response.
Fetching a previously created Recipient
To request the information for a given Recipient you can send a signed GET /recipients/{recipientId}
request.
In response to your request you will receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid recipientId
in the URL, a SUCCESS response will return the information for the given Recipient
Note that standard pagination rules are applied for the response.
Fetching a previously created Payment Address
To request the information for a given Payment Address you can send a signed GET /payment-addresses/{paymentAddressId}
request.
In response to your request you will receive either a SUCCESS 201
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid paymentAddressId
in the URL, a SUCCESS response will return the information for the given Payment Address
Note that standard pagination rules are applied for the response.
Fetching all the Payments for the enterprise account
To request all the Payments for the specific enterprise account you can send a signed GET /payments
request.
In response to your request you will receive either a SUCCESS 200
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid accountId
in the API key, a SUCCESS response will return the information for all the payments for a specific Enterprise Account.
Note that standard pagination rules are applied for the response.
Fetching a specific Payment Transaction
To request the information about a specific Payment Transaction you can send a signed GET /payments/{paymentTransactionId}
request.
In response to your request you will receive either a SUCCESS 200
response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid paymentTransactionId
in the URL, a SUCCESS response will return the information for a specific Payment Transaction.
Note that standard pagination rules are applied for the response.
Fetching all Payments within a specific Trading Account
To request the information about all the Payments made for the Trading Account you can send a signed GET /accounts/{tradingaccountId}/payments
request.
In response to your request you will receive either a SUCCESS 200 response or one of the error responses (400, 401, 500). See Status Codes & Error Messages.
Given a valid tradingaccountId
in the URL, a SUCCESS response will return all the Payments made for the Trading Account.
Note that standard pagination rules are applied for the response.
Not Seeing What You're Looking For?
We are always looking to improve our API documentation to ensure Sends systems are easy to understand and quick to build against. If you're struggling to find the answer to a question we either haven't made it easy enough to find the relevant docs or we haven't had a chance to write something up for it yet.
Either way we want to hear from you!
Head over to our Discussion Board and leave us a note. We keep a close eye on this and want to ensure we make these docs as useful as they can be so will jump on any posts quickly.
Updated 3 months ago