Skip to main content
POST
/
payout
/
transfers
Process Validated Payout
curl --request POST \
  --url https://api.cashfree.com/payout/transfers \
  --header 'Content-Type: <content-type>' \
  --header 'x-api-version: <x-api-version>' \
  --header 'x-client-id: <x-client-id>' \
  --header 'x-client-secret: <x-client-secret>' \
  --data '
{
  "transfer_amount": "1",
  "transfer_id": "JUNOB2018142",
  "transfer_token": "0ea4a02e-ff8d-42c1-8800-73711fdbff16",
  "transfer_mode": "upi",
  "transfer_remarks": "test",
  "fundsource_id": "YESB_CONNECTED"
}
'
import requests

url = "https://api.cashfree.com/payout/transfers"

payload = {
"transfer_amount": "1",
"transfer_id": "JUNOB2018142",
"transfer_token": "0ea4a02e-ff8d-42c1-8800-73711fdbff16",
"transfer_mode": "upi",
"transfer_remarks": "test",
"fundsource_id": "YESB_CONNECTED"
}
headers = {
"x-client-id": "<x-client-id>",
"x-client-secret": "<x-client-secret>",
"x-api-version": "<x-api-version>",
"Content-Type": "<content-type>"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {
'x-client-id': '<x-client-id>',
'x-client-secret': '<x-client-secret>',
'x-api-version': '<x-api-version>',
'Content-Type': '<content-type>'
},
body: JSON.stringify({
transfer_amount: '1',
transfer_id: 'JUNOB2018142',
transfer_token: '0ea4a02e-ff8d-42c1-8800-73711fdbff16',
transfer_mode: 'upi',
transfer_remarks: 'test',
fundsource_id: 'YESB_CONNECTED'
})
};

fetch('https://api.cashfree.com/payout/transfers', 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.cashfree.com/payout/transfers",
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([
'transfer_amount' => '1',
'transfer_id' => 'JUNOB2018142',
'transfer_token' => '0ea4a02e-ff8d-42c1-8800-73711fdbff16',
'transfer_mode' => 'upi',
'transfer_remarks' => 'test',
'fundsource_id' => 'YESB_CONNECTED'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: <content-type>",
"x-api-version: <x-api-version>",
"x-client-id: <x-client-id>",
"x-client-secret: <x-client-secret>"
],
]);

$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.cashfree.com/payout/transfers"

