Payouts
Initiate a Payout
Send funds from a virtual account to a verified beneficiary via IMPS, NEFT, RTGS, or UPI. Provide contact_id, va_id, amount, and payment_mode.
Initiate a Payout
curl --request POST \
--url https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust \
--header 'Content-Type: <content-type>' \
--header 'X-Real-IP: <x-real-ip>' \
--header 'x-api-key: <api-key>' \
--data '
{
"contact_id": "<string>",
"payment_mode": "<string>",
"amount": "<string>",
"order_id": "<string>",
"description": "<string>",
"transaction_purpose_code": "<string>",
"va_id": "<string>"
}
'import requests
url = "https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust"
payload = {
"contact_id": "<string>",
"payment_mode": "<string>",
"amount": "<string>",
"order_id": "<string>",
"description": "<string>",
"transaction_purpose_code": "<string>",
"va_id": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "<content-type>",
"X-Real-IP": "<x-real-ip>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-key': '<api-key>',
'Content-Type': '<content-type>',
'X-Real-IP': '<x-real-ip>'
},
body: JSON.stringify({
contact_id: '<string>',
payment_mode: '<string>',
amount: '<string>',
order_id: '<string>',
description: '<string>',
transaction_purpose_code: '<string>',
va_id: '<string>'
})
};
fetch('https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust', 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://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust",
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([
'contact_id' => '<string>',
'payment_mode' => '<string>',
'amount' => '<string>',
'order_id' => '<string>',
'description' => '<string>',
'transaction_purpose_code' => '<string>',
'va_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"X-Real-IP: <x-real-ip>",
"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://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust"
payload := strings.NewReader("{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("X-Real-IP", "<x-real-ip>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")
.header("x-api-key", "<api-key>")
.header("Content-Type", "<content-type>")
.header("X-Real-IP", "<x-real-ip>")
.body("{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")
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"] = '<content-type>'
request["X-Real-IP"] = '<x-real-ip>'
request.body = "{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_bodyUse this endpoint to send funds from a virtual account to a verified beneficiary contact. You can route payments over IMPS, NEFT, RTGS, or UPI by specifying the
payment_mode in your request body.
Only VERIFIED contacts can receive payouts. Call the Get Contact Status API before initiating if you are unsure of the beneficiary’s verification state.
Headers
string
required
Your secret API key.
string
required
Must be
application/json.string
required
Your whitelisted server IP address.
Request Body Example
{
"order_id": "TEST_ORDER_ID_12345",
"contact_id": "xxxxxxxxxxxx",
"amount": "100.00",
"payment_mode": "IMPS",
"description": "TEST FUND TRANSFER",
"transaction_purpose_code": "BS103",
"va_id": "ec1f20ee-eba6-49d8-9d69-909894629544"
}
Request Parameters
uuid
required
The
contact_id generated when you created the beneficiary contact.string
required
Transfer mode. Accepted values:
IMPS, NEFT, RTGS, UPI.string
required
Amount to transfer, expressed as a decimal string (e.g.,
"200.00").string
required
Your unique internal transaction ID used to track this payout on your side.
string
required
Narration or remarks for the fund transfer.
string
Permissible purpose code for the transaction. See Transaction Purpose Codes for the full list of accepted
bs_code values.string
required
The virtual account ID from which the funds will be debited.
Sample Request
curl --location 'https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust' \
--header 'x-api-key: YOUR_SECRET_KEY' \
--header 'Content-Type: application/json' \
--header 'X-Real-IP: YOUR_WHITELISTED_IP' \
--data '{
"order_id": "TEST_ORDER_ID_12345",
"contact_id": "YOUR_CONTACT_ID",
"amount": "100.00",
"payment_mode": "IMPS",
"description": "TEST FUND TRANSFER",
"transaction_purpose_code": "BS103",
"va_id": "YOUR_VA_ID"
}'
const response = await fetch('https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust', {
method: 'POST',
headers: { 'x-api-key': '<YOUR_API_KEY>', 'Content-Type': 'application/json', 'X-Real-IP': '<YOUR_WHITELISTED_IP>' },
body: JSON.stringify({ order_id: 'TEST_ORDER_ID_12345', contact_id: 'YOUR_CONTACT_ID', amount: '100.00', payment_mode: 'IMPS', description: 'TEST FUND TRANSFER', transaction_purpose_code: 'BS103', va_id: 'YOUR_VA_ID' })
});
console.log(await response.json());
import requests
response = requests.post(
"https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust",
headers={"x-api-key": "<YOUR_API_KEY>", "X-Real-IP": "<YOUR_WHITELISTED_IP>"},
json={"order_id": "TEST_ORDER_ID_12345", "contact_id": "YOUR_CONTACT_ID", "amount": "100.00", "payment_mode": "IMPS", "description": "TEST FUND TRANSFER", "transaction_purpose_code": "BS103", "va_id": "YOUR_VA_ID"},
)
print(response.json())
var body = "{\"order_id\":\"TEST_ORDER_ID_12345\",\"contact_id\":\"YOUR_CONTACT_ID\",\"amount\":\"100.00\",\"payment_mode\":\"IMPS\",\"description\":\"TEST FUND TRANSFER\",\"transaction_purpose_code\":\"BS103\",\"va_id\":\"YOUR_VA_ID\"}";
var request = java.net.http.HttpRequest.newBuilder(java.net.URI.create("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")).headers("x-api-key", "<YOUR_API_KEY>", "Content-Type", "application/json", "X-Real-IP", "<YOUR_WHITELISTED_IP>").POST(java.net.http.HttpRequest.BodyPublishers.ofString(body)).build();
var response = java.net.http.HttpClient.newHttpClient().send(request, java.net.http.HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
package main
import ("net/http"; "strings")
func main() {
payload := strings.NewReader(`{"order_id":"TEST_ORDER_ID_12345","contact_id":"YOUR_CONTACT_ID","amount":"100.00","payment_mode":"IMPS","description":"TEST FUND TRANSFER","transaction_purpose_code":"BS103","va_id":"YOUR_VA_ID"}`)
request, _ := http.NewRequest(http.MethodPost, "https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust", payload)
request.Header.Set("x-api-key", "<YOUR_API_KEY>")
request.Header.Set("Content-Type", "application/json")
request.Header.Set("X-Real-IP", "<YOUR_WHITELISTED_IP>")
response, _ := http.DefaultClient.Do(request)
defer response.Body.Close()
}
<?php
$curl = curl_init('https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust');
curl_setopt_array($curl, [CURLOPT_POST => true, CURLOPT_HTTPHEADER => ['x-api-key: <YOUR_API_KEY>', 'Content-Type: application/json', 'X-Real-IP: <YOUR_WHITELISTED_IP>'], CURLOPT_POSTFIELDS => json_encode(['order_id' => 'TEST_ORDER_ID_12345', 'contact_id' => 'YOUR_CONTACT_ID', 'amount' => '100.00', 'payment_mode' => 'IMPS', 'description' => 'TEST FUND TRANSFER', 'transaction_purpose_code' => 'BS103', 'va_id' => 'YOUR_VA_ID']), CURLOPT_RETURNTRANSFER => true]);
echo curl_exec($curl);
curl_close($curl);
require "json"
require "net/http"
uri = URI("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")
request = Net::HTTP::Post.new(uri, {"x-api-key" => "<YOUR_API_KEY>", "Content-Type" => "application/json", "X-Real-IP" => "<YOUR_WHITELISTED_IP>"})
request.body = {order_id: "TEST_ORDER_ID_12345", contact_id: "YOUR_CONTACT_ID", amount: "100.00", payment_mode: "IMPS", description: "TEST FUND TRANSFER", transaction_purpose_code: "BS103", va_id: "YOUR_VA_ID"}.to_json
puts Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request).body }
Success Response
{
"status": "SUCCESS",
"status_code": 200,
"message": "Succefully initiated payout!",
"detail": null,
"data": {
"bluswap_transaction_id": "xxxxxxxxxxx",
"ref_id": "xxxxxxxxxxxxxx",
"amount": "100.00",
"order_id": "TEST_ORDER_ID_12345",
"payment_mode": "IMPS",
"status": "INITIATED",
"currency": null,
"total_balance": null,
"available_balance": "112369.24",
"remarks": "TEST FUND TRANSFER",
"to_account_number": "xxxxxxxxxxxxx"
}
}
Save the
bluswap_transaction_id from the response. You will need it to poll the Check Transaction Status endpoint or reconcile webhook callbacks.Error Responses
- Beneficiary Under Verification (422)
- Invalid Beneficiary Details (400)
This error occurs when the beneficiary verification process is still in progress.Recommended Action: Call the Get Contact Status API. Wait until the status becomes
{
"status": "FAILED",
"status_code": 422,
"message": "Beneficiary is under verification, Try Initiating Payout after some time.",
"detail": null,
"data": null
}
VERIFIED, then retry the payout request.This error occurs when the beneficiary bank details are invalid or the contact status is invalid.Possible reasons:
{
"status": "FAILED",
"status_code": 400,
"message": "Beneficiary Details is Invalid",
"detail": null,
"data": null
}
- Bank account details are incorrect
- Contact verification failed
- Beneficiary account marked as invalid
⌘I
Initiate a Payout
curl --request POST \
--url https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust \
--header 'Content-Type: <content-type>' \
--header 'X-Real-IP: <x-real-ip>' \
--header 'x-api-key: <api-key>' \
--data '
{
"contact_id": "<string>",
"payment_mode": "<string>",
"amount": "<string>",
"order_id": "<string>",
"description": "<string>",
"transaction_purpose_code": "<string>",
"va_id": "<string>"
}
'import requests
url = "https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust"
payload = {
"contact_id": "<string>",
"payment_mode": "<string>",
"amount": "<string>",
"order_id": "<string>",
"description": "<string>",
"transaction_purpose_code": "<string>",
"va_id": "<string>"
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "<content-type>",
"X-Real-IP": "<x-real-ip>"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-key': '<api-key>',
'Content-Type': '<content-type>',
'X-Real-IP': '<x-real-ip>'
},
body: JSON.stringify({
contact_id: '<string>',
payment_mode: '<string>',
amount: '<string>',
order_id: '<string>',
description: '<string>',
transaction_purpose_code: '<string>',
va_id: '<string>'
})
};
fetch('https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust', 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://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust",
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([
'contact_id' => '<string>',
'payment_mode' => '<string>',
'amount' => '<string>',
'order_id' => '<string>',
'description' => '<string>',
'transaction_purpose_code' => '<string>',
'va_id' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"X-Real-IP: <x-real-ip>",
"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://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust"
payload := strings.NewReader("{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "<content-type>")
req.Header.Add("X-Real-IP", "<x-real-ip>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")
.header("x-api-key", "<api-key>")
.header("Content-Type", "<content-type>")
.header("X-Real-IP", "<x-real-ip>")
.body("{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.bluswap.co/api/v1/merchants/initiate_pay_out_cust")
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"] = '<content-type>'
request["X-Real-IP"] = '<x-real-ip>'
request.body = "{\n \"contact_id\": \"<string>\",\n \"payment_mode\": \"<string>\",\n \"amount\": \"<string>\",\n \"order_id\": \"<string>\",\n \"description\": \"<string>\",\n \"transaction_purpose_code\": \"<string>\",\n \"va_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body