Skip to main content
POST
/
ppi
/
wallet
/
transfer
/
verify
Verify Transfer
curl --request POST \
  --url https://api.cashfree.com/ppi/wallet/transfer/verify \
  --header 'Content-Type: application/json' \
  --header 'x-api-version: <x-api-version>' \
  --header 'x-client-id: <api-key>' \
  --header 'x-client-secret: <api-key>' \
  --data '
{
  "transfer_id": "TRANSFER123456",
  "otp": "222113"
}
'
{
  "user_id": "USER827364",
  "wallet_id": "WALLET936721",
  "cf_transfer_id": "8901234567890123456",
  "transfer_id": "TRANSFER123456",
  "amount": 500.75,
  "transfer_mode": "NEFT",
  "sub_wallet": {
    "cf_sub_wallet_id": "35246543210987654321",
    "name": "Cashfree payout Wallet",
    "type": "FULL_KYC_PPI",
    "status": "ACTIVE",
    "balance": 9500.86
  },
  "status": "PENDING",
  "status_code": "TRANSFER_INITIATED",
  "bank_ref_no": null,
  "bene_details": {
    "bene_id": "BENE123",
    "cf_bene_instrument_id": "35246543210987654323",
    "instrument_details": {
      "bank_account_number": "1234567890",
      "ifsc": "HDFC0000123"
    }
  },
  "purpose": "BUSINESS",
  "remarks": "Vendor payment",
  "notes": {
    "example_key": "example_value"
  },
  "initiated_at": "2025-09-02T10:15:30Z",
  "processed_at": null
}

Documentation Index

Fetch the complete documentation index at: https://www.cashfree.com/docs/llms.txt

Use this file to discover all available pages before exploring further.

Call this API after Initiate Transfer. Use Get Transfer Details to proceed with bank processing after OTP succeeds.
You can submit an OTP for verification at most three times per transfer.

Authorizations

x-client-id
string
header
required

Your unique client identifier issued by Cashfree.

x-client-secret
string
header
required

The secret key associated with your client ID.

Headers

x-api-version
string
default:2025-11-01
required

API version to be used. Format is in YYYY-MM-DD.

Example:

"2025-11-01"

Body

application/json
transfer_id
string
required

Transfer identifier from the initiate transfer request (transfer_id you supplied while initiating the transfer).

Required string length: 1 - 50
Example:

"TRANSFER123456"

otp
string
required

One-time password received by the end user on the configured notification channels.

Required string length: 4 - 10
Example:

"222113"

Response

OTP verified successfully and transfer submitted for processing.

user_id
string

Unique identifier for the user, as provided by you during PPI user creation.

Example:

"USER827364"

wallet_id
string

Unique identifier for the wallet, as provided by you during wallet creation.

Example:

"WALLET936721"

cf_transfer_id
string

Unique identifier for the transfer transaction, generated by Cashfree.

Example:

"8901234567890123456"

transfer_id
string

Unique identifier for the transfer transaction, as provided by you during the transfer request.

Example:

"TRANSFER123456"

amount
number<double>

Amount that was transferred.

Example:

1250.5

transfer_mode
enum<string>

Mode of transfer used.

Available options:
RTGS,
NEFT,
IMPS,
UPI
Example:

"IMPS"

sub_wallet
object

Sub-wallet details from which the amount was transferred.

status
enum<string>

Status of the transfer operation.

Available options:
RECEIVED,
PENDING,
SUCCESS,
FAILED,
REJECTED,
VALIDATION_PENDING,
REVERSED,
APPROVAL_PENDING,
QUEUED,
MANUALLY_REJECTED
Example:

"PENDING"

bank_ref_no
string | null

Bank reference number for the transfer. Will be null if transfer is not yet processed.

Example:

"BNK202502101530001"

status_code
string

Status code for detailed tracking of transfer progress.

Example:

"TRANSFER_INITIATED"

bene_details
object

Beneficiary details used for the transfer.

purpose
string

Purpose of the transfer.

Example:

"SALARY"

remarks
string

Remarks for the transfer transaction.

Example:

"Monthly groceries transfer"

notes
object

Additional notes provided during transfer creation.

Example:
{
"example_key": "example_value",
"example_key2": "example_value2"
}
initiated_at
string<date-time>

Timestamp when the transfer transaction was initiated.

Example:

"2025-09-02T10:15:30Z"

processed_at
string<date-time> | null

Timestamp when the transfer transaction was processed. Will be null if still pending.

Example:

"2025-09-02T10:17:45Z"