payload := strings.NewReader("{\n \"transfer_amount\": \"1\",\n \"transfer_id\": \"JUNOB2018142\",\n \"transfer_token\": \"0ea4a02e-ff8d-42c1-8800-73711fdbff16\",\n \"transfer_mode\": \"upi\",\n \"transfer_remarks\": \"test\",\n \"fundsource_id\": \"YESB_CONNECTED\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("x-client-id", "<x-client-id>")
req.Header.Add("x-client-secret", "<x-client-secret>")
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("Content-Type", "<content-type>")

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.cashfree.com/payout/transfers")
.header("x-client-id", "<x-client-id>")
.header("x-client-secret", "<x-client-secret>")
.header("x-api-version", "<x-api-version>")
.header("Content-Type", "<content-type>")
.body("{\n \"transfer_amount\": \"1\",\n \"transfer_id\": \"JUNOB2018142\",\n \"transfer_token\": \"0ea4a02e-ff8d-42c1-8800-73711fdbff16\",\n \"transfer_mode\": \"upi\",\n \"transfer_remarks\": \"test\",\n \"fundsource_id\": \"YESB_CONNECTED\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.cashfree.com/payout/transfers")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["x-client-id"] = '<x-client-id>'
request["x-client-secret"] = '<x-client-secret>'
request["x-api-version"] = '<x-api-version>'
request["Content-Type"] = '<content-type>'
request.body = "{\n \"transfer_amount\": \"1\",\n \"transfer_id\": \"JUNOB2018142\",\n \"transfer_token\": \"0ea4a02e-ff8d-42c1-8800-73711fdbff16\",\n \"transfer_mode\": \"upi\",\n \"transfer_remarks\": \"test\",\n \"fundsource_id\": \"YESB_CONNECTED\"\n}"

response = http.request(request)
puts response.read_body
{
  "transfer_id": "JUNOB2018142",
  "cf_transfer_id": "339",
  "status": "SUCCESS",
  "status_code": "COMPLETED",
  "status_description": "The transfer has been initiated via the partner bank successfully.",
  "beneficiary_details": {
    "beneficiary_id": "B_gewrtgfsdfgfsdf_V1ZYFF",
    "beneficiary_instrument_details": {
      "vpa": "sXXXXXs@upi"
    }
  },
  "currency": "",
  "transfer_amount": 1,
  "transfer_service_charge": 0,
  "transfer_service_tax": 0,
  "transfer_mode": "upi",
  "transfer_utr": "1732088013492889",
  "added_on": "2024-11-20T13:03:31",
  "updated_on": "2024-11-20T13:03:33"
}

Headers

x-client-id
string
required

Client app ID. You can find your app ID in the Merchant Dashboard.

Example:

"<CLIENT_ID>"

x-client-secret
string
required

Client secret key. You can find your secret key in the Merchant Dashboard.

Example:

"<CLIENT_SECRET>"

x-api-version
string
required

Payouts API version for this request.

Example:

"2024-01-01"

Content-Type
string
required

MIME type of the request or response content.

Example:

"application/json"

X-Request-Id
string

Request ID for the API call. Can be used to resolve tech issues. Communicate this in your tech related queries to Cashfree.

Body

application/json

Amount, transfer identifiers, mode, and optional remarks for a Process Validated Payout. The transfer_id and transfer_token must come from the same Validate Payout API call.

transfer_amount
string
required

Amount to transfer for the payout.

Example:

"1"

transfer_id
string
required

Must match the transfer_id from your preceding Validate Payout API request for this payout.

Example:

"JUNOB2018142"

transfer_token
string
required

Single-use transfer token from the Validate Payout API. Expires in one hour and is consumed when the payout is initiated.

Example:

"0ea4a02e-ff8d-42c1-8800-73711fdbff16"

transfer_mode
enum<string>
required

Transfer mode. With a transfer token, only upi is supported.

Available options:
upi
Example:

"upi"

transfer_remarks
string

Optional transfer remarks.

Example:

"test"

fundsource_id
string

Optional. Identifier of the connected bank account to use as the fund source.

Example:

"YESB_CONNECTED"

Response

Always returns HTTP 200 when the payout request is accepted. Use status and status_code for the lifecycle; other fields capture amounts, beneficiary context, bank reference, and timestamps.

Canonical payout payload after submission: merchant and Cashfree IDs, lifecycle fields, beneficiary snapshot, monetary lines, rail reference when present, and audit times.

transfer_id
string

Merchant-provided transfer ID.

cf_transfer_id
string

Cashfree internal transfer ID.

status
string

High-level status.

status_code
string

Detailed status code (RECEIVED, COMPLETED, etc.).

status_description
string

Defines the current processing state from Cashfree or the partner bank.

beneficiary_details
object

Beneficiary identifiers and instrument details (for example masked VPA) associated with this payout.

currency
string

ISO currency code for the payout amount (empty when not applicable).

transfer_amount
number

Payout amount in major currency units as recorded for this transfer.

transfer_service_charge
number

Service charge applied to this payout, if any.

transfer_service_tax
number

Tax on the service charge, if applicable.

transfer_mode
string

Channel used for the payout (for example upi when a transfer token was supplied).

transfer_utr
string

Bank or network unique transaction reference, when assigned.

added_on
string

Timestamp when Cashfree first recorded this payout request.

updated_on
string

Timestamp of the last status update for this payout.