Inter Bank Transfer
curl --request POST \
--url https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"destinationBankCode": "<string>",
"destinationAccountNumber": "<string>",
"destinationAccountName": "<string>",
"sourceAccountNumber": "<string>",
"sourceAccountName": "<string>",
"remarks": "<string>",
"amount": 123,
"currencyId": "<string>",
"customerTransactionReference": "<string>",
"stagingStatus": "<string>"
}
'import requests
url = "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer"
payload = {
"destinationBankCode": "<string>",
"destinationAccountNumber": "<string>",
"destinationAccountName": "<string>",
"sourceAccountNumber": "<string>",
"sourceAccountName": "<string>",
"remarks": "<string>",
"amount": 123,
"currencyId": "<string>",
"customerTransactionReference": "<string>",
"stagingStatus": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
destinationBankCode: '<string>',
destinationAccountNumber: '<string>',
destinationAccountName: '<string>',
sourceAccountNumber: '<string>',
sourceAccountName: '<string>',
remarks: '<string>',
amount: 123,
currencyId: '<string>',
customerTransactionReference: '<string>',
stagingStatus: '<string>'
})
};
fetch('https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'destinationBankCode' => '<string>',
'destinationAccountNumber' => '<string>',
'destinationAccountName' => '<string>',
'sourceAccountNumber' => '<string>',
'sourceAccountName' => '<string>',
'remarks' => '<string>',
'amount' => 123,
'currencyId' => '<string>',
'customerTransactionReference' => '<string>',
'stagingStatus' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer"
payload := strings.NewReader("{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": "EMBe66029d4f6e2432a905a3642fa0dd380",
"statusCode": 200,
"code": "00",
"message": "Request is being processed.",
"succeeded": true
}
{
"data": {
"status": "PENDING_OTP",
"pendingReference": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"statusCode": 202,
"message": "An OTP has been sent to your organisation's email.",
"succeeded": true
}
{
"statusCode": 403,
"message": "The destination account is not one of your organisation's payout accounts. Add it on the portal or contact support.",
"succeeded": false
}
Payout
Inter Bank Transfer
This endpoint initiates a bank funds transfer from an Embedly wallet account within your organization, to an external bank account.
POST
/
api
/
Payout
/
inter-bank-transfer
Inter Bank Transfer
curl --request POST \
--url https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"destinationBankCode": "<string>",
"destinationAccountNumber": "<string>",
"destinationAccountName": "<string>",
"sourceAccountNumber": "<string>",
"sourceAccountName": "<string>",
"remarks": "<string>",
"amount": 123,
"currencyId": "<string>",
"customerTransactionReference": "<string>",
"stagingStatus": "<string>"
}
'import requests
url = "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer"
payload = {
"destinationBankCode": "<string>",
"destinationAccountNumber": "<string>",
"destinationAccountName": "<string>",
"sourceAccountNumber": "<string>",
"sourceAccountName": "<string>",
"remarks": "<string>",
"amount": 123,
"currencyId": "<string>",
"customerTransactionReference": "<string>",
"stagingStatus": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
destinationBankCode: '<string>',
destinationAccountNumber: '<string>',
destinationAccountName: '<string>',
sourceAccountNumber: '<string>',
sourceAccountName: '<string>',
remarks: '<string>',
amount: 123,
currencyId: '<string>',
customerTransactionReference: '<string>',
stagingStatus: '<string>'
})
};
fetch('https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'destinationBankCode' => '<string>',
'destinationAccountNumber' => '<string>',
'destinationAccountName' => '<string>',
'sourceAccountNumber' => '<string>',
'sourceAccountName' => '<string>',
'remarks' => '<string>',
'amount' => 123,
'currencyId' => '<string>',
'customerTransactionReference' => '<string>',
'stagingStatus' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer"
payload := strings.NewReader("{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://payout-staging.embedly.ng/api/Payout/inter-bank-transfer")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"destinationBankCode\": \"<string>\",\n \"destinationAccountNumber\": \"<string>\",\n \"destinationAccountName\": \"<string>\",\n \"sourceAccountNumber\": \"<string>\",\n \"sourceAccountName\": \"<string>\",\n \"remarks\": \"<string>\",\n \"amount\": 123,\n \"currencyId\": \"<string>\",\n \"customerTransactionReference\": \"<string>\",\n \"stagingStatus\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": "EMBe66029d4f6e2432a905a3642fa0dd380",
"statusCode": 200,
"code": "00",
"message": "Request is being processed.",
"succeeded": true
}
{
"data": {
"status": "PENDING_OTP",
"pendingReference": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"statusCode": 202,
"message": "An OTP has been sent to your organisation's email.",
"succeeded": true
}
{
"statusCode": 403,
"message": "The destination account is not one of your organisation's payout accounts. Add it on the portal or contact support.",
"succeeded": false
}
Transaction Reference (transactionRef)
When a payout transaction is successfully submitted, atransactionRef is included in the response payload under the data object.Key Considerations:
- Store the
transactionRefsecurely on your end. It acts as the unique identifier for that specific transaction. - The
transactionRefcan be used to confirm the status of the transaction at a later time. - It is also essential for mapping webhook notifications to the correct payout transaction—especially for tracking successful debits.
Note:
On Staging environment, you must include the stagingStatus field in the request body. This allows you to simulate either a successful or failed payout. In both cases, a webhook notification will be sent indicating the outcome of the payout. On Production, you must skip this field entirely. Please ensure that you have configured your webhook URL on your staging dashboard in order to receive webhook notifications.Destination account
The destination account must be one of your organisation’s active, approved payout accounts at the same bank. It does not have to be your default payout account. If the destination is not one of your approved payout accounts, the request is rejected with403:
The destination account is not one of your organisation's payout accounts. Add it on the portal or contact support.
Add the account on the portal, or contact support if your organisation needs to pay out to other destinations.
OTP verification (opt-in)
If your organisation has opted in to payout OTP verification, a transfer is not queued straight away. Contact support to opt in or out.1
Initiate the transfer
Call this endpoint as usual. Limits, wallet, KYC, balance and duplicate-reference checks run first, so a transfer that would fail returns its error without sending an OTP.If the checks pass, the response is
202 with status PENDING_OTP and a pendingReference. A 6-digit OTP is emailed to your organisation’s email on file. It is valid for 2 minutes.2
Complete the transfer
Send the
pendingReference and the OTP to Complete Inter Bank Transfer. Every check runs again, then the response is 200 and the payout is queued.If your organisation has not opted in, this endpoint returns
200 and queues the payout immediately. No OTP is sent and no further call is needed.If
customerTransactionReference has already been used, use a new reference before starting another transfer.The status of the staging process. Possible values are
success or failed.Note: This field doesn’t apply on production and
should be removed entirely.Example: success{
"data": "EMBe66029d4f6e2432a905a3642fa0dd380",
"statusCode": 200,
"code": "00",
"message": "Request is being processed.",
"succeeded": true
}
{
"data": {
"status": "PENDING_OTP",
"pendingReference": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"statusCode": 202,
"message": "An OTP has been sent to your organisation's email.",
"succeeded": true
}
{
"statusCode": 403,
"message": "The destination account is not one of your organisation's payout accounts. Add it on the portal or contact support.",
"succeeded": false
}