# API Best Practices
Source: https://www.cashfree.com/docs/api-reference/api-best-practices
Recommended practices for building secure, reliable, and performant integrations with Cashfree APIs.
Building a reliable Cashfree API integration requires more than correct API calls. These practices cover security, error handling, performance, and testing the areas most likely to cause issues if overlooked.
## Security
Apply the following practices to protect your API credentials and ensure only legitimate requests reach your integration.
### Verify webhook signatures
Always verify the signature of every incoming webhook payload before processing it. Skipping this step exposes your integration to spoofed or tampered requests.
Never process a webhook payload without first validating its signature. For step-by-step instructions and code examples, see the webhook signature verification page for your product.
### Secure your API keys
Exposed API keys (`x-client-id` and `x-client-secret`) can result in unauthorised transactions and data breaches. Apply the following controls to protect your keys.
* Never commit API keys to version control.
* Never expose API keys in client-side or browser-facing code.
* Store keys in environment variables or a dedicated secrets manager.
* Restrict key access to only the services and environments that require it.
* Rotate keys immediately if you suspect they have been compromised.
### Avoid logging sensitive data
Do not log raw API request or response bodies that contain sensitive fields such as card numbers, CVVs, bank account details, or authentication tokens. Logging this data creates a PCI DSS compliance risk and increases the potential impact of a security breach.
Log only the fields required for debugging, such as order IDs, status codes, and timestamps.
## Reliability
Follow these practices to ensure your integration handles failures gracefully and maintains consistent behaviour under load.
### Use idempotency keys
Include a unique idempotency key in every mutating request (for example, payment creation or refund initiation) using the `x-idempotency-key` request header. If a request fails or times out, retrying with the same key prevents duplicate transactions.
```http theme={"dark"}
x-idempotency-key:
```
Use a UUID as the key value. Generate a new UUID for each logical operation, and reuse the same key only when retrying that specific request.
### Subscribe to webhooks instead of polling
Subscribe to webhook events instead of polling the API for status updates. Polling consumes rate limit quota and introduces unnecessary latency into your integration.
For setup instructions, see [webhooks](/docs/payments/online/webhooks/overview) for further detailed information.
### Avoid concurrent requests
Do not send multiple simultaneous requests from the same account. Concurrent requests increase the likelihood of rate limit errors and can degrade integration performance.
If your use case requires high request volume, use a queue or a similar mechanism to process requests sequentially and manage throughput.
### Include a request ID
Add a unique identifier to each request using the `x-request-id` header. This makes it easier to trace requests in logs, correlate errors, and collaborate with Cashfree support during troubleshooting.
## Performance
Apply the following practices to reduce latency, manage throughput, and make efficient use of your API quota.
### Handle rate limit errors
When your integration receives a rate limit error, pause all outgoing requests and apply the following logic before retrying.
* If the `x-ratelimit-retry` response header is present, wait the number of seconds it specifies before retrying.
* If the `x-ratelimit-remaining` header value is `0`, do not send another request until the time indicated by `x-ratelimit-reset` has passed.
When applying exponential backoff, start with a one-second delay and double the wait time with each subsequent attempt (2s, 4s, 8s). Add a small random jitter to each interval to prevent multiple clients from retrying simultaneously. Limit retries to three to five attempts.
To increase your rate limit or burst limit, raise a request through the [Merchant Dashboard](https://merchant.cashfree.com/merchants/pg/developers/rate-limits). For detailed steps, see the rate limits page for your product.
### Optimise connections with keep-alive
Use HTTP keep-alive to reuse a single connection across multiple API requests. This reduces per-request latency and lowers resource usage on both client and server. Set the following header in all API requests.
```http theme={"dark"}
Connection: keep-alive
```
## Integration
Follow these practices to ensure your integration stays current, reduces manual effort, and aligns with Cashfree's supported conventions.
### Specify the API version
Always use the latest API version to access current features, performance improvements, and security updates. Cashfree APIs use a date-based versioning scheme. Specify the version in the `x-api-version` request header using the format `YYYY-MM-DD`.
```http theme={"dark"}
x-api-version: 2025-01-01
```
If you are on an older version, upgrade to the latest to benefit from new capabilities and bug fixes.
### Use Cashfree SDKs
Cashfree provides official SDKs in popular programming languages to reduce integration effort. The SDKs handle authentication, request and response formatting, response parsing, and error handling.
Access pre-built libraries for your preferred language and start integrating faster.
## Testing
Complete all integration testing in the Cashfree sandbox environment before deploying to production. The sandbox replicates production behaviour without processing real transactions.
To retrieve your sandbox API keys, follow these steps.
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and sign in with your credentials.
2. Navigate to your product under **Developers** > **API Keys**.
3. Copy the test mode keys and use them in your sandbox environment.
# Authentication
Source: https://www.cashfree.com/docs/api-reference/authentication
Learn how to authenticate Cashfree APIs using API keys, generate sandbox and production credentials, and pass headers correctly across payments and payouts.
Almost all Cashfree APIs require authentication. There are some exceptions like the `/order/sessions` Payments API.
Each Cashfree product requires its own unique client ID and client secret. For
example, if you are using both the Payments API and the Payouts API, you must
generate separate credentials for each. This means one set of keys for the
Payments API and a different set of keys for the Payouts API.
## Merchant authentication
* The standard authentication for merchants uses two specific headers `x-client-id` and `x-client-secret`. Pass your `appId` and `secretKey` in these fields.
* Ensure that you place your secret key securely and that no one else can access it.
* Also never call any API which requires authentication from the client as that would require you to expose the secret key to the client.
Below is a curl request which shows how to send these headers in the API call.
```bash theme={"dark"}
curl --request {REQUEST-TYPE} \
--url https://sandbox.cashfree.com/pg/{resource} \
--header 'Content-Type: application/json' \
--header 'x-api-version: 2025-01-01' \
--header 'x-client-id: ' \
--header 'x-client-secret: '
...
...
```
## Generate API keys
Each Cashfree product requires its own unique client ID and client secret. For example, if you are using both the Payments API and the Payouts API, you must generate separate credentials for each. This means one set of keys for the Payments API and a different set of keys for the Payouts API.
Follow the below steps to generate your API key for Payment Gateway.
1. Go to **Payment Gateway Dashboard** > and click on **Developers** icon in the right navigation or click **Developers** on the top right of the [Merchant Dashboard](https://merchant.cashfree.com/merchants).
2. Click **API Keys** under Payment Gateway.\
In the test environment, Cashfree auto-generates your API keys. In the production environment, click **Generate API Keys** and complete the 2FA authentication to generate the keys. Cashfree uses separate credentials for each environment, so ensure you use the correct set for the environment you are working in.
3. Once generated, the dashboard shows the API keys in a masked format. To view the full set of keys, click the icon and select **View API Key**. In the production environment, you would be required to do 2FA authentication to view the keys. You must securely store your api keys at all times.
You can also navigate directly to your [Production API credentials](https://merchant.cashfree.com/merchants/pg/developers/api-keys?env=prod) in the Merchant Dashboard.
You can only generate a single API key pair at a time. Once you generate the
keys from the dashboard, keep them secure. If it is lost, you need to
re-generate them from the dashboard.
## Partner authentication
If you are building a platform and want to use the Payment APIs on behalf of your customers you can do so using by leveraging authentication for platforms. You should use the **x-partner-apikey** and **x-partner-merchantid** headers instead of the **x-client-id** and **x-client-secret** headers.
* **x-partner-apikey**: This is the common API Key generated and unique for each Partner
* **x-partner-merchantid**: This is the unique merchant ID for each merchant associated with the Partner.\
To view the merchant ID for each merchant, login to your Cashfree Partner Dashboard with your partner login credentials > go to the **Merchants** section, and copy the **Merchant ID** of the respective merchant.
Click [here](/docs/partners/embedded/integration/gateway-integration#partner-api-keys) to know how to generate partner authentication keys.
# Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/overview-ts
Resolve common Cashfree integration issues across payments, payouts, webhooks, SDKs, and Secure ID with quick fixes, error references, and debug steps.
Integration errors can occur due to incorrect configurations, missing features, or environment mismatches. This guide outlines the most common issues across Cashfree products and provides actionable steps to help you resolve them quickly and ensure a smooth integration experience.
Resolve common integration issues related to accepting online and in-person payments.
Troubleshoot payout failures, IP whitelisting errors, and other disbursal-related issues.
Diagnose and fix issues related to identity verification and document validation flows.
Learn how to handle webhook delivery failures, signature mismatches, and response timeouts.
Get help with integration errors and compatibility issues across Cashfree’s SDKs.
# Payments Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/payments-ts
Troubleshoot Cashfree integration issues including authentication failures, order creation errors, UPI flow problems, and checkout configuration.
The Authentication fails when:
* Test credentials are used in the production environment or vice versa.
* Client ID and Client Secret are passed in the request body instead of as headers.
* API keys from different environments are mixed (for example, a Sandbox App ID used with a Production Secret Key).
* Incorrect API keys are used, such as keys copied incorrectly or taken from a different account.
To troubleshoot this issue, follow these steps:
* Ensure you are using the correct API keys displayed in the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
* Use test credentials in the test environment and production credentials in the live environment. For example, use the Client ID and Client Secret generated for the Test/Sandbox environment when making requests to `https://sandbox.cashfree.com`.
* When calling the production API, use the Production API Key and Secret Key with the Production endpoint (for example, `https://api.cashfree.com/pg/orders/{order_id}`). Do not mix Sandbox credentials with the Production endpoint, or vice versa.
* Pass the Client ID and Client Secret as headers, not in the request body.
* Ensure both keys are from the same environment.
For more details, refer to the [authentication documentation](/docs/api-reference/authentication).
This scenario covers multiple concerns, such as server-to-server (S2S) feature is enabled for you, but it isn't approved for your account or vice versa.
To troubleshoot this issue, follow these steps:
* The prerequisite for S2S is that it requires PCI DSS compliance.
* To enable it, contact your Account Manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1). Once your account is reviewed and approved, this feature will be enabled.
The payment mode that the merchant is trying to make the payment isn't enabled for the respective account.
To troubleshoot this issue, follow these steps:
* Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Settings > Payment Methods** to enable the mode.
* Alternatively, contact your Account Manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
To troubleshoot this issue, follow these steps:
* The user needs to log out of the Amazon account from that system, clear the browser cache and try once again.
If you're encountering null or empty objects in the Get Order API response, please consider below cases.
* When no payment is associated with the order yet. ie a payment has not yet been attempted against the Order.
* If there's a delay in the payment being recorded due to bank or network delays.
* You are hitting the Get payments for an order API before your end customer has tried to pay.
To troubleshoot this issue, follow these steps:
* Please Configure webhooks to receive real-time payment updates.
* Use the Get Payments for Order API, as the Get Order Status API will only return the order's current state and not the payment specifics.
The [Get Payments for an Order API](/docs/api-reference/payments/latest/payments/get-payments-for-an-order) (`GET /pg/orders/{order_id}/payments`) returns an empty array (`[]`) when no payment attempt exists for the order. This happens if the customer opens checkout and then exits, closes the page, or goes back without selecting a payment method such as UPI, card, or netbanking. Cashfree creates a payment object only after the customer selects a method and starts an attempt.
Handle the response as follows:
* Empty array (`[]`): no payment attempt. Do not treat this as `USER_DROPPED`. `USER_DROPPED` appears on a payment object after the customer selected a method and then left the flow.
* One or more payment objects: use `payment_status` on each object. Possible values are `SUCCESS`, `FAILED`, `PENDING`, `NOT_ATTEMPTED`, `USER_DROPPED`, `VOID`, and `CANCELLED`.
The [Get Payments for an Order API](/docs/api-reference/payments/latest/payments/get-payments-for-an-order) requires the following headers:
* `x-api-version`: the API version you integrate with. Latest is `2026-01-01`.
* `x-client-id`: your App ID.
* `x-client-secret`: your Secret Key.
Platforms that call the API on behalf of merchants use `x-partner-apikey` and `x-partner-merchantid` instead of `x-client-id` and `x-client-secret`. See [API authentication](/docs/api-reference/authentication).
Pass the dummy mobile number `9999999999` in the `customer_phone` field of your [Create Order API](/docs/api-reference/payments/latest/orders/create-order) request to avoid storing payment instrument details such as cards or UPI handles. Cashfree does not store instrument details against this dummy number.
If you're encountering this issue, please consider below cases.
* More than two decimal places have been provided for the 'order\_amount' field. For example, `10.123` or `11089.360` are invalid; `11089.36` is valid.
* Order Amount is 0 or negative.
* You have exceeded the maximum amount limit set for your MID.
To troubleshoot this issue, follow these steps:
* Configure `order_amount` with a maximum of two decimal places.
* A minimum amount of one rupee is required.
* Kindly get the maximum amount limit raised for your Merchant ID. Please contact your Account Manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1)
If you're encountering this issue, please check if your Merchant Category Code (MCC) is under the blocked list for UPI Intent. This feature is not allowed for certain categories of business due to RBI regulations.
To troubleshoot this issue, please contact your Account Manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1)
When a customer enters invalid card details, Cashfree checkout displays an error message so they can correct the details and retry.
For the standard Payment Gateway checkout, `customer_phone` is a required field during order creation. You cannot omit the phone number or pass an empty value. The standard checkout pre-fills the value you provide and allows the customer to edit it before completing the payment.
The phone number does not directly affect the availability of UPI Intent or UPI QR. It is used for checkout personalisation and eligibility, including recommended payment methods, offers, Pay Later eligibility, card saving, and card linking.
This mismatch can occur when multiple payment attempts are made against the same Order ID. One attempt may fail (for example, due to insufficient funds) while a subsequent attempt succeeds. The Merchant Dashboard reflects the final successful status of the order, but your API response may be capturing one of the earlier failed attempts.
To see all payment attempts and their respective statuses for a specific order, use the [Get Payments for an Order API](/docs/api-reference/payments/latest/payments/get-payments-for-an-order).
To retrieve `cf_payment_id` values, use the [Get Payments for an Order API](/docs/api-reference/payments/latest/payments/get-payments-for-an-order). Pass the order ID as a path parameter. The response returns a list of all payment attempts made for that order, each containing its `cf_payment_id`.
If the [Get Payment by ID API](/docs/api-reference/payments/latest/payments/get-payment-by-id) returns `NOT_ATTEMPTED` while the webhook confirms `SUCCESS`, verify that you are passing the correct `cf_payment_id` in the API request path. Ensure you are not passing a phone number or any other session-derived value in the URL path where the API expects the `cf_payment_id` (for example, `/pg/orders/{order_id}/payments/{cf_payment_id}`). Always extract the `cf_payment_id` directly from the Cashfree webhook payload or the initial payment response.
To check the status of a specific payment against an order, use the endpoint `https://api.cashfree.com/pg/orders/{order_id}/payments/{cf_payment_id}`. This API returns the details of the payment ID passed, including the `payment_status` field.
You can generate sample API responses for various payment modes by referring to the [Order Pay documentation](/docs/api-reference/payments/latest/payments/order-pay). Within the documentation or testing environment, you can toggle between different payment modes to view their specific response structures.
# Payouts Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/payouts-ts
Troubleshoot Cashfree Payouts errors including IP whitelisting, beneficiary validation, transfer failures, balance checks, and signature verification flows.
This issue arises when the API requests are made from a non-whitelisted IP address.
To troubleshoot this issue, follow this step:
* Refer to the [Payouts documentation](/docs/api-reference/payouts/getting-started-with-payouts-apis#whitelist-your-ip-address) to whitelist your IP address.
This issue arises due to intermittent downtimes at Cashfree's end.
To troubleshoot this issue, please retry this API after 10 - 15 minutes.
# SDK Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/sdk-ts
Troubleshoot Cashfree SDK integration issues for Android, iOS, Flutter, React Native, and web JS, including build, initialisation, and checkout failures.
### Mobile SDKs
To troubleshoot this issue, follow this step:
* Always use the latest SDK versions. Check the [Changelog](/docs/payments/developers/changelog/android) for updates.
When the user is trying to install apps from sources other than the Play Store / App Store and test them in a Production environment then Cashfree mobile SDK Android, React Native, Flutter, Cordova, Ionic, Capacitor will block the transaction.
This error also occurs when the application package is not whitelisted by Cashfree or when you are using an outdated SDK version. Whitelist your app package or check the whitelisting status in the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). See [Whitelist Your Website or App](/docs/payments/online/go-live/whitelist). Upgrade your Flutter SDK to the latest stable version (for example, 2.4.0+52 or higher). Test with a build uploaded to the Google Play Store (or as a Play Store tester) so the source is recognised as trusted.
To troubleshoot this issue, follow these steps:
* Provide the package name of your internal testing application to Cashfree support so they can add it to the approved list.
* See the guidelines for testing apps in [production environments](/docs/payments/online/mobile/misc/cashfree_integrity_prod_testing).
This issue occurs when there is an NDK version mismatch between your local setup and the SDK requirements.\
To troubleshoot this issue, follow these steps:
* Update the ndk.dir path in your local.properties file:\
`ndk.dir=/path/to/ndk/`
* Alternatively, open Android Studio > SDK Manager > SDK Tools, and install the required NDK version.
This issue occurs when Gradle cannot find the required Cashfree dependencies.\
To troubleshoot this issue, follow these steps:
* Add the following repositories inside android/build.gradle under allprojects > repositories:\
`google()`\
`mavenCentral()`\
`maven { url "https://jitpack.io" }`
To initialise a payment, follow these steps:
* Use the method:\
`CashfreePGSDK.doPayment(orderId, setEnvironment, setPaymentSessionId);`
* Ensure the following:
* `orderId` and `paymentSessionId` are securely generated from your backend.
* `setEnvironment` is either `SANDBOX` or `PRODUCTION`.
* You specify the platform (for example, UPI, card, or netbanking).
This issue occurs in the sandbox (test) environment. Real UPI apps don't launch because transactions are simulated.\
To test UPI behaviour, follow these steps:
* Use the Cashfree UPI simulator with sandbox credentials.
* For end-to-end testing, use production mode with small payment amounts.
No. UPI Intent works only on supported mobile devices and mobile applications, because it opens an installed UPI app.
On desktop websites, present UPI QR. Do not offer UPI Intent or UPI Collect on desktop, except where NPCI still allows Collect. See [UPI Collect Flow Deprecation](/docs/payments/manage/payment-methods/upi-collect) for QR setup, iOS support, and exemption details.
The `payment_session_id_invalid` error means the payment session ID is missing or does not exist. Common causes include:
1. **Modified session ID**: Don't trim the `payment_session_id` or add extra characters to it. Pass it exactly as received from the Create Order API response.
2. **Environment mismatch**: Ensure the `payment_session_id` generated in one environment is not used in another. A Sandbox session ID cannot be used with the Production checkout environment.
To resolve this error:
1. Pass the `payment_session_id` exactly as received from the Create Order API.
2. Create the order in the same environment that the app uses.
3. Initialise `CFSession` with `CFEnvironment.PRODUCTION` for production orders, or `CFEnvironment.SANDBOX` for sandbox orders.
4. Verify that your API credentials, endpoint, and checkout environment are all consistent.
See [React Native Integration](/docs/payments/online/mobile/react-native) for the session setup.
To troubleshoot this issue, follow these steps:
* Run:\
`flutter clean`\
`flutter pub get`
* If issues persist, delete the following directories:\
`.gradle/`\
`.idea/`
To integrate the native UPI Intent flow on Android:
1. Create a Cashfree order from your server to obtain a `payment_session_id` and `order_id`.
2. Initialise the Cashfree Mobile SDK in your app.
3. Create a `CFSession` using the payment session ID and order ID.
4. Configure `CFUPIIntentCheckoutPayment`.
5. Call `doPayment()` to launch the native UPI Intent flow.
6. Handle the SDK callback and verify the final payment status from your backend.
See [Android Integration](/docs/payments/online/mobile/android) for full setup details.
No. Cashfree does not currently offer a UPI plugin or SDK for React Native that keeps the customer fully inside your app. The customer must still complete the payment through an external UPI application, such as Google Pay or PhonePe.
### Server-Side SDKs
If you use the Cashfree Node.js SDK (`cashfree-pg`), pass the environment as the `CFEnvironment.PRODUCTION` enum in the configuration constructor. Do not pass a plain string. A string value can cause the SDK to default to the sandbox host, which returns a 401 authentication error when you use live API keys.
Sample integration kits
* [Python](https://github.com/cashfree/cashfree-pg-sdk-python)
* [Java](https://github.com/cashfree/cashfree-pg-sdk-java)
* [.NET](https://github.com/cashfree/cashfree-pg-sdk-dotnet)
* [PHP](https://github.com/cashfree/cashfree-pg-sdk-php)
* [Node.js](https://github.com/cashfree/cashfree-pg-sdk-nodejs)
* [Go](https://github.com/cashfree/cashfree-pg)
# Secure ID Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/secureid-ts
Troubleshoot Cashfree Secure ID verification errors including bank account, PAN, GST, IFSC, and aadhaar APIs with checks for inputs, headers, and responses.
This issue arises when the customer's name isn't accessible through IMPS rails from partner banks. This is a bank-side limitation. The name can't be retrieved in this case.
Bank account details are invalid across all partner banks. This is a limitation on the bank’s end.
The account is valid but currently blocked, so transactions can't be processed. As part of the penny drop validation, we attempted to deposit ₹1 into the account. However, the transaction failed due to the blocked status.
To troubleshoot this issue, follow this step:
* Coordinate with the customer to verify and reactivate the account via their bank.
UTR generation usually occurs during penny drop validation. In this case, a different validation mechanism was used to improve the success rate, so a UTR wasn't generated.
To troubleshoot this issue, follow this step:
* If UTR generation is required for all validations, fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) to enable this configuration for your account.
This issue arises when there are excessive penny drop attempts made (for example, more than 15 in 24 hours) to the same account and IFSC code.
To troubleshoot this issue, follow this step:
* Fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) to unblock affected accounts.
This issue arises when you call Cashfree's APIs through your frontend.
To troubleshoot this issue, follow this step:
* To avoid CORS errors while integrating Cashfree's API, route the API requests through your backend server. Your backend can handle the request and pass the response back to the frontend. This approach bypasses browser-imposed CORS restrictions, as the call is made server-side.
In Secure ID, Penny Drop is a real transaction, so it is supported only in the Production environment. It does not perform a real verification in the Pre-Production (Test) environment. Instead, you will receive mock responses in the Test environment, which can be used to test and validate your integration before moving to Production.
A 422 Unprocessable Entity error in the Bank Account Validation API can occur for the following reasons:
1. You are using the deprecated V1 endpoint (for example, `/payout/v1/validation/bankDetails`), which is being retired. Migrate to the [Bank Account Verification Sync V2 API](/docs/api-reference/vrs/v2/bav-v2/bank-account-verification-sync-v2).
2. The required feature is not enabled for your account. Contact your Account Manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) to enable it.
3. There are invalid or missing request parameters.
4. The request does not meet the API's validation requirements.
The `id_not_found` status in the bank account verification API can occur for the following reasons:
* The account is returned as invalid by available sources.
* IMPS mode is not enabled for the specific bank account and IFSC combination. The verification process may rely on IMPS.
Verify with the respective bank whether IMPS transactions are enabled for the account.
A 404 error or `api_error` message can occur if you are using incorrect credentials. Ensure you are using API keys specifically generated from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) rather than general Payment Gateway credentials. Secure ID Client IDs should start with `CF`.
# Webhooks Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/integration-troubleshooting/webhooks-ts
Troubleshoot Cashfree webhook delivery issues including signature verification, retries, missing events, payload parsing, and endpoint availability problems.
This issue may arise due to multiple reasons, such as:
* High latency in response to the test payload.
* Webhook endpoint didn't return HTTP 200 OK.
To troubleshoot this issue, follow this step:
Ensure your webhook endpoint returns a 200 OK response within 50 ms during configuration.
This issue may arise due to multiple reasons, such as:
* Parsed payload is being used.
* Timestamp provided in the ‘x-webhook-timestamp’ isn't used for creating the signed payload.
To troubleshoot this issue, follow these steps:
* Use the raw payload and x-webhook-timestamp to generate the signed payload.
* Sign it using your client secret and HMAC SHA256.
* Refer [here](/docs/payments/online/webhooks/overview#webhook-signature-verification) for the sample code.
This issue may arise due to multiple reasons, such as:
* Endpoint not returning 200 OK.
* Required events not selected.
* Endpoint expects a non-JSON format.
* Payment is still in an intermediate state.
To troubleshoot this issue, follow these steps:
* Ensure the endpoint returns 200 OK and can parse JSON.
* Use the [Get Payment Status API](/docs/api-reference/payments/latest/payments/get-payments-for-an-order) to check the payment status.
This issue arises because HTTP (instead of HTTPS) webhook endpoint configured in production.
To troubleshoot this issue, follow this step:
* Use only HTTPS URLs for webhook endpoints in the production environment.
This error occurs when production API keys are not generated for your merchant account. To generate them:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Click **Switch to Prod** at the top right.
3. Click **Developers** at the top right.
4. Click **API Keys** under **Payment Gateway**.
5. Click **Generate API Keys** and complete two-factor authentication.
After the keys are generated, you can configure your production webhooks.
Receiving duplicate webhook events for a single successful payment can occur when multiple webhook versions are enabled for your account. Identify which webhook version you intend to use, then raise a request through the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1). Cashfree disables the unused version. This control is not available in the Merchant Dashboard.
For other causes, including retries and duplicate subscriptions, see [Receiving duplicate webhook events](/docs/payments/online/webhooks/troubleshooting#receiving-duplicate-webhook-events).
For comprehensive security guidelines including IP whitelisting, signature verification, and SSL configuration, refer to the [Webhook Security Checklist](/docs/payments/online/webhooks/security-checklist).
# Bill Fetch Request
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/bill-fetch/request
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/request/bill-fetch
Use this API to initiate a bill fetch or bill validation request for a customer.
This is an **async** API. It returns only an acknowledgement with a `ref_id`.
The actual bill details must be retrieved separately by polling the Bill Fetch Response API using this `ref_id`.
This API is only applicable for billers whose `fetch_requirement` or `support_bill_validation` is `MANDATORY` or `OPTIONAL`. For billers where both are `NOT_SUPPORTED` (i.e., `DIRECT_PAY` flow), calling this API will return a validation error. Proceed directly to the Bill Payment Request API for those billers.
The flow is determined using `fetch_requirement` and `support_bill_validation` from the Fetch Billers Info API response, evaluated in the following priority order:
| Priority | `fetch_requirement` | `support_bill_validation` | Flow |
|---|---|---|---|
| 1 | `MANDATORY` | Any | `FETCH_AND_PAY` |
| 2 | `NOT_SUPPORTED` | `MANDATORY` or `OPTIONAL` | `VALIDATE_AND_PAY` |
| 3 | `NOT_SUPPORTED` | `NOT_SUPPORTED` | `DIRECT_PAY` |
| 4 | `OPTIONAL` | `MANDATORY` | `VALIDATE_AND_PAY` |
| 5 | `OPTIONAL` | Any other | `FETCH_AND_PAY` |
For `DIRECT_PAY`, skip the bill fetch step and proceed directly to the Bill Payment Request API.
Store the `flow` field from the response. It determines which fields to expect in the Bill Fetch Response and whether a bill payment can proceed without a prior fetch.
# Bill Fetch Response
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/bill-fetch/response
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/response/bill-fetch
Use this API to poll the result of a previously initiated Bill Fetch or Bill Validation request.
Use the `ref_id` from the Bill Fetch Request API to retrieve the status and bill details.
Poll at increasing intervals until `message` is no longer `"Request is still being processed"`:
| Attempt | Wait before this poll |
|---|---|
| 1 | 5 seconds |
| 2 | 15 seconds |
| 3 | 30 seconds |
| 4 | 1 minute |
| 5+ | 3 minutes |
Stop polling when `message` is `"Bill details fetched successfully"` or `"Bill request failed"`. If the request remains in a processing state beyond your retry limit, treat it as a timeout and raise a support ticket.
- `bill_fetch_response` is present in every response, including success, failure, and pending states.
- For `FETCH_AND_PAY` success, the response includes `bill_fetch_response`, `bill_details`, `biller_response`, and `additional_info`.
- For `FETCH_AND_PAY` failure, the response includes only `bill_fetch_response`.
- For `VALIDATE_AND_PAY` success, the response includes `bill_fetch_response` and `additional_info`.
- For `VALIDATE_AND_PAY` failure, the response includes only `bill_fetch_response`.
- While the request is pending, the response includes only `bill_fetch_response`, with the processing status.
# Bill Payment Request
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/bill-payment/request
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/request/bill-payment
Use this API to initiate a bill payment against a previously fetched or validated bill. This is an **async** API. It returns only an acknowledgement with a `transaction_ref_id`. Poll the Bill Payment Response API using both `bill_fetch_ref_id` and `transaction_ref_id` to get the final payment status. The `bill_fetch_ref_id` is not required for the direct pay flow.
# Bill Payment Response
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/bill-payment/response
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/response/bill-payment
Use this API to poll for the result of a previously submitted bill payment request.
Call this using both `bill_fetch_ref_id` and `transaction_ref_id` from the Bill Payment Request API. The `bill_fetch_ref_id` is not required for the direct pay flow.
Poll at increasing intervals until `message` is no longer `"Payment is still being processed"`:
| Attempt | Wait before this poll |
|---|---|
| 1 | 5 seconds |
| 2 | 15 seconds |
| 3 | 30 seconds |
| 4 | 1 minute |
| 5+ | 3 minutes |
Stop polling when `message` is `"Payment successful"` or `"Payment failed"`. If the payment remains in a processing state beyond your retry limit, treat it as a timeout and raise a support ticket.
The outcome is conveyed by the top-level `message` and can be confirmed from `data.bill_payment_response.reason.response_code`:
Payment is still being processed (response_code PENDING): payment is still in progress. Continue polling.
Payment failed: payment failed. Read reason.compliance_reason for the cause.
# Fetch Biller Categories
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/billers/categories
openapi/bbps/bbps-cou.yaml get /bbps/cou/v1/billers/categories
Use this API to fetch the list of all active biller categories available on the BBPS network. Agent Institutions can use this to populate category selection in their UI. Since this data changes infrequently, it is recommended to fetch and cache it at predefined intervals instead of calling the API on every user request.
# Fetch Billers Info
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/billers/info
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/info
Use this API to fetch the complete catalog and MDM (Master Data Management) details of billers registered under BBPS. Use this to understand biller configuration, required customer input parameters, supported payment modes and channels, and fee structures. If the request body is omitted, all billers are returned.
# Data to Test Integration
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/data-to-test-integration
Use the sandbox credentials, test billers, and end-to-end flow on this page to validate your BBPS COU integration before going live.
Use the sandbox credentials and test flow on this page to validate your BBPS COU integration before going live. The sandbox environment supports end-to-end testing of the bill fetch and bill payment journey, including a built-in auto bill simulator for the Loan Repayment category.
Agent IDs and device block values for each supported initiating channel.
How to identify customer input parameters for any biller and how to use the auto bill simulator.
Step-by-step instructions to complete a full bill payment cycle in the sandbox environment.
## Sandbox credentials
Use the agent IDs below when constructing sandbox requests. Each agent ID is pre-configured for a specific initiating channel.
| Initiating channel | Channel code | Sandbox agent ID |
| :- | :- | :- |
| Internet Banking (Post-login) | `INTB` | `CH01CH02INB516193127` |
| Mobile Banking (Post-login) | `MOBB` | `CH01CH02MBBPAL001085` |
### Device block values
The device block must match the tag requirements of the initiating channel. Use the values below when building sandbox requests.
Pass the following tags in the `agent.device.tag` array for the `INTB` channel.
| Tag name | Sandbox value |
| :- | :- |
| `INITIATING_CHANNEL` | `INTB` |
| `IP` | `124.170.23.24` |
| `MAC` | `01-23-45-67-89-ab` |
Pass the following tags in the `agent.device.tag` array for the `MOBB` channel.
| Tag name | Sandbox value |
| :- | :- |
| `INITIATING_CHANNEL` | `MOBB` |
| `IP` | `124.170.23.24` |
| `IMEI` | `123456789012345` |
| `OS` | `IOS` |
| `APP` | `AGENTAPP` |
For the Bill Fetch Request API, the same values apply but are passed as named fields directly under `agent_device_info` (for example, `init_channel`, `ip`, `mac`) rather than as a tag array. The tag array format applies to the Bill Payment Request API.
## Test billers
### Finding customer input parameters
Each biller requires a specific set of customer identifiers to initiate a bill fetch. To find the correct parameters for a biller, call the [Fetch Billers Info API](/docs/api-reference/other-apis/bbps-cou/billers/info) and read the `biller_customer_params` field in the response. This field lists all the input parameter names and their expected formats that must be passed in the `input_params` block of the Bill Fetch Request.
### Auto bill simulator
For the Loan Repayment category, a built-in auto bill simulator is available in the sandbox environment. Instead of supplying real customer identifiers, pass `CF_AUTO_GENERATE` as the value for any input parameter. The system automatically generates a bill and returns a `ref_id` that you can use to poll the Bill Fetch Response API.
Use the following biller to test the auto bill simulator:
| Field | Value |
| :- | :- |
| Biller ID | `SWAR00027NAT2J` |
| Category | Loan Repayment |
| Input parameter value | `CF_AUTO_GENERATE` |
The auto bill simulator eliminates the need for real loan account numbers during sandbox testing, making it straightforward to run a complete end-to-end flow without any production data.
## End-to-end sandbox testing
The following steps walk you through a complete BBPS COU bill payment cycle in the sandbox environment using the auto bill simulator.
Call the [Bill Fetch Request API](/docs/api-reference/other-apis/bbps-cou/bill-fetch/request) using your sandbox credentials. Use biller ID `SWAR00027NAT2J` and pass `CF_AUTO_GENERATE` as the value for all input parameters in the `input_params` block.
A successful request returns a `ref_id`. Store this value — you will need it to poll the bill fetch response and to submit the bill payment request.
Call the [Bill Fetch Response API](/docs/api-reference/other-apis/bbps-cou/bill-fetch/response) using the `ref_id` from Step 1. Poll at regular intervals until the response returns a terminal status.
Once successful, note the `biller_response` object and the `additional_info` field from the response. You must pass both of these fields exactly as received into the Bill Payment Request in Step 4.
Use [Cashfree DevStudio](https://www.cashfree.com/devstudio) to complete the payment leg of the transaction in the sandbox environment. Once the payment is complete, DevStudio returns a Cashfree payment ID (`cf_payment_id`). Store this value — it is required as the `pg_reference_id` in the next step.
Call the [Bill Payment Request API](/docs/api-reference/other-apis/bbps-cou/bill-payment/request) with the following data:
* Under `head`, set `bill_fetch_ref_id` to the `ref_id` from Step 1 and set `pg_reference_id` to the `cf_payment_id` received from DevStudio in Step 3.
* Pass the `biller_response` object exactly as received from the Bill Fetch Response in Step 2.
* Pass the `additional_info` field exactly as received from the Bill Fetch Response in Step 2.
A successful request returns a `transaction_ref_id`. Store this value along with the `bill_fetch_ref_id` to poll for the final payment status.
Call the [Bill Payment Response API](/docs/api-reference/other-apis/bbps-cou/bill-payment/response) using both the `bill_fetch_ref_id` from Step 1 and the `transaction_ref_id` from Step 4. Poll at regular intervals until `data.status` returns `success` or `failed`.
A `success` status confirms that the end-to-end BBPS COU transaction completed successfully in the sandbox environment.
Complete all integration testing in the sandbox environment before deploying to production. For help with errors encountered during testing, refer to the [BBPS COU error codes](/docs/api-reference/other-apis/bbps-cou/error-codes) page.
# Bill Fetch and Payment Error Codes
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/error-codes
Cashfree BBPS Customer Operating Unit (COU) compliance response codes for failed bill fetch, validation, and payment requests, with retry categories.
The Cashfree BBPS Customer Operating Unit (COU) API returns a compliance response code in `compliance_resp_cd` when a bill fetch, validation, or payment request fails. The accompanying `compliance_reason` gives the human-readable failure reason. Use these codes to identify the cause of a failure and to decide whether you can retry the request.
## Retry categories
Each error code maps to a retry category that tells you how to handle the failure. The following categories apply across all error groups:
* `NON_RETRIABLE`: the request will fail again with the same input. Do not retry the same request. Correct the customer details or inform the customer, as indicated by the reason.
* `RETRIABLE`: the failure is temporary, usually a biller or network issue. Retry the request after a short delay.
* `CONDITIONAL`: the outcome depends on inner error codes returned by the biller or the switch. Inspect the accompanying reason before you decide whether to retry.
Some reasons include additional timing guidance, such as retrying later or on the next day. Always honour the timing hint in the reason before you retry.
## Bill fetch error codes
The [Bill Fetch Response API](/docs/api-reference/other-apis/bbps-cou/bill-fetch/response) returns these codes when a fetch request fails. Fetch codes use the `BFR` prefix.
| `compliance_resp_cd` | Reason | Category |
| - | - | - |
| `BFR001` | Incorrect or invalid customer account | `NON_RETRIABLE` |
| `BFR002` | Invalid combination of customer parameters | `NON_RETRIABLE` |
| `BFR003` | No bill data available | `NON_RETRIABLE` |
| `BFR004` | Payment received for the billing period, no bill due | `NON_RETRIABLE` |
| `BFR005` | Customer account is blocked or closed | `NON_RETRIABLE` |
| `BFR006` | Customer account is not activated | `NON_RETRIABLE` |
| `BFR007` | Bill due date has expired, bill details not available | `NON_RETRIABLE` |
| `BFR008` | Unable to get bill details from biller | `RETRIABLE` |
| `BFR009` | Scheduled downtime by biller, try again later | `RETRIABLE` |
| `BFR010` | Unscheduled downtime by biller, try again later | `RETRIABLE` |
| `BFR011` | Incomplete details in biller system, update customer profile | `NON_RETRIABLE` |
| `BFR012` | ePayment not enabled for the dealer | `NON_RETRIABLE` |
| `BFR013` | Maximum refill count reached | `NON_RETRIABLE` |
| `BFR014` | Consumer has reported loss of cylinder | `NON_RETRIABLE` |
| `BFR015` | Cannot take booking, consumer KYC not submitted | `NON_RETRIABLE` |
| `BFR016` | One prior booking is pending against this consumer | `NON_RETRIABLE` |
| `BFR017` | Price not yet set for nature or package code. Retry later. | `RETRIABLE` |
| `BFR018` | Day-end not done, try after some time | `RETRIABLE` |
| `BFR019` | Consumer number and distributor not matching | `NON_RETRIABLE` |
| `BFR020` | LPG ID not found | `NON_RETRIABLE` |
| `BFR021` | Vehicle registration number invalid or does not exist | `NON_RETRIABLE` |
| `BFR022` | FASTag inactive or blocked, recharge not allowed | `NON_RETRIABLE` |
| `BFR023` | FASTag exempted, recharge not allowed | `NON_RETRIABLE` |
## Bill validation error codes
The [Bill Fetch Response API](/docs/api-reference/other-apis/bbps-cou/bill-fetch/response) returns these codes when a bill validation request fails. Validation codes use the `BVR` prefix.
| `compliance_resp_cd` | Reason | Category |
| - | - | - |
| `BVR001` | Incorrect or invalid customer account | `NON_RETRIABLE` |
| `BVR002` | Invalid combination of customer parameters | `NON_RETRIABLE` |
| `BVR003` | Customer account is blocked or closed | `NON_RETRIABLE` |
| `BVR004` | Customer account is not activated | `NON_RETRIABLE` |
| `BVR005` | Invalid amount | `NON_RETRIABLE` |
| `BVR006` | Customer account deactivated, pay to activate | `NON_RETRIABLE` |
| `BVR007` | Incomplete details in biller system, update profile | `NON_RETRIABLE` |
| `BVR008` | Customer account valid but no bill due | `NON_RETRIABLE` |
| `BVR009` | Technical exception from biller | `RETRIABLE` |
## Payment posting error codes
The [Bill Payment Response API](/docs/api-reference/other-apis/bbps-cou/bill-payment/response) returns these codes when a payment fails at the biller. Payment codes use the `BPR` prefix.
| `compliance_resp_cd` | Reason | Category |
| - | - | - |
| `BPR001` | Incorrect or invalid customer account | `NON_RETRIABLE` |
| `BPR002` | Invalid combination of customer parameters | `NON_RETRIABLE` |
| `BPR003` | Customer account is blocked or closed | `NON_RETRIABLE` |
| `BPR004` | Customer account is not activated | `NON_RETRIABLE` |
| `BPR005` | Payment cannot be accepted at this time | `RETRIABLE` |
| `BPR006` | Payment request has been exceeded for the day. Retry the next day. | `NON_RETRIABLE` |
| `BPR007` | Repeat payment request | `NON_RETRIABLE` |
| `BPR008` | Due date expired, re-fetch to get current outstanding | `RETRIABLE` |
| `BPR009` | Scheduled downtime by biller, try again later | `RETRIABLE` |
| `BPR010` | Unscheduled downtime by biller, try again later | `RETRIABLE` |
| `BPR011` | Payment amount different from current outstanding | `RETRIABLE` |
| `BPR012` | FASTag top-up failed, try again later | `RETRIABLE` |
## Infrastructure error codes
These codes indicate a transport or switch-level failure between the operating units, rather than a biller decision. Codes with the `BOU` prefix relate to the Biller Operating Unit, and codes with the `COU` prefix relate to the Customer Operating Unit.
| `compliance_resp_cd` | Reason | Category |
| - | - | - |
| `BOU001` | Send failed to BOU | `RETRIABLE` |
| `BOU002` | Inner error codes from BOU negative acknowledgement | `CONDITIONAL` |
| `BOU003` | Timeout at BOU | `RETRIABLE` |
| `BOU004` | BOU reversal retry failure | `NON_RETRIABLE` |
| `BOU005` | BOU reversal response timeout | `NON_RETRIABLE` |
| `BOU006` | Connect timeout at BOU | `RETRIABLE` |
| `BOU007` | Read timeout at BOU | `RETRIABLE` |
| `BOU008` | Unable to connect to BOU | `RETRIABLE` |
| `BOU009` | Pending transaction timeout at BOU | `RETRIABLE` |
| `COU001` | Send failed to COU | `RETRIABLE` |
| `COU002` | Inner error codes from COU negative acknowledgement | `CONDITIONAL` |
| `COU003` | COU reversal retry failure | `NON_RETRIABLE` |
| `COU006` | Connect timeout at COU | `RETRIABLE` |
| `COU007` | Read timeout at COU | `RETRIABLE` |
| `COU008` | Unable to connect to COU | `RETRIABLE` |
# BBPS for Customers
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/overview
Cashfree BBPS for Customers APIs cover authentication, biller discovery, bill fetch, bill payment, ticket handling, and wallet operations for Agent Institutions.
The BBPS for Customers (Customer Operating Unit, or COU) APIs enable Agent Institutions, entities that onboard customers and offer BBPS services, to integrate with the Bharat Bill Payment System (BBPS) network operated by NPCI. Using these APIs, Agent Institutions can build complete bill payment experiences for their customers across all registered BBPS billers.
## Key features
Cashfree BBPS for Customers supports the following capabilities:
* **Biller discovery**: Retrieve all active biller categories and MDM details, including customer input parameters, supported payment modes, and fee structures, to present accurate biller information before initiating a payment.
* **Async bill fetch and payment**: Bill fetch and payment requests return a reference ID immediately. Poll the corresponding response endpoint at regular intervals until the operation returns a terminal status.
* **Flexible payment flows**: Supports `FETCH_AND_PAY`, `VALIDATE_AND_PAY`, and direct bill payment flows, determined automatically by biller configuration, across all BBPS categories. Direct bill payment is used for billers that do not require a prior fetch or validation step, such as donation billers.
* **Ticket management**: Raise a support ticket for any processed transaction and poll its status using the Ticket APIs.
* **Wallet management**: Check the agent institution wallet balance and retrieve paginated ledger history for reconciliation.
## Authentication
All APIs use header authentication. Pass both headers in every request:
```http theme={"dark"}
x-client-id:
x-client-secret:
```
Credentials are issued per Agent Institution. Your `x-client-id` and `x-client-secret` are available in your [Merchant Dashboard](https://merchant.cashfree.com/verificationsuite/developers/api-keys) for both sandbox and production environments.
## Versioning
All BBPS COU APIs require an `x-api-version` header in every request. The current supported version is `2025-01-01`.
```http theme={"dark"}
x-api-version: 2025-01-01
```
This value is pre-filled in the **Try It** playground on each API page.
## Rate limits
All APIs are rate limited to 100 requests per 60 seconds. Exceeding the limit returns HTTP 429.
## API flow
A complete bill payment journey involves the following steps:
Get the list of active biller categories, for example, ELECTRICITY, DTH, and GAS.
Get MDM details for billers in a category, including customer input parameters, supported payment modes, fetch requirements, and fee structures.
Initiate an async bill fetch, validation, or direct payment for the customer. Returns a `ref_id` immediately. The system determines the flow automatically based on biller configuration:
* `FETCH_AND_PAY` returns bill details from the biller
* `VALIDATE_AND_PAY` validates customer identity without fetching bill details
* Direct bill payment skips the fetch step entirely and is used for billers such as donation billers
Poll using the `ref_id` at regular intervals until the response returns a terminal status. Refer to the polling strategy in the Bill fetch response API for recommended intervals and retry limits.
Submit the payment using data from the fetch response. Returns `transaction_ref_id` immediately.
Poll using `bill_fetch_ref_id` and `transaction_ref_id` at regular intervals until the response returns a terminal status. Refer to the polling strategy in the Bill payment response API for recommended intervals and retry limits.
To raise a support ticket for a processed payment, use the Raise Ticket Request API after a payment is complete. Poll the Ticket Status API using the returned `ref_id` to track progress.
Initiate an async bill fetch or validation for the customer. Returns a ref\_id immediately. The system determines the flow based on biller configuration. It uses FETCH\_AND\_PAY or VALIDATE\_AND\_PAY.
Retrieve paginated wallet transaction history for reconciliation.
# Raise a Ticket Request
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/ticket/request
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/request/ticket
Use this API to raise a support ticket for a previously processed bill payment.
This is an **async** API. It returns an acknowledgement with a `ref_id`.
Poll the Ticket Status API using `ref_id` to get the current status of your ticket.
Pass one of the following codes in the `disposition` field:
| Disposition code | Description | Type |
|---|---|---|
| `D11` | Transaction Successful, Amount Debited but services not received | Dispute |
| `D12` | Transaction Successful, Amount Debited but Service Disconnected or Service Stopped | Dispute |
| `D13` | Transaction Successful, Amount Debited but LPSC Late Payment Surcharge Charges added in next bill | Dispute |
| `D21` | Erroneously paid in wrong account | Dispute |
| `D22` | Duplicate Payment | Dispute |
| `D23` | Erroneously paid the wrong amount | Dispute |
| `D31` | Payment information not received from Biller or delay in receiving payment information from the Biller | Complaint |
| `D32` | Bill paid but amount not adjusted or still showing due amount | Complaint |
# Poll Ticket Status Response
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/ticket/response
openapi/bbps/bbps-cou.yaml post /bbps/cou/v1/billers/response/ticket-status
Use this API to poll the status of a previously raised ticket.
Call this using the `ref_id` returned from the Raise Ticket Request API.
Poll at increasing intervals until `message` is no longer `"Ticket request is still being processed"`:
| Attempt | Wait before this poll |
|---|---|
| 1 | 5 seconds |
| 2 | 15 seconds |
| 3 | 30 seconds |
| 4 | 1 minute |
| 5+ | 3 minutes |
Stop polling when `message` is `"Ticket details fetched successfully"` or `"Ticket request failed"`. If the ticket remains in a processing state beyond your retry limit, contact Cashfree support with the `ref_id`.
| `message` | Meaning |
|---|---|
| `"Ticket details fetched successfully"` | Completed. Check `data` for ticket details. |
| `"Ticket request failed"` | Terminal failure. Stop polling. |
| `"Ticket request is still being processed"` | Still processing. Continue polling. |
# Fetch Agent Institution Wallet Balance
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/wallet/balance
openapi/bbps/bbps-cou.yaml get /bbps/cou/agent/{agentId}/wallet/balance
Use this API to fetch the current available wallet balance for a given Agent Institution.
This balance reflects funds available for BBPS bill payment transactions.
The balance can be positive or negative, depending on the Agent Institution's funding model:
- Prefunding model: the Agent Institution funds the wallet in advance, and bill payments are debited from it. The balance is the remaining prefunded amount and does not go below zero.
- Shortfall (postfunding) model: bill payments are drawn against a Cashfree-funded credit line, so the balance can be negative. A negative balance represents the current shortfall, that is, the amount the Agent Institution has drawn and must repay.
# Fetch Agent Institution Wallet Ledger
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps-cou/wallet/ledger
openapi/bbps/bbps-cou.yaml post /bbps/cou/agent/{agentId}/wallet/ledger
Use this API to fetch a paginated list of wallet ledger entries for a given Agent Institution.
Includes credits (recharges) and debits (bill payments).
Results can be filtered by date range, transaction type, or UTR.
All request body fields are optional. An empty body returns all entries.
The ledger lists wallet credits (recharges) and debits (bill payments). On the prefunding model, each bill payment also produces freeze and unfreeze hold entries against the prefunded balance. On the shortfall (postfunding) model, debits can take the running balance negative, reflecting the amount drawn against the credit line.
# APIs to Implement
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps/apis-to-implement
Reference for the APIs billers must expose to join the BBPS network, covering bill fetch, payment posting, and authentication requirements.
To join the BBPS network, billers must implement two APIs that Cashfree calls on behalf of the network during customer bill interactions. Both APIs must be built to the structure defined below and shared with Cashfree along with the authentication details and environment URLs.
Once you provide the API contracts and URLs for both test and production environments, Cashfree integrates your APIs within two working days, provided they meet the recommended standards.
## APIs to implement
The following two APIs are required for BBPS network participation:
### Bill fetch
The bill fetch API is called when a customer initiates a bill lookup on a BBPS-enabled app such as PhonePe, Google Pay, or Paytm. It must return the outstanding bill details for the customer based on the input parameters passed by the network.
* **Method**: GET
* **Trigger**: Customer initiates a bill lookup on a BBPS-enabled app
* **Response**: Outstanding bill details for the customer
### Payment posting
The payment posting API is called after a customer completes a bill payment on a BBPS-enabled app. Your system must respond with an acceptance or rejection of the payment.
* **Method**: POST
* **Trigger**: Customer completes a payment on a BBPS-enabled app
* **Response**: Acceptance or rejection of the payment
## Authentication
Along with your API contracts and environment URLs, inform Cashfree of the authentication protocol your APIs use and provide credentials for both test and production environments.
# Check Transaction Status
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps/check-transaction-status
get /bbps/biller/bill/status/{bbps_transaction_id}
The check transaction status API allows billers to retrieve the current status of a transaction using the unique BBPS transaction ID associated with the bill. This endpoint serves as a reliable method for querying transaction details, providing merchants with real-time updates on payment status.
# Next Steps for Biller
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps/next-steps-for-biller
Follow these next steps after implementing the BBPS biller APIs, including sharing endpoints and credentials with Cashfree to complete onboarding and go live.
1. Once you are done implementing this APIs at your end, please create a document with the following details and send it over to [bbpsproduct@cashfree.com](mailto:bbpsproduct@cashfree.com):
* The API contracts that are finally implemented for both the APIs. Include the following:
* Expected Sample Request
* Sample Success Response
* Sample Failure Response
* Sample Error Response
* Describe the authentication mechanism you have implemented along with credentials for the same in
* Test Environment
* Production Environment
* Provide the base URL & the path to access both the APIs in
* Test Environment
* Production Environment
* Provide 7-8 data points in test environment through which bill fetch can be triggered.
* Confirm the Onboarding Configurations as defined in Section F and mention the same in the document.
2. Cashfree team will test the API functionality in test environment and then integrate with BBPS system if its working as expected.
3. The same would be sent for approval to NPCI along with the legal documentation. NPCI would take 1-2 weeks to approve the request if everything is correct.
4. NPCI would give a go-ahead and configure the production routing so transactions can be initiated. Biller would be live on BHIM initially and within 1 week would appear on GPay. Post that it would appear on PhonePe and other apps in 2 weeks.
5. Biller can use Cashfree Dashboard to see realtime reporting of transactions coming through BBPS.
# NPCI Onboarding Configurations
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps/npci-onboarding-configurations
Configure BBPS biller onboarding fields including customer input parameters, payment amount exactness, extra bill fetch response data, and acceptance rules.
In addition to legal and branding details, billers must submit the following technical configurations to NPCI as part of the onboarding process. Review each configuration and provide your decisions along with your API contracts.
## Customer input parameters
**Required**
Define the input parameters that customers must enter in the payment app to identify their account or bill. For each parameter, provide the following details:
| Field | Description |
| - | - |
| Name | Parameter identifier, for example, `phone_number`, `loan_number`, `policy_no` |
| Data type | `Alphanumeric`, `Numeric`, or `Date` |
| Special characters | Whether special characters are allowed in the value, and if so, which ones |
| Length | Minimum and maximum character length of the value, for example, 3 to 10 characters |
## Payment amount exactness
**Required**
Select the amount behaviour you want to apply to payments received through BBPS.
| Option | Description |
| - | - |
| `ADHOC` | Customer can enter any amount |
| `EXACT` | Amount is non-editable |
| `EXACT DOWN` | Customer can enter an amount equal to or less than the bill fetch amount |
| `EXACT UP` | Customer can enter an amount equal to or greater than the bill fetch amount |
## Additional bill fetch response fields
**Optional**
If your bill fetch response needs to return fields beyond the standard response, specify the additional parameters here. These become part of the `additional_info` object in the bill fetch response.
## Payment acceptance behaviour
**Optional**
Select whether your system should always accept payments, or accept and reject based on business logic.
* **Always accept**: Cashfree accepts all payments on your behalf, even if your systems are unavailable, and retries posting to your system later. Recommended if your system has no business logic for declining payments.
* **Accept or reject per transaction**: Your system evaluates and responds to each payment individually. Recommended if you have business logic that requires declining specific payments.
# BBPS for Business
Source: https://www.cashfree.com/docs/api-reference/other-apis/bbps/overview
API reference for Cashfree BBPS for Business covering NPCI-compliant biller API design, transaction status, complaint handling, and onboarding configuration.
The BBPS for Business (Biller Operating Unit, or BOU) APIs provide billers with a structured blueprint to build APIs that meet NPCI standards, enabling seamless onboarding onto the Bharat Bill Payment System (BBPS) network. By following this approach, billers can ensure their APIs align with Cashfree and NPCI requirements, improving workflow success rates and accelerating the onboarding process.
## Key features
Cashfree BBPS for Business supports the following capabilities:
* **NPCI-compliant API design**: Build bill fetch, validation, and payment APIs that meet NPCI standards, ensuring compatibility with the BBPS network.
* **Flexible bill flows**: Supports `FETCH_AND_PAY` and `VALIDATE_AND_PAY` flows based on your biller system's capability.
* **Transaction status checks**: Respond to status queries from the BBPS network to support reconciliation and dispute resolution.
* **Complaint handling**: Handle inbound complaint requests from the network for disputed or failed transactions.
* **Onboarding configuration guidance**: Access NPCI onboarding configurations to correctly set up your biller profile on the BBPS network.
Check the status of a transaction on the BBPS network for reconciliation and dispute resolution.
## Getting started
Use the following resources to begin your BBPS for Business integration:
Learn about the BBPS for Business integration model, onboarding requirements, and API design guidelines.
Review the bill fetch and payment posting APIs your biller system must implement for BBPS integration.
# Allocate Funds to Virtual Account
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/allocate-funds-to-virtual-account
post /v1/connected-wallet/recharge
Use this API to recharge the OneEscrow account (notional credit) using a payment instrument.
# Create Virtual Account
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/create-virtual-account
post /fundsources/connected/virtual-account
Use this API to create a virtual account that helps streamline the management of funds, enhance tracking capabilities, and simplify the financial process.
# Get Fund Source Details
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/fund-source/get-fund-source-details
get /v1/fundsources/{paymentInstrumentId}
Use this API to get the details of the fund source.
# Get Account Statement
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/get-account-statement
get /v1/accountStatement
Use this API to fetch the account statement of the virtual account in a paginated format using cursor-based pagination.
# Overview
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/payouts-v2-apis
Cashfree OneEscrow Payouts V2 APIs simplify endpoint selection, streamline transfers, and reduce integration effort across beneficiary, transfer, and reports.
The version 2 APIs simplifies the process of selecting the correct API for merchants, streamlines transfer APIs, and reduces integration issues:
| API | Description |
| :- | :- |
| [Standard Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2) | Use this API to initiate an amount transfer at Cashfree. It is an async request by default. |
| [Get Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2) | Use this API to get the status of the initiated transfer. You can use either the transfer\_id or cf\_transfer\_id to fetch the details. |
| [Batch Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/batch-transfer-v2) | Use this API to initiate a batch transfer request at Cashfree. You can transfer money to multiple beneficiaries. |
| [Get Batch Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2) | Use this API to get the status of the initiated batch transfer. You can use either the batch\_transfer\_id or cf\_batch\_transfer\_id to fetch the details. |
# Transfer Funds Between VAs
Source: https://www.cashfree.com/docs/api-reference/other-apis/oneescrow/transfer-funds-between-vas
post /v1.2/internalTransfer
Use this API to transfer funds between virtual accounts (VAs).
# Overview
Source: https://www.cashfree.com/docs/api-reference/overview
Browse the Cashfree API reference, covering payments, payouts, identity verification, and platform APIs with sandbox testing and language-specific examples.
Cashfree provides RESTful APIs for payments, transfers, identity verification, and financial solutions. APIs support sandbox testing and production environments determined by your credentials, with consistent authentication, error handling, and multi-language documentation examples.
Accept payments from customers through digital and in-person channels.
Manage company finances through a unified dashboard.
Verify customer identities using Cashfree's identity verification solutions (PAN, Aadhaar, and more).
Manage digital wallets, sub-wallets, gift cards, and prepaid cards with Cashfree’s PPI APIs.
Embed payments in SaaS applications with Cashfree's embedded payment solutions.
Access specialised solutions for specific business needs, including BBPS bill payments.
# Data to Test Integration
Source: https://www.cashfree.com/docs/api-reference/payments/data-to-test-integration
Use the test card numbers, UPI IDs, netbanking credentials, and OTPs supplied here to validate your Cashfree integration in the sandbox environment.
Use the test data on this page to validate your Cashfree integration before going live. Check [Supported sandbox features](#supported-sandbox-features) to confirm availability before testing.
Test card numbers, netbanking credentials, and UPI VPAs for standard checkout flows.
Netbanking and UPI parameter configurations for TPV account validation testing.
Token Vault BINs and credit and debit card EMI test credentials.
Mobile numbers and PAN or OTP inputs for Paylater and Cardless EMI testing.
## Supported sandbox features
The following table lists the payment modes and functionality available for testing in the sandbox environment.
| Payment mode or feature | Sandbox support status |
| :- | :- |
| Card | Supported. Use the test card details provided below. |
| Netbanking | Supported. Use the test netbanking account provided below. |
| UPI | Supported. Use the test UPI Virtual Payment Addresses (VPAs). |
| Wallet | Supported through a single generic test wallet. Individual wallet providers, such as Paytm or AmazonPay, are not available for testing. |
| Credit and debit card EMI | Supported. Use the test EMI card details. |
| Paylater | Supported. Use the test details provided below. |
| Cardless EMI | Supported for transactions with a minimum amount of `1,000` (INR). |
| Pre-authorisation (API) | Supported for card and UPI modes via the Order Pay `link` channel. |
The sandbox environment does not support PayPal or bank transfer payment modes at this time.
### Test a pre-authorisation transaction
To test a pre-authorisation transaction, complete the following steps.
1. Create an order with the `order_note` parameter set to `preauth_transaction`.
2. Capture or void the authorised funds using the [Pre-authorisation API](/docs/api-reference/payments/latest/payments/preauthorisation).
## Core payment modes
Use the test card credentials, netbanking simulation account, or UPI addresses below to validate standard checkout flows.
### Test card details
To test card transactions in the sandbox environment, select a card number from the tables below based on the transaction state you want to simulate.
#### Standard successful checkout testing
Use these configurations to simulate successful domestic card payments. For all cards in this table, use `111000` as the OTP, `03/2028` as the fixed expiry, `123` for CVV, and `Test` as the cardholder name.
| Scheme | Card type | Card sub-type | Card number 1 | Card number 2 |
| :- | :- | :- | :- | :- |
| Visa | Debit | Retail | `4706131211212123` | `4062288312345026` |
| Visa | Credit | Retail | `4576238912771450` | `4444333322221111` |
| Visa | Credit | Premium | `4466050254381183` | `4136880012657791` |
| Visa | Credit | Corporate | `4074970084343075` | `4770355457382883` |
| Mastercard | Debit | Retail | `5409162669381034` | `5445856839524391` |
| Mastercard | Credit | Retail | `5105105105105100` | `5176539438527826` |
| Mastercard | Credit | Premium | `5242535837492075` | `5203860658394375` |
| Mastercard | Credit | Corporate | `5552190758372734` | `5506908329471983` |
| Rupay | Debit | Retail | `6074825972083818` | `6074828163369590` |
| Rupay | Credit | Retail | `6528591234543575` | `65292523412356` |
#### International and USD scenario testing
Use these configurations to validate cross-border payment routing, currency conversion, subscription flows, and multi-factor bank authentication loops.
| Testing scenario | Card number | Expiry | CVV | Cardholder name |
| :- | :- | :- | :- | :- |
| Standard USD flow | `7000 0083 1380 6604` | `09/2027` | `581` | `Test` |
| Standard USD flow | `7000 0091 5369 7715` | `12/2021` | `591` | `Test` |
| Standard USD flow | `7000 0094 7240 2110` | `05/2024` | `204` | `Test` |
| Standard USD flow | `7000 0055 0418 0328` | `08/2026` | `324` | `Test` |
| Standard USD flow | `7000 0014 6659 2972` | `02/2026` | `153` | `Test` |
| Native bank OTP loop | `4266 9020 7958 3702` | `09/2028` | `681` | `Test` |
| Recurring subscriptions | `4138 6748 6000 0008` | `01/2027` | `123` | `Test` |
### Test netbanking
To test netbanking integrations, use the default test bank identifier below.
| Bank name | Payment code | Bank API code |
| :- | :- | :- |
| TEST Bank | `3333` | `TESTR` |
### Test UPI Virtual Payment Addresses (VPAs)
Pass the following test VPAs in your payment request payload to simulate specific transaction outcomes and error states.
| Virtual Payment Address (VPA) | Simulated transaction response |
| :- | :- |
| `testsuccess@gocash` | Simulates a successful transaction. |
| `testfailure@gocash` | Simulates a failed transaction. |
| `testinvalid@gocash` | Simulates an invalid VPA error. |
| `testdeclineuser@gocash` | Simulates a cancellation by the user. The application prompts the user to retry. |
| `testexpired@gocash` | Simulates a session timeout where the user does not complete the transaction in time. |
| `testtimeoutbank@gocash` | Simulates an issuing bank timeout. |
| `testremitterunavailable@gocash` | Simulates an unavailable remitter bank instance. |
| `testinsufficientfunds@gocash` | Simulates insufficient account funds. |
| `testbankdeclined@gocash` | Simulates a generic reject response from the user's bank. |
| `testriskflagged@gocash` | Simulates a transaction rejected due to bank security and risk assessments. |
| `testnetworkerror@gocash` | Simulates a core network infrastructure failure. |
| `testinvalidpin@gocash` | Simulates an incorrect PIN entry error. |
| `testremitterdispatchfailed@gocash` | Simulates a delivery dispatch failure from the remitter bank. |
| `testbeneficiarytimeout@gocash` | Simulates a timeout failure at the destination beneficiary bank. |
| `testuserdropped@gocash` | Simulates an unattempted transaction abandonment by the customer. |
| `testtransactionrisk@gocash` | Simulates a customer risk rejection profile check. |
| `testfingerprintmismatch@gocash` | Simulates a hardware device biometric or fingerprint mismatch. |
| `testinvalidvpa@gocash` | Simulates an improperly configured payment instrument. |
| `testbankriskrejected@gocash` | Simulates an internal banking security policy rejection. |
| `testremittertimeout@gocash` | Simulates a delayed response from the remitter bank. |
| `testfraud@gocash` | Simulates an automated anti-fraud block by the payment service provider. |
| `testvalidationerror@gocash` | Simulates a Third-Party Verification (TPV) account mapping failure. |
| `testdebitfailed@gocash` | Simulates a failure during the account debit process. |
| `testpspunregistered@gocash` | Simulates a blocked network state on the client application. |
Use the VPA that matches the error state you want to handle in your integration. This helps you verify that your error handling covers each failure mode before going live.
## Third-Party Verification (TPV)
### Test TPV netbanking
Third-Party Verification (TPV) ensures that the funding bank account matches your database records. Use these parameters to simulate a validated netbanking setup.
| Bank parameter | Static testing value |
| :- | :- |
| `accountNumber` | `1111222233` |
| `ifsc` | `TEST0001234` |
### Test TPV UPI
Use these parameters to test account authorisation over the UPI rails.
| Parameter | Testing value |
| :- | :- |
| `userVPA` (success) | `testtpvsuccess@gocash` |
| `userVPA` (fail) | `testtpvfail@gocash` |
| `accountNumber` | `1111222233` |
| `ifsc` | `TEST0001234` |
## Tokenisation and instalment programs
### Token Vault test cards
To build a test card number for Token Vault API configurations, append any random 10-digit sequence to the card BINs below. Expiry can be any future date and CVV any 3-digit number.
| Scheme | Supported card BIN |
| :- | :- |
| Visa | `470613, 457623, 436534, 415527, 466535` |
| Mastercard | `559423, 544405, 533983, 555219, 524877` |
### Credit card EMI test cards
Use the following credit cards to validate EMI calculations and processing endpoints. Expiry can be any future date and CVV any 3-digit number.
| Issuing bank | Bank card parameter name (`card_bank_name`) | Card number |
| :- | :- | :- |
| Axis Bank | Axis | `4111 4647 7655 4152` |
| Standard Chartered Bank | Standard Chartered | `4622 7185 3202 3725` |
| ICICI Bank | ICICI | `4748 4661 2346 7526` |
| Kotak Bank | Kotak | `4363 9070 5531 5237` |
| HDFC Bank | HDFC | `5241 8100 0000 0000` |
| RBL Bank | RBL | `4112 5597 3537 3674` |
| Bank of Baroda | BOB | `4111 5638 8133 3699` |
| AU Bank | AU | `4111 5849 6705 0056` |
| Citi Bank | CITI | `4112 5229 6265 9579` |
| Yes Bank | YES | `4111 6514 1790 3257` |
| IndusInd Bank | INDUS | `4111 5351 6094 6904` |
| HSBC Bank | HSBC | `4111 6668 0832 0291` |
| Federal Bank | FED | `4111 5924 7037 2263` |
### Debit card EMI test cards
Use this configuration to test debit card EMI processing.
| Issuing bank | Bank card parameter name (`card_bank_name`) | Card number |
| :- | :- | :- |
| HDFC Bank | HDFC | `4386 2412 2321 5159` |
## Alternative financing options
### Paylater integration details
To test standard Paylater partner platforms, use the registered mobile number below.
| Provider instance | Registered mobile number |
| :- | :- |
| Any | `8714268343` |
### Cardless EMI integration details
Use the following mobile number to simulate user registration states for Cardless EMI options.
| Provider instance | Registered mobile number | Required input parameters |
| :- | :- | :- |
| Any | `8714268343` | If prompted for **PAN**, use `1234`. If prompted for **OTP**, use `777777`. |
Complete all integration testing in the sandbox environment before deploying to production. For broader recommendations on building reliable integrations, see [API best practices](/docs/api-reference/api-best-practices).
# Enums Reference
Source: https://www.cashfree.com/docs/api-reference/payments/enums
Look up enum values in the Cashfree API, covering order states, payment states, net banking codes, wallet codes, and EMI codes.
An enum (enumeration) is a data type that restricts a field to a specific set of
predefined string values. The Cashfree API uses enums across requests and
responses to ensure that only valid, expected values are accepted or returned for a
given field.
The following are some examples of enum fields in the Cashfree API:
* The `order_status` field returns one of `ACTIVE`, `PAID`, `EXPIRED`, or
`TERMINATED`, never a free-form string.
* The `payment_status` field returns one of `SUCCESS`, `FAILED`, `PENDING`,
`CANCELLED`, and others.
* Net banking and wallet codes are fixed numeric identifiers mapped to specific
providers.
Because enum values are fixed and predictable, you can use them directly in
conditional logic, error handling, and status checks without accounting for
unexpected values.
## Order states
Order states represent the current status of an order throughout its lifecycle,
from creation to a terminal state such as paid or expired. Use these values to
determine whether an order is still open for payment or has reached a final state.
An order moves through the following states based on payment outcomes and
merchant actions.
| Order State | Description |
| :- | :- |
| ACTIVE | Orders are marked as **ACTIVE**, when an order is created by the merchant through an API request to Cashfree. |
| PAID | Orders are marked **PAID** when the payment is verified by Cashfree and the payment is successful. |
| EXPIRED | Orders are marked as **EXPIRED** when the order has exceeded `order_expiry_time` specified by merchant to complete the order. |
| TERMINATED | This status is returned when you request order termination through the [Order Termination API](/docs/api-reference/payments/latest/orders/terminate-order). Once terminated, customers can no longer pay for this order. |
| TERMINATION\_REQUESTED | This status is returned after you call the [Order Termination API](/docs/api-reference/payments/latest/orders/terminate-order) to end an order. The termination request is acknowledged but still processing. Orders can only be terminated when all transactions have reached terminal states. If a pending transaction completes successfully while termination is processing, the status will change from **TERMINATION\_REQUESTED** to **SUCCESS**. |
## Payment states
Payment states indicate the status of an individual payment attempt within an
order. An order can have multiple payment attempts, and each attempt progresses
through its own states before reaching a terminal outcome such as `SUCCESS`
or `FAILED`.
Each payment attempt within an order has its own lifecycle. Use these states
to handle granular payment scenarios.
| Payment State | Description | Remarks |
| :- | :- | :- |
| SUCCESS | Transaction is successful and the amount is captured. | Terminal state. Once successful, the order moves to **PAID**. |
| FAILED | Transaction failed due to bank, customer, or system issues. | Terminal state. Customers can initiate a new attempt. |
| NOT\_ATTEMPTED | Transaction is created but acknowledgement from the bank is awaited. | Initial state for a payment attempt. |
| PENDING | Request is sent to the bank and a response is awaited. | Non-terminal state. Do not fulfil orders in this state. |
| FLAGGED | Transaction is identified as high-risk and requires review. | Merchant must manually approve or reject the payment. |
| CANCELLED | Amount is reversed because a success response arrived after the time to live (TTL). | Automatic system reversal for late confirmations. |
| VOID | Transaction amount is not captured by explicit request. | Typically used for pre-authorised card payments or UPI mandates. |
| USER\_DROPPED | Customer abandoned the payment flow before completion. | Includes closing the app or OTP page without attempting payment. |
## Net banking codes
Net banking codes identify the supported net banking providers. Pass the
**Bank Code** value in the `payment_method` parameter of your API request to
initiate a net banking transaction.
The **TPV Supported** column indicates whether the bank supports Third Party
Validation (TPV). When TPV is enabled, Cashfree verifies that the
customer completes the payment from the specific bank account provided during
order creation.
The following table lists the supported banks and their corresponding codes
for net banking integrations.
| Bank name | Bank code | TPV supported |
| - | - | - |
| Airtel Payments Bank | 3123 | N |
| Andhra Pragathi Grameena Bank | 3094 | N |
| AU Small Finance Bank | 3087 | Y |
| Axis Bank | 3003 | Y |
| Axis Bank - Corporate | 3071 | N |
| Bandhan Bank - Retail Banking | 3088 | Y |
| Bank of Bahrain and Kuwait | 3095 | N |
| Bank of Baroda - Corporate | 3060 | Y |
| Bank of Baroda - Retail Banking | 3005 | Y |
| Bank of India | 3006 | Y |
| Bank of India - Corporate | 3061 | Y |
| Bank of Maharashtra | 3007 | N |
| Barclays - Corporate | 3080 | N |
| Canara Bank | 3009 | Y |
| Capital Small Finance Bank | 3098 | Y |
| Central Bank of India | 3011 | N |
| City Union Bank | 3012 | Y |
| City Union Bank - Corporate | 3083 | Y |
| Cosmos Bank | 3097 | Y |
| CSB Bank Limited | 3010 | Y |
| DBS Bank Ltd | 3017 | N |
| DCB Bank - Retail | 3018 | Y |
| Deutsche Bank | 3016 | Y |
| Dhanlakshmi Bank | 3019 | Y |
| Dhanlaxmi Bank - Corporate | 3072 | N |
| Equitas Small Finance Bank | 3076 | N |
| ESAF Small Finance Bank | 3100 | N |
| Federal Bank | 3020 | Y |
| Fincare Bank | 3101 | N |
| Gujarat State Co-operative Bank Limited | 3091 | N |
| HDFC Bank | 3021 | Y |
| HDFC Corporate | 3084 | N |
| HSBC Retail NetBanking | 3092 | Y |
| ICICI Bank | 3022 | Y |
| ICICI Bank - Corporate | 3073 | N |
| IDBI Bank | 3023 | Y |
| IDBI Bank - Corporate | 3124 | Y |
| IDFC FIRST Bank | 3024 | Y |
| Indian Bank | 3026 | Y |
| Indian Overseas Bank | 3027 | Y |
| Indian Overseas Bank - Corporate | 3081 | Y |
| IndusInd Bank | 3028 | Y |
| Jammu and Kashmir Bank | 3029 | Y |
| Jana Small Finance Bank | 3102 | Y |
| Janata Sahakari Bank Ltd Pune | 3104 | N |
| Kalyan Janata Sahakari Bank | 3105 | N |
| Karnataka Bank Ltd | 3030 | Y |
| Karnataka Gramin Bank | 3113 | N |
| Karnataka Vikas Grameena Bank | 3107 | N |
| Karur Vysya Bank | 3031 | Y |
| Kotak Mahindra Bank | 3032 | Y |
| Kotak Mahindra Bank - Corporate | 3134 | Y |
| Maharashtra Gramin Bank | 3108 | N |
| Mehsana urban Co-op Bank | 3109 | N |
| NKGSB Co-op Bank | 3111 | N |
| Nutan Nagarik Sahakari Bank Limited | 3112 | N |
| Punjab & Sind Bank | 3037 | Y |
| Punjab National Bank - Corporate | 3065 | N |
| Punjab National Bank - Retail Banking | 3038 | Y |
| RBL Bank | 3039 | Y |
| RBL Bank Limited - Corporate | 3114 | N |
| Saraswat Bank | 3040 | Y |
| SBM Bank India | 3115 | Y |
| Shamrao Vithal Bank - Corporate | 3075 | N |
| Shamrao Vitthal Co-operative Bank | 3041 | N |
| Shivalik Small Finance Bank | 3086 | Y |
| South Indian Bank | 3042 | Y |
| Standard Chartered Bank | 3043 | Y |
| State Bank Of India | 3044 | Y |
| State Bank of India - Corporate | 3066 | Y |
| Suryoday Small Finance Bank | 3116 | N |
| Tamil Nadu State Co-operative Bank | 3051 | N |
| Tamilnad Mercantile Bank Ltd | 3052 | Y |
| Thane Bharat Sahakari Bank Ltd | 3118 | N |
| The Kalupur Commercial Co-Operative Bank | 3106 | N |
| The Surat Peoples Co-operative Bank Limited | 3090 | Y |
| The Sutex Co-op Bank Ltd | 3117 | Y |
| TJSB Bank | 3119 | N |
| UCO Bank | 3054 | Y |
| UCO Bank Corporate | 3122 | N |
| Ujjivan Small Finance Bank | 3126 | Y |
| Union Bank of India | 3055 | Y |
| Union Bank of India - Corporate | 3067 | Y |
| Utkarsh Small Finance Bank | 3089 | Y |
| Varachha Co-operative Bank Limited | 3120 | N |
| Yes Bank - Corporate | 3077 | N |
| Yes Bank Ltd | 3058 | Y |
| Zoroastrian Co-Operative Bank Ltd | 3121 | N |
## Wallet codes
Wallet codes identify the supported digital wallet providers. Pass the
**Payment Code** value in your API request to collect payments via a
specific wallet.
The following table lists the available wallet providers and their
corresponding payment codes.
| S. No | Wallet name | Payment code |
| :- | :- | :- |
| 1 | FreeCharge | 4001 |
| 2 | MobiKwik | 4002 |
| 3 | Ola Money | 4003 |
| 4 | Airtel Money | 4006 |
| 5 | Amazon Pay | 4008 |
| 6 | PayTM | 4007 |
| 7 | PhonePe | 4009 |
| 8 | Test Wallet (Sandbox) | 4010 |
## EMI codes
Equated Monthly Instalment (EMI) codes specify the available instalment plans
for supported banks and card types. Use these values to present EMI options to
customers during checkout.
The following attributes apply across all EMI plan tables:
* **card\_bank\_name**: The bank identifier to pass in the API request parameter.
* **Tenure**: The duration of the instalment plan, expressed in months.
* **Annual interest rate**: The yearly interest rate applied to the
transaction amount, expressed as a percentage.
Verify that the transaction amount falls within the **Minimum amount** and
**Maximum amount** range specified for the selected plan and tenure before
making the API request.
Credit card EMI lets customers split a large payment into fixed monthly
instalments charged to their credit card. This is the most widely supported
EMI type and is available across major Indian banks.
The following table lists the supported banks, interest rates, and tenures
available for credit card EMI.
| Card type | Type of EMI | Bank | card\_bank\_name | Minimum amount | Maximum amount | Annual interest rate | Tenure |
| - | - | - | - | - | - | - | - |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 3 |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 6 |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 9 |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 12 |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 18 |
| Credit | Standard | ICICI Bank | icici | 1500 | 9999999 | 15.99 | 24 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 3 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 6 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 9 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 12 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 18 |
| Credit | Standard | AU Small Finance Bank | au | 2000 | - | 14 | 24 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 3 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 6 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 9 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 12 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 18 |
| Credit | Standard | Axis Bank | axis | 2500 | 1000000 | 17 | 24 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 3 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 6 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 9 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 12 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 18 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 24 |
| Credit | Standard | Bank of Baroda | bob | 2500 | - | 16 | 36 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 14 | 3 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 14 | 6 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 15 | 9 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 15 | 12 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 15 | 18 |
| Credit | Standard | RBL Bank | rbl | 2500 | - | 15 | 24 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 11.88 | 3 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 14 | 6 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 15 | 9 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 15 | 12 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 15 | 18 |
| Credit | Standard | Standard Chartered | standard chartered | 2000 | - | 15 | 24 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 3 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 6 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 9 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 12 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 18 |
| Credit | Standard | Yes Bank | yes | 1500 | 999999999 | 16 | 24 |
| Credit | Standard | American Express | amex | 5000 | - | 14 | 3 |
| Credit | Standard | American Express | amex | 5000 | - | 14 | 6 |
| Credit | Standard | American Express | amex | 5000 | - | 14 | 9 |
| Credit | Standard | American Express | amex | 5000 | - | 14 | 12 |
| Credit | Standard | American Express | amex | 5000 | - | 15 | 18 |
| Credit | Standard | American Express | amex | 5000 | - | 15 | 24 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 18 | 3 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 6 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 9 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 12 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 18 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 24 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 36 |
| Credit | Standard | HDFC Bank | hdfc | 1000 | 999000 | 17 | 48 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 1000 | - | 16 | 3 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 6 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 9 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 12 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 18 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 20 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 24 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 30 |
| Credit | Standard | Kotak Mahindra Bank | kotak | 2500 | - | 16 | 36 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.25 | 3 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.00 | 6 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.00 | 9 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.00 | 12 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.00 | 18 |
| Credit | Standard | SBI | sbi | 2500 | - | 17.00 | 24 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 3 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 6 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 9 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 12 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 18 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 24 |
| Credit | Standard | IDFC Bank | idfc | 1500 | - | 16 | 36 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 17 | 3 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 6 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 9 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 12 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 18 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 24 |
| Credit | Standard | IndusInd Bank | indus | 2000 | - | 16 | 36 |
Debit card EMI allows customers to pay in monthly instalments without a credit
card. The bank determines eligibility based on the customer's account history.
The following bank and plans are currently supported for debit card EMI.
The **Native OTP** column indicates whether the bank handles OTP
verification directly.
| Bank name | Native OTP |
| :- | :- |
| HDFC Bank | Yes |
#### Debit card EMI plans
| Card type | Type of EMI | Bank | card\_bank\_name | Minimum amount | Maximum amount | Annual interest rate | Tenure |
| - | - | - | - | - | - | - | - |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 3 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 6 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 9 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 12 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 18 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 24 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 36 |
| Debit | Standard | HDFC Bank | hdfc | 3000 | 400000 | 16 | 48 |
Cardless EMI allows customers to pay in instalments without a physical card.
Financing is provided by partner banks or Non-Banking Financial Companies (NBFCs).
The following table lists the supported cardless EMI providers, interest
rates, and available tenures.
| Card type | Type of EMI | Bank | provider | Minimum amount | Maximum amount | Annual interest rate | Tenure |
| - | - | - | - | - | - | - | - |
| Cardless | Standard | HDFC Bank | hdfc | 3000 | 500000 | 16 | 3 |
| Cardless | Standard | HDFC Bank | hdfc | 5000 | 500000 | 16 | 6 |
| Cardless | Standard | HDFC Bank | hdfc | 5000 | 500000 | 16 | 9 |
| Cardless | Standard | HDFC Bank | hdfc | 5000 | 500000 | 16 | 12 |
| Cardless | Standard | HDFC Bank | hdfc | 5000 | 500000 | 16 | 18 |
| Cardless | Standard | HDFC Bank | hdfc | 5000 | 500000 | 16 | 24 |
| Cardless | Standard | ICICI Bank | icici | 7000 | 500000 | 18 | 3 |
| Cardless | Standard | ICICI Bank | icici | 7000 | 500000 | 18 | 6 |
| Cardless | Standard | ICICI Bank | icici | 7000 | 500000 | 18 | 9 |
| Cardless | Standard | ICICI Bank | icici | 7000 | 500000 | 18 | 12 |
| Cardless | Standard | IDFC Bank | idfc | 5000 | 60000 | 24 | 3 |
| Cardless | Standard | IDFC Bank | idfc | 5000 | 60000 | 24 | 6 |
| Cardless | Standard | IDFC Bank | idfc | 5000 | 60000 | 24 | 9 |
| Cardless | Standard | IDFC Bank | idfc | 5000 | 60000 | 24 | 12 |
| Cardless | Standard | LazyPay | lazypay | 3000 | 100000 | 20 | 3 |
| Cardless | Standard | LazyPay | lazypay | 3000 | 100000 | 20 | 6 |
| Cardless | Standard | LazyPay | lazypay | 3000 | 100000 | 20 | 9 |
| Cardless | Standard | LazyPay | lazypay | 3000 | 100000 | 20 | 12 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 22 | 3 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 22 | 6 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 27 | 9 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 27 | 12 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 27 | 15 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 27 | 18 |
| Cardless | Standard | TVS Credit | tvs | 3000 | 50000 | 27 | 24 |
| Cardless | Standard | Home Credit | homecredit | 4000 | 75000 | 25 | 3 |
| Cardless | Standard | Home Credit | homecredit | 4000 | 75000 | 25 | 6 |
| Cardless | Standard | ZestMoney | zestmoney | 3000 | 200000 | 20 | 3 |
| Cardless | Standard | ZestMoney | zestmoney | 3000 | 200000 | 24.90 | 6 |
| Cardless | Standard | ZestMoney | zestmoney | 3000 | 200000 | 24.90 | 9 |
Pay later providers extend a short-term line of credit to customers, allowing
them to complete a purchase immediately and pay the amount, in full or in
instalments, at a later date.
The following table lists the supported pay later providers and the
corresponding parameter values to use in API requests.
| Provider parameter | Name of the provider |
| :- | :- |
| lazypay | LazyPay (applicable for orders with a minimum value of ₹100 and a maximum value of ₹5,000) |
# Errors
Source: https://www.cashfree.com/docs/api-reference/payments/errors
Understand the Cashfree API error structure, common HTTP status codes, and merchant-specific error codes you can handle programmatically.
## Error structure
The Payment Gateway response in case of an error includes the following:
* **error\_code**: Code associated with every error.
* **error\_description**: Description of the error.
* **error\_source**: Source of the error.
* **error\_reason**: Failure reason.
**Sample error response from API**:
```json theme={"dark"}
{
"message": "bad URL, please check API documentation",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_failed",
"type": "invalid_request_error"
}
```
**Sample error response from webhook**:
```json theme={"dark"}
{
"auth_id": null,
"authorization": null,
"bank_reference": "306118259130",
"cf_payment_id": 1636676360,
"entity": "payment",
"error_details": {
"error_code": "TRANSACTION_DECLINED",
"error_description": "transaction is rejected at the remitter bank end. Please reach out to issuer bank",
"error_reason": "bank_rejected",
"error_source": "bank"
},
"is_captured": false,
"order_amount": 1.00,
"order_id": "order_18482MSWq8prPMOW0jTeGsx0B1JmPC1",
"payment_amount": 1.00,
"payment_completion_time": "2023-03-02T18:24:51+05:30",
"payment_currency": "INR",
"payment_group": "upi",
"payment_message": "01::REJECTED",
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "8XXXXXXXX2@upi"
}
},
"payment_status": "FAILED",
"payment_time": "2023-03-02T18:24:18+05:30"
}
```
***
## List of error types and error codes
Below are the error types and error codes with their descriptions.
### Error types
| error\_type | description |
| - | - |
| `api_connection_error` | Network communication issue with API server. |
| `api_error` | General server error during request processing. |
| `authentication_error` | Invalid or missing authentication credentials. |
| `invalid_request_error` | Request is malformed or has invalid parameters. |
| `feature_not_enabled` | Requested feature is not enabled for the account. |
| `rate_limit_error` | Too many requests sent in a short time. |
| `validation_error` | Request failed validation checks. |
| `idempotency_error` | Repeated request with same idempotency key caused conflict. |
| `bad_gateway_error` | Received invalid response from upstream server. |
### Error codes
| error\_code | description |
| - | - |
| `card_unsupported` | Card type not supported by payment system. |
| `payment_method_unsupported` | Payment method not accepted for this transaction. |
| `surcharge_invalid` | Surcharge amount is missing, incorrect, or not allowed. |
| `payment_gateway_unsupported` | Selected payment gateway is not supported. |
| `card_submission_disabled` | Card submission is currently disabled or blocked. |
| `order_amount_invalid` | Order amount is missing, negative, or exceeds limits. |
| `order_inactive` | Order is no longer active or has expired. |
| `customer_email_invalid` | Customer email is missing or incorrectly formatted. |
| `version_invalid` | Provided API version is not supported or malformed. |
| `order_token_invalid` | Order token is missing, expired, or incorrect. |
| `sub_session_id_invalid` | Sub-session ID is missing or invalid. |
| `payment_session_id_invalid` | Payment session ID is missing or does not exist. |
| `native_otp_session_id_invalid` | Native OTP session ID is invalid or expired. |
| `flash_upi_auth_token_invalid` | Flash UPI auth token is invalid or expired. |
| `cookie_invalid` | Session cookie is missing, expired, or malformed. |
| `order_id_invalid` | Order ID is incorrect, missing, or unrecognised. |
| `order_expiry_time_invalid` | Order expiry time is missing, invalid, or in past. |
| `order_id_not_paid` | Order ID exists, but payment was not completed. |
| `order_id_voided` | Order was voided and cannot be processed further. |
| `refund_amount_invalid` | Refund amount is missing, invalid, or exceeds original payment. |
| `refund_id_invalid` | Refund ID is missing, incorrect, or unrecognised. |
| `netbanking_bank_code_invalid` | Invalid or unsupported netbanking bank code provided. |
| `payment_method_invalid` | Specified payment method is invalid or not recognised. |
| `refund_invalid` | Refund cannot be processed due to invalid conditions. |
| `vendor_id_invalid` | Vendor ID is missing, malformed, or not recognised. |
| `payment_gateway_inactive` | Payment gateway is inactive or unavailable. |
| `customer_phone_invalid` | Customer phone number is missing or incorrectly formatted. |
| `partner_apikey_invalid` | Partner API key is missing, invalid, or unauthorised. |
| `payment_amount_invalid` | Payment amount is missing, negative, or incorrectly formatted. |
| `refund_unsupported` | Refund operation is unsupported for this payment type. |
| `order_already_paid` | Order has already been paid successfully. |
| `bank_processing_failure` | Bank failed to process the payment request. |
| `api_request_timeout` | API request timed out before completion. |
| `sdk_token_invalid` | SDK token is invalid or malformed. |
| `sdk_token_unknown` | Unknown SDK token provided in the request. |
| `simulation_id_invalid` | Simulation ID is invalid or does not exist. |
| `entity_id_invalid` | Entity ID is incorrect, missing, or unrecognised. |
| `entity_unsupported` | Entity type is not supported for this operation. |
| `simulation_id_missing` | Simulation ID is required but missing in request. |
| `subscription_id_missing` | Subscription ID is required but missing. |
| `payment_id_missing` | Payment ID is missing or not found. |
| `plan_id_missing` | Plan ID is missing, invalid, or not found. |
| `refund_id_missing` | Refund ID is required but missing. |
| `PaymentForm_form_creation_failed` | Failed to create payment form due to internal error. |
| `PaymentForm_link_creation_failed` | Failed to create payment link due to system issue. |
| `order_already_exists` | Order already exists with the given ID or details. |
| `orderpay_already_exists` | OrderPay object already exists for this order. |
| `order_id_already_exists` | Order ID already exists and cannot be duplicated. |
| `domain_name_refererString` | Invalid or unapproved domain name in referer header. |
| `android_package_{xRequestedWith}` | Invalid or unrecognised Android package name in request. |
| `refType_not_approved` | Referenced entity is not approved for this operation. |
| `refType_ineligible` | Referenced entity is not eligible for this operation. |
| `payment_gateway_inactive_request_failed` | Payment gateway inactive; request could not be completed. |
| `subscription_id_missing_request_failed_failed` | Subscription ID missing; request failed. |
| `simulation_id_missing_request_failed_failed` | Simulation ID missing; request failed. |
| `cod_eligibility_failed` | COD eligibility check failed for this order. |
| `Paymentlink_create_failed` | Failed to create payment link due to internal issue. |
| `headless_otp_submit_request_failed` | OTP submission failed during headless authentication flow. |
| `order_creation_faied` | Order creation failed due to validation or server error. |
| `pan_submit_failed` | PAN submission failed due to invalid data or server error. |
| `gstin_submit_failed` | GSTIN submission failed due to incorrect or missing data. |
| `cin_submit_failed` | CIN submission failed due to invalid or missing data. |
| `risk_data_ip_address_request_failed` | IP address risk check failed during request processing. |
| `cart_create_failed` | Cart creation failed due to invalid input or server issue. |
| `order_create_failed` | Order creation failed; please retry or check input data. |
| `order_pay_failed` | Order payment attempt failed due to processing error. |
| `refund_post_failed` | Refund request failed to post due to system error. |
| `link_post_failed` | Failed to post link request to server. |
| `api_request_failed` | API request failed due to timeout or internal error. |
| `form_post_failed` | Form submission failed due to validation or processing error. |
| `aadhar_otp_generation_failed` | Aadhaar OTP generation failed during identity verification. |
| `aadhar_otp_verification_failed` | Aadhaar OTP verification failed or expired. |
| `pan_verification_failed` | PAN verification failed due to a mismatch or system error. |
| `bank_account_verification_failed` | Bank account verification failed due to invalid input. |
| `otp_generation_failed` | OTP generation failed due to rate limits or server error. |
| `otp_expired_failed` | OTP has expired; please request a new one. |
| `otp_invalid_failed` | OTP is invalid or does not match. |
| `ref_id_invalid_failed` | Reference ID is invalid or not found. |
| `shipping_fetch_failed` | Shipping info fetch failed due to network or service error. |
| `entity_simulation_payment_error_code_failed` | Entity simulation failed during payment processing. |
| `gst_verification_failed` | GST verification failed due to incorrect or unverified GSTIN. |
| `offer_not_found` | Offer not found or does not exist. |
| `customer_get_not_found` | Customer not found with given details. |
| `payment_not_found` | Payment record not found for provided ID. |
| `payment_post_not_found` | Payment request failed; resource not found. |
| `entityId_not_found` | Entity ID not found or unrecognised. |
| `order_get_not_found` | Order not found for given ID. |
| `cart_get_not_found` | Cart not found for current session or ID. |
| `orderpay_post_not_found` | OrderPay request not found or already processed. |
| `card_alias_not_found` | Card alias not found or invalid. |
| `cardbin_details_not_found` | Card BIN details not available or missing. |
| `card_not_found` | Card not found or does not exist. |
| `order_id_post_not_found` | Order ID not found in post request. |
| `modeRates_get_not_found` | Mode rate information not available or missing. |
| `refund_get_not_found` | Refund information not found for provided ID. |
| `transaction_get_not_found` | Transaction details not found or unavailable. |
| `settlement_get_not_found` | Settlement not found for provided identifier. |
| `link_get_not_found` | Payment link not found or deleted. |
| `merchant_get_not_found` | Merchant account not found or unregistered. |
| `terminal_id_post_not_found` | Terminal ID not found in post request. |
| `resource_post_not_found` | Resource not found during post request. |
| `terminal_post_not_found` | Terminal not found or inactive. |
| `order_request_not_found` | Order request not found or expired. |
| `payment_request_not_found` | Payment request not found or invalid. |
| `dispute_request_not_found` | Dispute request not found or missing. |
| `document_request_not_found` | Document request not found or expired. |
| `resource_get_not_found` | Requested resource not found or unavailable. |
| `form_get_not_found` | Form not found or has been removed. |
| `authentication_error` | Authentication failed due to invalid or missing credentials. |
| `customer_instruments_authentication_error` | Customer instruments request failed authentication. |
| `integrity_token_not_found` | Integrity token not found or expired. |
| `checkout_config_not_found` | Checkout configuration not found or misconfigured. |
| `api_error_not_found` | API error: requested resource not found. |
| `payment_instrument_not_found` | Payment instrument not found or unsupported. |
| `order_not_found` | Order does not exist or was deleted. |
| `instrument_not_found` | Instrument not found for current customer or request. |
| `request_failed` | Request failed due to server or network error. |
| `cryptogram_request_failed` | Cryptogram generation failed or request is invalid. |
| `authorize_only_invalid` | Authorise-only is not allowed for this transaction. |
| `card_number_invalid` | Card number is invalid or incorrectly formatted. |
| `emi_tenure_invalid` | EMI tenure is invalid or unsupported for selection. |
## List of errors for payments
Download the list of errors along with their explanation.
Payment Error List
Error details will be shown for every failed transaction in the payload of the following APIs and webhooks:
* [Get Payments for an Order](/docs/api-reference/payments/latest/payments/get-payments-for-an-order)
* [Get Payment by ID](/docs/api-reference/payments/latest/payments/get-payment-by-id)
* [Payment Failed Webhook](/docs/api-reference/payments/latest/payments/webhooks#payment-failed-webhook)
# Order Pay Authorise Only
Source: https://www.cashfree.com/docs/api-reference/payments/latest/apple-pay/payments/authorize-payment-for-an-order
post /orders/sessions/authorize
Use this API when an order has already been created and you want Cashfree to process the payment for authorisation only. To use this API, the 'AUTHORIZE_ONLY' flag must be enabled for your account. Submit [Support Form](https://merchant.cashfree.com/auth/login) to enable this feature.
# Create Customer at Cashfree
Source: https://www.cashfree.com/docs/api-reference/payments/latest/customers/create-customer-at-cashfree
openapi/payments/v2026-01-01.yaml post /customers
Use this API to register a customer in Cashfree's system before initiating payments, subscriptions, tokenisation, or other customer-linked actions. It creates a reusable *customer profile* and returns a unique identifier for future transactions.
# Accept Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/accept-dispute-by-dispute-id
openapi/payments/v2026-01-01.yaml put /disputes/{dispute_id}/accept
Use this API to get accept the Dispute by specifying the Dispute ID.
# Contest Arbitration by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/contest-arbitration-by-dispute-id
openapi/payments/v2026-01-01.yaml put /disputes/{dispute_id}/contest-arbitration
Use this API to contest an ARBITRATION dispute without uploading documents.
NPCI (National Payments Corporation of India) does not allow document upload at the `ARBITRATION` stage. Cashfree forwards the evidence you submitted at the pre-arbitration stage to the card network or NPCI for a final decision.
To contest a dispute at an earlier stage by uploading documents, use the [Submit Evidence API](/docs/api-reference/payments/latest/disputes/submit-evidence-to-contest-the-dispute-by-dispute-id) instead.
Use this API only when `dispute_type` is `ARBITRATION` and `dispute_status` is one of the following:
* `ARBITRATION_CREATED`
* `ARBITRATION_DOCS_RECEIVED`
* `ARBITRATION_INSUFFICIENT_EVIDENCE`
# Dispute Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/dispute-webhooks
Configure Cashfree dispute webhooks to receive automated notifications when disputes are created, updated, contested, or closed against your transactions.
Dispute webhooks can be configured to receive automated notifications when disputes are created, updated and closed.
The webhook notification will be sent on all the URLs added and enabled under the dispute webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
| Webhook | Description |
| :- | :- |
| DISPUTE\_CREATED | Dispute\_created webhook will be triggered when a new dispute is created. |
| DISPUTE\_UPDATED | Dispute\_updated webhook will be triggered when a dispute is updated, for example when a comment is added by the Cashfree team, when the dispute moves into further stages like Pre-arbitration, Arbitration, or when the status of the dispute changes. |
| DISPUTE\_CLOSED | This webhook will be triggered when a dispute is closed. |
Click [here](/docs/payments/online/webhooks/overview) to know how to configure webhooks.
## Dispute created
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": ""DISPUTE_CREATED"",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:50:04+05:30",
"type": "DISPUTE_CREATED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": ""DISPUTE_CREATED"",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": ""2023-06-15T21:50:04+05:30",
"type": "DISPUTE_CREATED"
}
```
## Dispute updated
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
## Dispute closed
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
## Payload field description
| Field | Description | Example | Type |
| - | - | - | - |
| dispute\_id | Cashfree’s unique ID to identify a dispute. | 433475257 | Long |
| dispute\_type | Type of dispute created. Possible values: - DISPUTE - RETRIEVAL - CHARGEBACK - PRE\_ARBITRATION - ARBITRATION | Chargeback | String |
| reason\_code | Condition for which the customer is filing the case. See [dispute reason codes](/docs/payments/manage/disputes/reason-codes) to know more. | 13.6 | String |
| reason\_description | Description of the reason code. Codes for Chargeback cases are specified by Card networks/NPCI. | Credit not processed | String |
| dispute\_amount | The amount for which the dispute has been created. | 4500 | BigDecimal |
| created\_at | Time on which the dispute was registered on Cashfree’s system. | 2023-06-15T21:16:03+05:30 | LocalDateTime |
| updated\_at | Time on which the dispute was updated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| respond\_by | Time by which the merchant is expected to respond to the dispute. | 2023-06-18T00:00:00+05:30 | LocalDateTime |
| dispute\_status | Status of Dispute. All possible values are listed in the table below. | CHARGEBACK\_CREATED | String |
| cf\_dispute\_remarks | Any remarks specified by Cashfree on the dispute. | Please submit documents. | String |
| dispute\_update | Specifies what has been updated on the dispute. Possible Values: - STATUS\_UPDATE - TYPE\_UPDATE - COMMENT\_UPDATE | TYPE\_UPDATE | String |
| dispute\_action\_on | Specifies whether the action is on Cashfree or Merchant at a time. Possible Values: - MERCHANT - CASHFREE | MERCHANT | String |
| resolved\_at | Time on which the dispute was resolved/closed. | 2023-06-15T21:16:51.682836678+05:30 | LocalDateTime |
| event\_time | Time at which dispute webhook was initiated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| type | Type of webhook. Possible Values: - DISPUTE\_CREATED - DISPUTE\_UPDATED - DISPUTE\_CLOSED | DISPUTE\_CREATED | String |
| List of dispute status |
| :- |
| DISPUTE\_CREATED |
| DISPUTE\_DOCS\_RECEIVED |
| DISPUTE\_UNDER\_REVIEW |
| DISPUTE\_MERCHANT\_WON |
| DISPUTE\_MERCHANT\_LOST |
| DISPUTE\_MERCHANT\_ACCEPTED |
| DISPUTE\_INSUFFICIENT\_EVIDENCE |
| RETRIEVAL\_CREATED |
| RETRIEVAL\_DOCS\_RECEIVED |
| RETRIEVAL\_UNDER\_REVIEW |
| RETRIEVAL\_MERCHANT\_WON |
| RETRIEVAL\_MERCHANT\_LOST |
| RETRIEVAL\_MERCHANT\_ACCEPTED |
| RETRIEVAL\_INSUFFICIENT\_EVIDENCE |
| CHARGEBACK\_CREATED |
| CHARGEBACK\_DOCS\_RECEIVED |
| CHARGEBACK\_UNDER\_REVIEW |
| CHARGEBACK\_MERCHANT\_WON |
| CHARGEBACK\_MERCHANT\_LOST |
| CHARGEBACK\_MERCHANT\_ACCEPTED |
| CHARGEBACK\_INSUFFICIENT\_EVIDENCE |
| PRE\_ARBITRATION\_CREATED |
| PRE\_ARBITRATION\_DOCS\_RECEIVED |
| PRE\_ARBITRATION\_UNDER\_REVIEW |
| PRE\_ARBITRATION\_MERCHANT\_WON |
| PRE\_ARBITRATION\_MERCHANT\_LOST |
| PRE\_ARBITRATION\_MERCHANT\_ACCEPTED |
| PRE\_ARBITRATION\_INSUFFICIENT\_EVIDENCE |
| ARBITRATION\_CREATED |
| ARBITRATION\_DOCS\_RECEIVED |
| ARBITRATION\_CONTEST\_REQUESTED |
| ARBITRATION\_UNDER\_REVIEW |
| ARBITRATION\_MERCHANT\_WON |
| ARBITRATION\_MERCHANT\_LOST |
| ARBITRATION\_MERCHANT\_ACCEPTED |
| ARBITRATION\_INSUFFICIENT\_EVIDENCE |
## Compute signature and verify
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload. Timestamp is present in the header x-webhook-timestamp
````bash theme={"dark"}
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));```
````
## Sample code
### Verify Signature using SDK
```node Node (express) theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```go Go theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute signature and verify manually
```node Node (express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Get Disputes by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/get-disputes-by-dispute-id
openapi/payments/v2026-01-01.yaml get /disputes/{dispute_id}
Use this API to get Dispute details by specifying the Dispute ID.
# Get Disputes by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/get-disputes-by-order-id
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/disputes
Use this API to get all Dispute details by specifying the Order ID.
# Get Disputes by Payment ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/get-disputes-by-payment-id
openapi/payments/v2026-01-01.yaml get /payments/{cf_payment_id}/disputes
Use this API to get all Dispute details by specifying the Payment ID.
# Submit Evidence to contest the Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/disputes/submit-evidence-to-contest-the-dispute-by-dispute-id
openapi/payments/v2026-01-01.yaml post /disputes/{dispute_id}/documents
Use this API to submit evidence to contest a dispute by specifying the dispute ID. This API does not apply to ARBITRATION disputes. Use the [Contest Arbitration API](/docs/api-reference/payments/latest/disputes/contest-arbitration-by-dispute-id) instead.
As per NPCI (National Payments Corporation of India) guidelines, document upload is not allowed at the ARBITRATION stage. If the dispute has reached the ARBITRATION stage, use the [Contest Arbitration API](/docs/api-reference/payments/latest/disputes/contest-arbitration-by-dispute-id) instead. All evidence submitted during the pre-arbitration stage is automatically carried forward for further processing.
# Fetch All Downtimes
Source: https://www.cashfree.com/docs/api-reference/payments/latest/downtime/fetch-all-downtimes
openapi/payments/v2026-01-01.yaml get /incident
Fetches active downtimes across various payment methods based on filters. Gives all active downtimes when no filters are applied.
# Create Adjustment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/create-adjustment
openapi/payments/v2026-01-01.yaml post /easy-split/vendors/{vendor_id}/adjustment
The Create Adjustment API will create a adjustment request either from vendor to the merchant or from merchant to the vendor.
# Create On Demand Transfer
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/create-on-demand-transfer
openapi/payments/v2026-01-01.yaml post /easy-split/vendors/{vendor_id}/transfer
The Create On Demand Transfer API will create a new on-demand request either from to the merchant or from to the vendor.
# Create Static Split Configuration
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/create-static-split-configuration
openapi/payments/v2026-01-01.yaml post /easy-split/static-split
This API will create a static split scheme wherein you can define the split type and the vendor-wise split percentage.
# Create Vendor
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/create-vendor
openapi/payments/v2026-01-01.yaml post /easy-split/vendors
Use this API to create a new vendor to your EasySplit account along with the KYC details. Provide KYC details such as account_type, business_type, gst, cin, pan, passport number and so on.
Keep the following points in mind when you create a vendor:
* Use [test account details](/docs/payments/split/data-to-test#sample-bank-account-numbers-upi-and-vpa) in Sandbox mode.
* Use test GST and PAN numbers from the [test details](/docs/payments/split/data-to-test#test-details) page.
* Vendors that you create in the Sandbox environment with test bank account and KYC details move to `ACTIVE` status automatically after 10 minutes.
* If a vendor doesn't move to `ACTIVE` status within 24 hours in Production mode, fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
# Download Vendor Documents
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/download-vendor-documents
openapi/payments/v2026-01-01.yaml get /easy-split/vendor-docs/{vendor_id}/download/{doc_type}
Use this API to download the uploaded KYC documents of that particular vendor. Provide the document type. Click the link from the sample request to download the KYC document.
# Get On Demand Balance
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-on-demand-balance
openapi/payments/v2026-01-01.yaml get /easy-split/vendors/{vendor_id}/balances
This API fetches the available amount with the merchant, vendor, and the unsettled amount for the merchant as well as the vendor.
# Get Split and Settlement Details by OrderID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-split-and-settlement-details-by-orderid
openapi/payments/v2026-01-01.yaml get /easy-split/orders/{order_id}
Use this API to get all the split details, settled and unsettled transactions details of each vendor who were part of a particular order by providing order Id or start date and end date.
# Get Split and Settlement Details by OrderID v2.0
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-split-and-settlement-details-by-orderid-v20
openapi/payments/v2026-01-01.yaml post /split/order/vendor/recon
Use this API to get all the split details, settled and unsettled transactions details of each vendor who were part of a particular order by providing order Id or start date and end date.
# Get Vendor All Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-vendor-all-details
openapi/payments/v2026-01-01.yaml get /easy-split/vendors/{vendor_id}
Use this API to get the details of a specific vendor associated with your Easy Split account.
# Get Vendor All Documents Status
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-vendor-all-documents-status
openapi/payments/v2026-01-01.yaml get /easy-split/vendor-docs/{vendor_id}
Use this API to fetch the details of all the KYC details of a particular vendor.
# Get Vendor Balance Transfer Charges
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/get-vendor-balance-transfer-charges
openapi/payments/v2026-01-01.yaml get /easy-split/amount/{amount}/charges
This API returns the applicable service charge and service tax for a vendor balance transfer, based on the provided amount and rate type.
# Split After Payment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/split-after-payment
openapi/payments/v2026-01-01.yaml post /easy-split/orders/{order_id}/split
The Split After Payment API splits payments to vendors after customers successfully complete a payment. After you receive a successful payment confirmation, wait 2 minutes before you call this API endpoint.
# Update Vendor Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/update-vendor-details
openapi/payments/v2026-01-01.yaml patch /easy-split/vendors/{vendor_id}
Use this API to edit the existing vendor details added to your EasySplit account. You can edit vendor details such as name, email, phone number, upi details, and any of the KYC details.
# Upload Vendor Docs
Source: https://www.cashfree.com/docs/api-reference/payments/latest/easy-split/upload-vendor-docs
openapi/payments/v2026-01-01.yaml post /easy-split/vendor-docs/{vendor_id}
Use this API to upload KYC documents of a specific vendor.
# Get Eligible Cardless EMI Payment Methods for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/eligibility/get-eligible-cardless-emi-payment-methods-for-a-customer-on-an-order
openapi/payments/v2026-01-01.yaml post /eligibility/cardlessemi
Use this API to get eligible Cardless EMI Payment Methods available for a customer on an order basis their phone number.
# Get Eligible Offers for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/eligibility/get-eligible-offers-for-an-order
openapi/payments/v2026-01-01.yaml post /eligibility/offers
Use this API to get eligible offers for an order_id or order amount.
# Get Eligible Paylater for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/eligibility/get-eligible-paylater-for-a-customer-on-an-order
openapi/payments/v2026-01-01.yaml post /eligibility/paylater
Use this API to get eligible Paylater Payment Methods for a customer on an order.
# Get Eligible Payment Methods for Orders
Source: https://www.cashfree.com/docs/api-reference/payments/latest/eligibility/get-eligible-payment-methods
openapi/payments/v2026-01-01.yaml post /eligibility/payment_methods
Fetch the payment instruments a Cashfree order is eligible to use, including UPI, cards, netbanking, wallets, and EMI rails for personalised checkouts.
Run in Postman: You can also try this API in our Postman Collection.
## Client environment headers
Cashfree requires information about the customer's device environment to enforce NPCI rules. You must include the following headers in your [Order Pay API](/docs/api-reference/payments/latest/payments/order-pay) and Get Eligible Payment Methods request:
| Header | Accepted values | Requirement | Description |
| - | - | - | - |
| `x-client-device` | `mobile`, `desktop`, `tablet` | Required | Type of device used by customer |
| `x-client-os` | `android`, `ios`, `windows`, `macos`, `linux`, `others` | Required | Operating system of customer's device |
| `x-client-rendering-type` | `mweb`, `webview`, `native` | Required when `x-client-device` is mobile | Rendering method used for the checkout experience |
| `x-client-browser` | `safari`, `chrome`, `firefox`, `edge`, `others` | Required | Browser used by the customer |
`x-client-rendering-type` is required only when `x-client-device` is set to mobile. For desktop and tablet devices, this header is optional.
# Fetch Downtime by ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/intellisense/fetch-downtime-by-id
openapi/payments/v2026-01-01.yaml get /incident/{id}
Fetches details of a specific downtime using its unique ID.
# Get Import Settlement Details for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-details
openapi/cb-imports/v2026-01-01.yaml get /import/orders/{order_id}/settlements
This API is used to get ICA settlement details using PG Order ID.
# Get Import Settlement Recon Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-recon-details
openapi/cb-imports/v2026-01-01.yaml post /import/settlements/recon
This API is used to fetch all events for the provided Settlement IDs.
# Get Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/get-payment-verification-details
get /import/transactions/{cf_payment_id}
This API is used to get the verification status of the payment.
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/import-webhooks
Set up Cashfree Collect from India import webhooks to receive event-based notifications about incoming international payments and reconciliation status.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
For instructions on configuring webhooks, see [Configure Webhooks](/docs/payments/online/webhooks/configure).
## Payment Verification details webhook version (2025-01-01)
The payment verification details update webhook notifies you about the payment details verification, and it give you comprehensive information about verification details update.
A notification is sent to your backend from cashfree when there is any new update for payment verification. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the payment verification update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"order_id": "e145c994-5899-4466-804d-b90c625b2c1b",
"cf_payment_id": 5114910634577,
"payment_status": "SUCCESS",
"payment_verification_status": "ACTION_REQUIRED",
"payment_verification_expiry": "2024-07-12T15:19:42+05:30",
"remarks": null,
"required_details": [
{
"doc_name": "goods_description",
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "invoice_number",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_name",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_address",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "country_of_origin",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "invoice_file",
"doc_type": "DOCUMENT",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "ecommerce_order_serial_number", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "hs_code", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "shipment_date", //Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "port_of_loading",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "awb_number",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
}
]
},
"event_time": "2024-07-12T13:39:42+05:30",
"type": "PAYMENT_VERIFICATION_UPDATE"
}
```
## ICA Settlement details webhook version 1 (2022-09-01)
The ICA Settlement Details Update webhook notifies you about the ica settlement.
A notification is sent to your backend from cashfree when there is any new update for ica settlement. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the ica settlement update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"adjustment_amount_inr": -347641.22,
"collection_amount_inr": 604854.0,
"initiated_on": null,
"payment_from": "2024-09-26T15:43:55",
"payment_till": "2024-09-26T16:43:13",
"service_charge_inr": null,
"service_tax_inr": 2068.59,
"settled_on": null,
"settlement_amount_inr": 243651.95,
"settlement_charges_inr": 0.0,
"settlement_foreign_currency_details": {
"settlement_amount_fcy": null,
"settlement_currency": "USD",
"settlement_forex_rate": null
},
"cf_ica_settlement_id": 12,
"settlement_tax_inr": 0.0,
"settlement_utr": null,
"status": "NOT_INITIATED"
},
"event_time": "2024-10-03T13:27:36+05:30",
"type": "ICA_SETTLEMENT_UPDATE"
}
```
## ICA settlement details webhook for LRS travel
The ICA settlement details update webhook for Liberalised Remittance Scheme (LRS) travel notifies you about ICA settlements for LRS travel collections. This payload includes the `tcs_amount_inr` field, which reports the tax collected at source (TCS) on the settlement.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"cf_ica_settlement_id": 10683,
"status": "SETTLED",
"collection_amount_inr": 34653.0000,
"service_charge_inr": 658.4400,
"service_tax_inr": 118.5100,
"tcs_amount_inr": 4053.5000,
"adjustment_amount_inr": 0.0000,
"settlement_charges_inr": 0.0000,
"settlement_tax_inr": 0.0000,
"settlement_amount_inr": 30599.5000,
"settlement_foreign_currency_details": {
"settlement_currency": "USD",
"settlement_forex_rate": 94.5398,
"settlement_amount": 323.6679
},
"payment_from": "2026-06-05T19:33:59+05:30",
"payment_till": "2026-06-08T13:22:48+05:30",
"settlement_utr": "8503c728-a7e5-4cec-9e87-4284ee3a235c",
"initiated_on": "2026-06-10T10:28:33+05:30",
"settled_on": "2026-06-30T06:29:21+05:30"
},
"event_time": "2026-06-30T06:29:21+05:30",
"type": "ICA_SETTLEMENT_UPDATE"
}
```
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));
```
## Sample code
### Verify Signature using SDK
```node Node(express) theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
```go Go theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute signature and verify manually
```node Node(express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Mark Sandbox Settlement Processed
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/mark-sandbox-settlement-processed
put /import/settlements/emulate
This API is used to mark settlement as processed in sandbox environment.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/overview
Cashfree Collect from India helps overseas merchants, payment aggregators, and marketplaces accept payments from Indian customers in INR with full compliance.
**Getting Started**
Follow the steps mentioned below to get started with Collect from India APIs
* Fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) for onboarding assistance
* If you are a Merchant, generate your keys using this method [Link](/docs/api-reference/authentication#generate-api-keys)
* Register your webhook URL for updates and subscribe to the required events. For more information, refer to the [Webhook documentation](/docs/api-reference/payments/latest/international-payments/collect-from-india/import-webhooks).
Once these setup is completed, we can use the below mentioned collection of APIs to create import transactions.
**Collect from India - List of APIs**
| API name | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/latest/orders/create-order) | This API will create an order to collect payment |
| [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) | This API is used to pay the created payment |
| [Get Payment by ID](/docs/api-reference/payments/latest/payments/get-payment-by-id) | This API is used to view payment details of an order for a payment ID |
| [Upload Payment Verification Details](/docs/api-reference/payments/latest/international-payments/collect-from-india/upload-payment-verification-details) | This API is used to upload the required payment verification details |
| [Get Payment Verification Details](/docs/api-reference/payments/latest/international-payments/collect-from-india/get-payment-verification-details) | This API is used to Get the verification status of the payment |
| [Get Import Settlement Details for an Order](/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-details) | This API is used to get ICA settlement details using PG Order ID |
| [Get Import Settlement Recon Details](/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-recon-details) | This API is used to fetch all events happened for provided Settlement IDs |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/sandbox-simulation
Learn how to simulate transaction verification and settlement processes in the sandbox environment for payments from India-based customers to overseas merchants
## Transaction verification simulation
In the sandbox environment, you can simulate transaction verification using predefined test values that are automatically approved. For file-type content, the system approves PDF files while rejecting other file formats.
You can submit verification details either through the [Upload Payment Verification Details](/docs/api-reference/payments/latest/international-payments/collect-from-india/upload-payment-verification-details) or the dashboard.
### Test values for transaction verification
| Field name | Value |
| - | - |
| importer\_name | John |
| importer\_address | 321 Elm Street, Suite 3, Los Angeles, CA 90401, USA |
| goods\_description | This is a test product for test purpose |
| country\_of\_origin | USA |
| ecommerce\_order\_serial\_number | 123123 |
| invoice\_number | 234234 |
| hs\_code | 3456 |
| shipment\_date | 01/01/2027 |
| port\_of\_loading | Houston |
| importer\_address\_postal\_code | 560034 |
## Settlement simulation
The sandbox environment provides APIs to simulate the settlement process. This includes triggering settlements and updating their status.
### Trigger settlement
Use the [Trigger Settlement API](/docs/api-reference/payments/latest/international-payments/collect-from-india/trigger-sandbox-settlement) to initiate a settlement. This is an asynchronous process, with settlement entries typically created within one second.
### Mark settlement as processed
To update a settlement's status to "Processed", use the [Mark Settlement as Processed](/docs/api-reference/payments/latest/international-payments/collect-from-india/mark-sandbox-settlement-processed).
The settlement forex rate shown is notional and may differ from actual foreign exchange rates.
#### Simulating skipped settlements
A settlement will be skipped if the settlement amount is between 0 and 1 INR, or if it is negative, the amount will be adjusted in the next settlement.
Example of how to simulate a skipped settlement:
1. Create a transaction
2. Refund the transaction
3. Trigger settlement using the API
The settlement will be skipped since the total collection amount will be less than 0.
# Trigger Sandbox Settlement
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/trigger-sandbox-settlement
post /import/settlements/emulate
This API is used to trigger settlement in sandbox environment.
# Upload Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/collect-from-india/upload-payment-verification-details
openapi/cb-imports/v2025-01-01.yaml post /import/transactions/{cf_payment_id}
This API is used to upload the required payment verification details.
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/endpoints
Reference base URLs and endpoints for the Cashfree Global Collections APIs across the sandbox testing environment and the production processing environment.
## Global collections gateway end points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/](https://sandbox.cashfree.com/) |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/overview
Use Cashfree Global Collections to accept cross-border collections in multiple currencies through virtual accounts that settle to your home bank account.
To start using Global Collection APIs, generate your API credentials by following these steps:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Go to **Developers**.
3. Click **API Keys** under the respective product card.
4. Select **Generate API Keys** and click **Download**.
In the test environment, keys are auto-generated. In production, click **Generate API Keys** and complete two-factor authentication.
View keys by clicking the icon and selecting **View API Key**.
***
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
**Global Collections List of APIs**
| API name | Description |
| :- | :- |
| [Get Token](/docs/api-reference/payments/latest/international-payments/global-collections/partner/auth-get-token) | This API generates a new token. |
| [Verify Token](/docs/api-reference/payments/latest/international-payments/global-collections/partner/auth-verify-token) | Verify the authentication token generated. The response will be ‘Token is not valid’ if the token does not exist, invalid or has been expired. |
| [Get Collection Accounts](/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-collection-accounts) | This API fetches all the virtual accounts that are linked with this account. |
| [Get Transactions](/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-transactions) | Use this API to get all the transaction details within a time interval. |
| [Add Transaction Details](/docs/api-reference/payments/latest/international-payments/global-collections/partner/add-transaction-details) | Use this API to add transaction details to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount. |
| [Simulate Transaction](/docs/api-reference/payments/latest/international-payments/global-collections/partner/simulate-transaction) | Use this API to simulate funding to any of the virtual accounts of your merchants. |
# Add Transaction Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/add-transaction-details
post /gc/transactions/{referenceId}/invoice-details
Use this API to input invoice details for a specific transaction. You have the flexibility to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/auth-get-token
post /gc/authorize
Use this API to authenticate with the Cashfree system and obtain the authorization bearer token.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/auth-overview
Authenticate Global Collections partner API calls by generating bearer tokens, verifying token validity, and refreshing credentials before each request.
* [Get Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-get-token) - Use the Get Token API to authenticate with the Cashfree system and obtain the authorization bearer token, call the authorize API.
* [Verify Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-verify-token) - Verify the authentication token generated. The response will be 'Token is not valid' if the token does not exist, invalid or has been expired.
# Verify Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/auth-verify-token
get /gc/token/verify
Verify the authentication token generated by the user.
# Get Collection Accounts
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-collection-accounts
get /gc/virtual-accounts
This API fetches all the virtual accounts that is linked with the given merchant ID.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Transactions
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-transactions
get /gc/transactions
Use this API to get all the transaction details within a time interval.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/overview
Browse Cashfree Global Collections partner APIs to fetch merchant transactions, simulate funding events, and manage virtual collection accounts at scale.
* [Get All Transactions Details](/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-transactions) - Use this to fetch all the transactions for a particular merchant.
* [Emulate Funding](/docs/api-reference/payments/latest/international-payments/global-collections/partner/simulate-transaction) - Use this to emulate a transaction for a specific merchant.
* [Get All Collection Accounts for Partner Merchants](/docs/api-reference/payments/latest/international-payments/global-collections/partner/get-collection-accounts) - Use this to get all VAs for a specific merchant.
* [Add Invoice Details for Partner Merchants](/docs/api-reference/payments/latest/international-payments/global-collections/partner/add-transaction-details) - Use this API to input invoice details for a specific transaction for a specific merchant.
* [Merchant Webhook Configs](/docs/api-reference/payments/latest/international-payments/global-collections/partner/webhooks) - Use this document to understand the webhooks payload events and verification.
# Simulate Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/simulate-transaction
post /gc/transactions/emulate
Use this API to simulate a funding in test environment.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Webhook - Partner
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/partner/webhooks
Configure Global Collections partner webhooks in the Cashfree partner dashboard to receive transaction, settlement, and virtual account notifications.
### Guide to subscribe webhook events
1. Visit [https://partner.cashfree.com](https://partner.cashfree.com) login with your partner credentials
2. On the landing page click on developers section and select webhook, you will be redirected to a page to add webhook URL and subscribe events or once logged in you can use this URL [Webhook Page](https://partner.cashfree.com/partner-ui/dashboard/developers/webhook)
3. Add your webhook URL and subscribe events Global Collect Transaction, Global Collect Settlement & Global Collect Virtual Account
4. To validate the webhook signature follow [Adding webhook and signature verification guide](/docs/api-reference/platforms/latest/merchant-onboarding/webhooks#verify-signature)
### Screenshots:
Landing page to add the webhook URL and subscribe the events
We can add multiple webhook URLs for the different type of events. For testing, Switch to test and follow the same step in sandbox environment.
## Transaction status
Active Event needs to be subscribed: **Global Collect Transaction**
```json Json theme={"dark"}
{
"amount": "4.50",
"currency": "GBP",
"cmsProfileId": 123,
"event": "INTERNATIONAL_PAYMENT_COLLECTED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2022-12-29 13:42:54",
"referenceId": 63,
"remarks": "",
"remitterAccount": "1223456789",
"remitterAddress": "Dummy Address",
"remitterBic": "TRWIBEB1XXX",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"status": "COMPLETED",
"utr": "5347f52a-9851-4fe9-8618-32eb085590ce",
"updatedStatusTime": "2022-12-29 13:50:35",
"vAccountId": "97836",
"vAccountNumber": "GB38TCCL12345687997836"
}
```
### Possible events and corresponding transaction status mapping
| Event name | Payment status | Description |
| :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_COLLECTED | COMPLETED | Received payment |
| INTERNATIONAL\_PAYMENT\_BLOCKED | BLOCKED | The transaction has been blocked due to the specified reason in the designated field. |
| INTERNATIONAL\_PAYMENT\_AWAITING\_DETAILS | COMPLETED | Waiting for the details of the transaction |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of supported currencies [here](/docs/payments/global-collections/collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| reason | Reason regarding the transaction being blocked. | Transaction value below the allowed limit |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED, AWAITING\_DETAILS |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was done. | GB38TCCL12345687997836 |
| merchant | Object contains merchant\_id used while creating merchant | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
## Reversal status
```Text JSON theme={"dark"}
{
"amount": "1000000.00",
"cmsProfileId": 123,
"currency": "USD",
"event": "INTERNATIONAL_PAYMENT_REVERSAL_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2024-02-28 16:17:48",
"referenceId": 63,
"remitterAccount": "9919391193",
"remitterAddress": "Dummy Address",
"remarks": "",
"remitterBic": "",
"remitterCountry": "IN",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"reversal": {
"reason": "Transaction value higher than the compliant limit",
"status": "INITIATED"
},
"signature": "F8raBNGcGjMUvbh2t/7t/9C4zU0Snqa/iXf9XzvOq0Y=",
"status": "REVERSAL_INITIATED",
"updatedStatusTime": "2024-02-28 16:17:54",
"utr": "IF-20240228-KT9ZFA",
"vAccountId": "GB75T",
"vAccountNumber": "GB75TCCL12345654108280"
}
```
### Possible events and corresponding transaction status mapping
| Event name | Reversal status | Transaction status | Description |
| :- | :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_INITIATED | INITIATED | REVERSAL\_INITIATED | Reversal for the transaction is initiated. |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_DONE | DONE | REVERSAL\_DONE | Reversal for the transaction is completed. The funds have been successfully returned to the sender. |
### Payload field description
***
## Settlement status
Active Event needs to be subscribed: **Global Collect Settlement**
```json theme={"dark"}
{
"amount": "3500.00",
"cmsProfileId": 23853384,
"currency": "USD",
"event": "INR_SETTLEMENT_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentRail": "ACH",
"paymentTime": "2024-02-06 11:11:42",
"referenceId": 312620,
"remarks": "EMULATE GC INCOMING FUNDS",
"remitterAccount": "7337377781",
"remitterAddress": "Dummy Address",
"remitterBic": "TLG0123",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"settlement": {
"expectedSettlementDate": "2024-02-06",
"fxRate": 85.12,
"id": "f16581f5-344c-40e8-be4b-e63cb5714a88",
"inrAmount": 16219.65,
"netPartnerCommission": 2106.72,
"settlementCharge": 4213.44,
"settlementChargeTax": 758.42,
"status": "INITIATED"
},
"status": "READY_FOR_SETTLEMENT",
"updatedStatusTime": "2024-02-05 18:39:42",
"utr": "f185d0f5-abf5-492b-9149-d45eacfeaca7",
"vAccountId": "03314",
"vAccountNumber": "0331496070"
}
```
The firaFileDownloadUrl field will only be included in the webhook response
after it has been updated.
### Possible events and corresponding settlement status mapping
| Event name | Settlement status | Description |
| :- | :- | :- |
| INR\_SETTLEMENT\_INITIATED | INITIATED | The settlement is initiated. |
| INR\_SETTLEMENT\_APPROVED | SETTLED | The settlement is settled. |
| INR\_SETTLEMENT\_REJECTED | REJECTED | The settlement is rejected. |
| FIRA\_FILE\_RECEIVED | SETTLED | FIRA file received for the settlement. |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of [supported currencies](/docs/payments/international-payments/global-collections/collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was made. | GB38TCCL12345687997836 |
| paymentRail | Payment Network used to make the payment | ACH,EFT,FPS,SEPA,SWIFT,FEDWIRE |
| settlement.id | Unique reference ID for the settlement since the payment can have multiple settlements. | b84a7c4c-2ce0-48ca-9b86-2a2c9ad5a35d |
| settlement.fxRate | The foreign exchange rate used for currency conversion between the transaction currency and settlement currency | 85.12 |
| settlement.netPartnerCommission | The final commission amount payable to the partner after deducting all applicable fees and charge | 2106.72 |
| settlement.settlementCharge | Service fees charged for facilitating the settlement | 4213.44 |
| settlement.settlementChargeTax | Applicable tax amount levied on the settlement service charges | 758.42 |
| settlement.inrAmount | Settlement amount in rupees (INR). | 16219.65 |
| settlement.firafileDownloadUrl | Download link to FIRA file | fileDownloadUrl |
| settlement.status | Current status of the settlement. | INITIATED |
## Virtual account details
Active Event needs to be subscribed: **Global Collect Virtual Account**
```json Json theme={"dark"}
{
"cmsProfileId": 260559,
"event": "VIRTUAL_ACCOUNT_DETAILS",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"vAccounts": [
{
"accountName": "John Doe",
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "AUD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
},
{
"accountName": "John Doe",
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "BHD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
}
]
}
```
### Possible events and corresponding virtual account mapping
| Event name | Virtual account status | Description |
| - | - | - |
| VIRTUAL\_ACCOUNTS\_ACTIVATED | ACTIVE | Virtual account is activated |
| VIRTUAL\_ACCOUNTS\_CREATED | INACTIVE / ACTIVE | If all the business required details are passed in the first go, VAs are created in ACTIVE state or INACTIVE |
| VIRTUAL\_ACCOUNT\_DETAILS | ACTIVE | Will contain all the details of the VA |
#### Description
Sometimes there is mere might be a slight delay in creating some virtual accounts during onboarding and as a result, some of them might be missing in the Get All Collection Accounts API. Hence, when these missing account details are added, this webhook is triggered with all virtual account details (including the ones that were present before). This webhook contains information for all virtual account associated with a merchant along with cmsProfileId , signature and event.
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook Event | VIRTUAL\_ACCOUNT\_DETAILS |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| vAccounts.accountName | Account Name | John Doe |
| vAccounts.accountNumber | Account Number | GB11TCCL12345638242754 |
| vAccounts.accountType | Account Type | iban |
| vAccounts.paymentType | Type of Payment | priority |
| vAccounts.bankName | Bank Name | The Currency Cloud Limited |
| vAccounts.bankAddress | Bank Address | 12 Steward Street, The Steward Building, London, E1 6FQ, GB |
| vAccounts.bankCountry | Bank Country | GB |
| vAccounts.currency | Currency Code | BHD |
| vAccounts.routingCode | Routing Code | TCCLGB3L |
| vAccounts.routingCodeType | Routing Code Type | bic\_swift |
| vAccounts.addedOn | The time when this virtual account was created | 2023-03-28 14:43:30 |
| vAccounts.vaccountId | Virtual Account Id | GB11T |
# Purpose Codes
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/global-collections/purpose-codes
Reference FEMA-compliant purpose codes used with Cashfree Global Collections to declare the nature of inward remittances from overseas customers.
| Purpose code | Description |
| - | - |
| P0103 | Advance receipts against export contracts, which will be covered later by GR/PP/SOFTEX/ SDF - other than Nepal and Bhutan |
| P1004 | Legal services |
| P1005 | Accounting, auditing, bookkeeping services |
| P1006 | Business and management consultancy and public relations |
| P1007 | Advertising, trade fair service |
| P1008 | Research & Development services |
| P1009 | Architectural services |
| P0802 | Software consultancy / implementation (other than those covered in SOFTEX form) |
| P0807 | For Export of Software covered under softex (advance payment) |
| P1020 | Wholesale and retailing trade services |
| P1002 | Trade related services - commission on exports / imports |
| P1104 | Entertainment services |
| P1099 | Other services not included elsewhere, for export of services |
| P1015 | Tax consulting services |
| P1016 | Market research and public opinion polling service |
| P1017 | Publishing and printing services |
| P1019 | Commission agent services |
| P1107 | Educational services |
| P1109 | Other Personal, Cultural & Recreational services |
| P1701 | Receipts on account of processing of goods |
| P0301 | Purchases towards travel (Includes purchases of foreign TCs, currency notes etc over the counter, by hotels, Emporiums, institutions etc. as well as amount received by TT/SWIFT transfers or debit to Non-Resident account). |
| P0302 | Business travel |
| P0304 | Travel for medical treatment including TC purchased by hospitals |
| P0305 | Travel for education including TCs purchased by educational institutions |
| P0306 | Other travel receipts |
| P0801 | Hardware consultancy/implementation |
| P0803 | Data base, data processing charges |
| P0804 | Repair and maintenance of computer and software |
| P0805 | News agency services |
| P0806 | Other information services- Subscription to newspapers, periodicals, etc. |
| P0808 | Telecommunication services including electronic mail services and voice mail services |
| P1013 | Environmental Services |
| P1014 | Engineering Services |
| P1101 | Audio-visual & related service:Motion picture & video tape production, distribution & projection service |
| P1103 | Radio & TV production,distribution & transmission service |
| P1105 | Museums, library and archival services |
| P1106 | Recreation and sporting activity services |
| P1108 | Health Service provided by Indian hospitals,doctors,nurses,paramedical remotely/on-site) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/international-payments/overview
Explore the Cashfree International Payments APIs that help businesses accept and disburse cross-border transactions in multiple currencies and regions.
You can use the Cashfree API in test mode, which doesn't affect your live data or interact with the banking networks. The API key you use to authenticate the request determines whether the request is live mode or test mode.
For overseas businesses to collect payments from Indian customers
For Indian businesses to collect payments from customers worldwide
# Create Offer
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offers/create-offer
openapi/payments/v2026-01-01.yaml post /offers
Use this API to create offers with Cashfree from your backend.
# Get Offer by ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offers/get-offer-by-id
openapi/payments/v2026-01-01.yaml get /offers/{offer_id}
Use this API to get offer by offer_id.
# Create Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/create-terminal
openapi/payments/v2026-01-01.yaml post /terminal
Use this API to create new terminals to use softPOS.
# Create Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/create-terminal-transaction
openapi/payments/v2026-01-01.yaml post /terminal/transactions
Use this API to create a new terminal transaction. To use this API you should first create an order using the Create Order API. Also, you need to enter the terminal details while creating the order and pass the same terminal information while creating a transaction using the below mentioned API.
# Demap Soundbox VPA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/demap-soundbox-vpa
openapi/payments/v2026-01-01.yaml post /terminal/demap/soundbox
Use this API to demap a device from soundbox.
# Fetch Terminal QR Codes
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/fetch-terminal-qr-codes
openapi/payments/v2026-01-01.yaml get /terminal/qrcodes
You can fetch all the StaticQRs corresponding to given terminal id or phone number. Provide either the terminal_phone_no or terminal_id in the request.
# Fetch Terminal Soundbox VPA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/fetch-terminal-soundbox-vpa
openapi/payments/v2026-01-01.yaml get /terminal/soundbox/qrcodes
You can fetch all the active and mapped SoundboxVpa corresponding to given terminal id or deviceSerialNo. Provide either the device_serial_no or cf_terminal_id in the request.
# Get list of terminal transactions
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/get-list-of-terminal-transactions
openapi/payments/v2026-01-01.yaml post /terminal/payments
Use this API to fetch a paginated list of terminal payment transactions. You can filter results by date range, terminal details, payment status, and other criteria.
# Get Terminal Status using Phone Number
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/get-terminal-status-using-phone-number
openapi/payments/v2026-01-01.yaml get /terminal/{terminal_phone_no}
Use this API to view all details of a terminal.
# Get Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/get-terminal-transaction
openapi/payments/v2026-01-01.yaml get /terminal/{cf_terminal_id}/payments
Use this API to get terminal transaction.
# Onboard Soundbox VPA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/onboard-soundbox-vpa
openapi/payments/v2026-01-01.yaml post /terminal/soundbox
Use this API to onboard a terminal Vpa to soundbox.
# Offline Payments Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/softpos-webhooks
Receive Cashfree Offline Payments webhooks for in-person card and UPI transactions so your servers learn about completions, failures, and refunds.
Configure an endpoint to receive instant notifications when your terminal's status changes through Cashfree Offline Payments.
## Terminal status update webhook
The terminal status update webhook is triggered when a terminal's status changes. The payload includes the updated terminal details and the event timestamp.
```java theme={"dark"}
{
"data": {
"added_on": "2024-03-07 15:11:02",
"cf_terminal_id": 1234,
"last_updated_on": "2024-04-26 12:16:08",
"terminal_id": 1233,
"terminal_name": "ABC",
"terminal_phone": "9696969696",
"terminal_status": "PROVISIONALLY_ACTIVE",
"terminal_type": "STOREFRONT",
"review_remarks": "approved"
},
"event_time": "2024-04-26T12:16:08+05:30",
"type": "TERMINAL_STATUS_UPDATE"
}
```
# Update Soundbox VPA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/update-soundbox-vpa
openapi/payments/v2026-01-01.yaml patch /terminal/{cf_terminal_id}/soundbox
Use this API to update a terminal Vpa to soundbox.
# Update Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/update-terminal
openapi/payments/v2026-01-01.yaml patch /terminal/{cf_terminal_id}
Use this API to update the terminal details. Email, Phone Number, and Terminal Meta are updatable for "Storefront". Only account status change is possible in case of "Agent".
# Update Terminal Status
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/update-terminal-status
openapi/payments/v2026-01-01.yaml patch /terminal/{cf_terminal_id}/status
Use this API to update the terminal status.
# Upload Terminal Docs
Source: https://www.cashfree.com/docs/api-reference/payments/latest/offline-payments/upload-terminal-docs
openapi/payments/v2026-01-01.yaml post /terminal/{cf_terminal_id}/docs
Use this API to upload the terminal documents.
# Create Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/orders/create-order
openapi/payments/v2026-01-01.yaml post /orders
An order is an entity which has a amount and currency associated with it. It is something for which you want to collect payment for.
Use this API to create orders with Cashfree from your backend to get a `payment_sessions_id`.
You can use the `payment_sessions_id` to create a transaction for the order.
# Get Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/orders/get-order
openapi/payments/v2026-01-01.yaml get /orders/{order_id}
Use this API to fetch the order that was created at Cashfree's using the `order_id`.
## When to use this API
- To check the status of your order
This API allows you to retrieve order data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Get Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/latest/orders/get-order-extended
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/extended
Use this API to fetch the order related data like address,cart,offers,customer details etc using the Cashfree's `order_id`.
## When to use this API
- To get the extended data associated with order.
This API allows you to retrieve order data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Terminate Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/orders/terminate-order
openapi/payments/v2026-01-01.yaml patch /orders/{order_id}
Use this API to terminate the order that was created at Cashfree's using the `order_id`.
# Update Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/latest/orders/update-order-extended
openapi/payments/v2026-01-01.yaml put /orders/{order_id}/extended
Use this api to update the order related data like shipment details,order delivery status etc.
## When to use this API
- To provide/update the shipment details or order delivery status.
- Once the order is PAID.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/overview
Learn details about the 2026-01-01 version of our Payment APIs.
## Payment Gateway endpoints
Use the following base URLs depending on whether you are testing or processing live payments.
| Environment | Base URL |
| :- | :- |
| Test | `https://sandbox.cashfree.com/pg` |
| Production | `https://api.cashfree.com/pg` |
| Latest version | v6, 2026-01-01 The previous versions were 2025-01-01, 2023-08-01, 2021-05-21, 2022-01-01, and 2022-09-01 |
## Authentication
All APIs require authentication except `POST /orders/sessions`, which does not require credentials and can be called directly from the browser.
For authentication details for merchants and partners, see [API authentication](/docs/api-reference/authentication).
## Payment gateway APIs
The following sections list all available APIs grouped by function.
### Orders
Use these APIs to create and manage payment orders.
| API | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/latest/orders/create-order) | Use this API to create orders with Cashfree from your backend and get the payment link. |
| [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) | Use this API when you have already created the orders and want Cashfree to process the payment. |
| [Preauthorization](/docs/api-reference/payments/latest/payments/preauthorisation) | Use this API to capture or void a preauthorized payment. |
| [Get Order](/docs/api-reference/payments/latest/orders/get-order) | Use this API to view all details of an order. |
### Authentication
Use this API to submit or resend an OTP during a payment flow.
| API | Description |
| :- | :- |
| [Submit or Resend OTP](/docs/api-reference/payments/latest/payments/submit-or-resend-otp) | Use the submit or resend OTP API to send OTP to Cashfree. |
### Payments
Use these APIs to retrieve payment details for an order.
| API | Description |
| :- | :- |
| [Get Payments for an Order](/docs/api-reference/payments/latest/payments/get-payments-for-an-order) | Use this API to view all payment details for an order. |
| [Get Payment by ID](/docs/api-reference/payments/latest/payments/get-payment-by-id) | Use this API to view payment details of an order for a payment ID. |
### Settlements
Use these APIs to fetch settlement details for individual orders or across a date range.
| API | Description |
| :- | :- |
| [Get Settlements by Order ID](/docs/api-reference/payments/latest/settlements/get-settlements-by-order-id) | Use this API to view all the settlements of a particular order. |
| [Get All Settlements](/docs/api-reference/payments/latest/settlement-reconciliation/get-all-settlements) | Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range. |
### Payment links
Use these APIs to create, retrieve, and manage payment links.
| API | Description |
| :- | :- |
| [Create Payment Link](/docs/api-reference/payments/latest/payment-links/create-payment-link) | Use this API to create a new payment link. The created payment link url will be available in the API response parameter link\_url. |
| [Fetch Payment Link Details](/docs/api-reference/payments/latest/payment-links/fetch-payment-link-details) | Use this API to view all details and status of a payment link. |
| [Get Orders for a Payment Link](/docs/api-reference/payments/latest/payment-links/get-orders-for-a-payment-link) | Use this API to view all order details for a payment link. |
| [Cancel Payment Link](/docs/api-reference/payments/latest/payment-links/cancel-payment-link) | Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled. |
### Token vault
Use these APIs to manage saved payment instruments for a customer.
| API | Description |
| :- | :- |
| [Fetch All Saved Instruments](/docs/api-reference/payments/latest/token-vault/fetch-all-saved-card-instrument) | Use this API to get all saved instruments for a customer ID. |
| [Fetch Single Saved Instrument](/docs/api-reference/payments/latest/token-vault/fetch-specific-saved-card-instrument) | Use this API to get specific saved instrument for a customer id and instrument ID. |
| [Delete Saved Instrument](/docs/api-reference/payments/latest/token-vault/delete-saved-card-instrument) | Use this API to delete a saved instrument for a customer id and instrument ID. |
| [Fetch Cryptogram for Saved Instrument](/docs/api-reference/payments/latest/token-vault/fetch-cryptogram-for-a-saved-card-instrument) | Use this API to get the card network token, token expiry and cryptogram for a saved instrument using instrument ID. |
### Reconciliation
Use these APIs to fetch reconciliation reports for settlements and payment gateway transactions.
| API | Description |
| :- | :- |
| [Settlement Reconciliation](/docs/api-reference/payments/latest/settlement-reconciliation/settlement-reconciliation) | Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range. |
| [PG Reconciliation](/docs/api-reference/payments/latest/pg-reconciliation/pg-reconciliation) | Use this API to get the payment gateway reconciliation details with date range. |
# Cancel Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payment-links/cancel-payment-link
openapi/payments/v2026-01-01.yaml post /links/{link_id}/cancel
Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled.
# Create Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payment-links/create-payment-link
openapi/payments/v2026-01-01.yaml post /links
Use this API to create a new payment link. The created payment link url will be available in the API response parameter link_url.
SMS notifications are sent only in the production environment. In the sandbox environment, only email notifications are sent if enabled.
# Fetch Payment Link Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payment-links/fetch-payment-link-details
openapi/payments/v2026-01-01.yaml get /links/{link_id}
Use this API to view all details and status of a payment link.
# Get Orders for a Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payment-links/get-orders-for-a-payment-link
openapi/payments/v2026-01-01.yaml get /links/{link_id}/orders
Use this API to view all order details for a payment link.
# Payment Link Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payment-links/webhooks
Receive Cashfree Payment Link webhook events when customers pay, partially pay, cancel, or expire links, so your backend can update orders automatically.
## Webhook Schema
Payment Link webhook will be triggered when your customer makes a complete or partial payment using the payment link you shared. You will also be notified via the same webhook when the payment link gets cancelled or expired.
```json theme={"dark"}
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Payment for order 10",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9000000000",
"customer_email": "john@gmail.com",
"customer_name": "John "
},
"link_meta": {
"notify_url": "https://ee08e626ecd88c61c85f5c69c0418cb5.m.pipedream.net"
},
"link_url": "https://payments-test.cashfree.com/links//U1mgll3c0e9g",
"link_expiry_time": "2021-11-28T21:46:20",
"link_notes": {
"note_key_1": "note_value_1"
},
"link_auto_reminders": true,
"link_notify": {
"send_sms": true,
"send_email": true
},
"order": {
"order_amount": "22.00",
"order_id": "CFPay_U1mgll3c0e9g_ehdcjjbtckf",
"order_expiry_time": "2021-08-18T07:34:50",
"order_hash": "Gb2gC7z0tILhGbZUIeds",
"transaction_id": 1021206,
"transaction_status": "SUCCESS"
}
},
"type": "PAYMENT_LINK_EVENT",
"version": 1,
"event_time": "2021-08-18T12:55:06+05:30"
}
```
***
## Payload
| Field | Description | Example |
| :- | :- | :- |
| `cf_link_id` | Unique Identifier (generated by Cashfree) for this Link. | 1543566 |
| `link_id` | Unique Identifier (provided by merchant) for the Link. Only for merchant reference. | payment\_1psw |
| `link_status` | Current status of the payment link. Possible values: PAID, PARTIALLY\_PAID, EXPIRED, CANCELLED. | PARTIALLY\_PAID |
| `link_currency` | Default is INR. International currencies are supported. | INR |
| `link_amount` | The amount which merchant wants to collect for the order. | 500.00 |
| `link_amount_paid` | The amount paid by the customer. | 250.00 |
| `link_partial_payments` | Indicates if partial payments are allowed or not. Default value is false. | true |
| `link_minimum_partial_amount` | The minimum amount which must be paid by customer as the first payment. | 200.00 |
| `link_purpose` | A brief description for which payment must be collected. This is shown to the customer. | Payment for order 10 |
| `link_created_at` | Time at which the link was created. | 2021-08-18T07:13:41 |
| `customer_details` | Customer object, it contains customer details. | |
| `customer_name` | Name of the customer | John |
| `customer_phone` | Phone number of the customer | 9000000000 |
| `customer_email` | Email ID of the customer | [john@gmail.com](mailto:john@gmail.com) |
| `notify_url` | Payment notification URL | [https://payment1notify.net](https://payment1notify.net) |
| `link_url` | Payment link URL | [https://website.com/payments](https://website.com/payments) |
| `link_expiry_time` | The date till which the link will be valid, and then it will be expired. Default is 30 days. | 2021-11-28T21:46:20 |
| `link_notes` | Link notes object where you can provide any key-value pairs for your internal reference. | |
| `note_key_1` | | note\_value\_1 |
| `link_auto_reminders` | Default is false. Reminders will be sent to customers based on defined settings. | true |
| `link_notify` | Link notify object, used to notify customers via SMS or an email. | |
| `send_sms` | Default is true. If true, Cashfree will send the link to customer via SMS. | true |
| `send_email` | Default is true. If true and `customer_email` is provided, Cashfree will send the link via Email. | true |
| `order` | Order object, contains the order details. Will be null for cancelled and expired link statuses. | |
| `order_amount` | Order amount that the customer must pay. | 700 |
| `order_id` | The order ID generated. | order\_10 |
| `order_expiry_time` | The date till which the order will be valid. Default is 30 days. | 2021-08-18T07:34:50 |
| `transaction_id` | Transaction ID | id45466ye |
| `transaction_status` | Status of the transaction. Possible values: SUCCESS. | SUCCESS |
| `type` | Type of the webhook. `PAYMENT_LINK_EVENT` | PAYMENT\_LINK\_EVENT |
| `version` | The version of webhook. Build parsing logic with respect to this version. | 1 |
| `event_time` | Time when this webhook was created. | 2021-08-18T12:55:06+05:30 |
***
## Signature generation
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree Payment Gateway secret key along with the payload.
```javascript theme={"dark"}
// The payload here refers to the raw request sent by
// Cashfree to your endpoint. No modifications need to be made to this payload.
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Hello my friend how are you",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9905736722",
"customer_email": "customer@example.com",
"customer_name": "Supal "
},
"link_meta": { ... }
}
}
```
We send the webhook response in a form data format.
# Get Payment by ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/get-payment-by-id
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/payments/{cf_payment_id}
Use this API to view payment details of an order for a payment ID.
## Error codes
The following table lists the error codes you may encounter when retrieving payment details for an order using a payment ID:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `order_id_invalid` | The `order_id` field contains a value in an invalid format. Provide a correctly formatted order ID and try again. Value received: `#INVALID` | `invalid_request_error` | 400 |
| `order_id_missing` | The `order_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `version_missing` | The `version` field is required but was not included in the request header. | `invalid_request_error` | 400 |
| `payment_id_invalid` | The `payment_id` field must be a numeric value. Value received: `INVALID` | `invalid_request_error` | 400 |
| `payment_get_failed` | The `payment_id` value is out of the supported integer range and cannot be processed. Value received: `100000000000000000000000000000000000000` | `invalid_request_error` | 400 |
| `payment_id_missing` | The `payment_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_not_found` | No transaction was found for the specified payment ID. Verify the payment ID and try again. | `invalid_request_error` | 404 |
| `order_not_found` | No order was found for the specified order reference ID. Verify the order ID and try again. | `invalid_request_error` | 404 |
This API allows you to retrieve payment data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Get Payments for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/get-payments-for-an-order
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/payments
Use this API to view all payment details for an order.
This API allows you to retrieve payment data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Order Pay
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/order-pay
openapi/payments/v2026-01-01.yaml post /orders/sessions
Use this API when you have already created the order using [Create Order API](https://www.cashfree.com/docs/api-reference/payments/latest/orders/create) and want Cashfree to process the payment. To use this API S2S flag needs to be enabled from the backend. In case you want to use this API for plain cards payments also, the PCI DSS flag is required, for more information fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1).
**S2S enablement required**: To call the Seamless Payment Creation API, make sure the required S2S flag is enabled for your account. To enable it, submit a request through the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
* **S2S card flag**: To enable card payments, share your PCI DSS compliance certificate through the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
* **Main S2S flag for other payment modes**: To enable seamless payments for modes other than cards, submit a GST return showing an annual turnover of more than Rs. 1 crore. After the document is verified, Cashfree enables the seamless flow.
## Client environment headers
Cashfree requires information about the customer's device environment to enforce NPCI rules. You must include the following headers in your Order Pay API and [Get Eligible Payment Methods](/docs/api-reference/payments/latest/eligibility/get-eligible-payment-methods) request:
| Header | Accepted values | Requirement | Description |
| - | - | - | - |
| `x-client-device` | `mobile`, `desktop`, `tablet` | Required | Type of device used by customer |
| `x-client-os` | `android`, `ios`, `windows`, `macos`, `linux`, `others` | Required | Operating system of customer's device |
| `x-client-rendering-type` | `mweb`, `webview`, `native` | Required when `x-client-device` is mobile | Rendering method used for the checkout experience |
| `x-client-browser` | `safari`, `chrome`, `firefox`, `edge`, `others` | Required | Browser used by the customer |
`x-client-rendering-type` is required only when `x-client-device` is set to mobile. For desktop and tablet devices, this header is optional.
## Error codes
The following table lists the error codes, descriptions, and types you may encounter when initiating a payment:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `channel_missing` | The `channel` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `phone_invalid` | The `phone` field must contain a valid 10-digit Indian phone number (for example, `9090407368`). Value received: `1234567890` | `invalid_request_error` | 400 |
| `phone_missing` | The `phone` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `provider_missing` | The `provider` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `version_missing` | The `version` field must be one of the following supported values: `2021-05-21`, `2022-01-01`, `2022-09-01`, `2023-08-01`, `2025-01-01`, or `2026-01-01`. | `invalid_request_error` | 400 |
| `card_cvv_invalid` | The `card_cvv` field must be at least 3 characters long. Value received: `12` | `invalid_request_error` | 400 |
| `card_cvv_missing` | The `card_cvv` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_invalid` | The `card` field is invalid. Provide payment details using one of the following: card details, `card_alias`, `instrument_id`, or `cryptogram`. | `invalid_request_error` | 400 |
| `bank_processing_failure` | The transaction could not be created at the banking partner. Retry the request or contact support if the issue persists. | `api_error` | 502 |
| `request_invalid` | Cards issued in India cannot be used for transactions where the order currency is non-INR. Value received: `AUD` | `invalid_request_error` | 400 |
| `orderpay_not_found` | The specified order is no longer active and cannot be used to initiate a payment. | `invalid_request_error` | 404 |
| `card_bank_name_missing` | The `card_bank_name` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_bank_name_invalid` | The `card_bank_name` field contains an unrecognised value. Accepted values are: `hdfc`, `icici`, `kotak`, `rbl`, `bob`, `axis`, `standard chartered`, `au`, `yes`, `indus`, `fed`, `hsbc`, `citi`, `sbi`, `amex`, `onecard`, or `idfc`. Value received: `INVALID$BANK` | `invalid_request_error` | 400 |
| `card_expiry_yy_missing` | The `card_expiry_yy` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_expiry_yy_invalid` | The `card_expiry_yy` field must be at least 2 characters long. Value received: `0` | `invalid_request_error` | 400 |
| `card_expiry_mm_missing` | The `card_expiry_mm` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_expiry_mm_invalid` | The `card_expiry_mm` field must be at least 2 characters long. Value received: `0` | `invalid_request_error` | 400 |
| `card_number_invalid` | The `card_number` field contains an invalid card number. Verify the card number and try again. Value received: `INVALID` | `invalid_request_error` | 400 |
| `card_number_missing` | The `card_number` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_not_found` | The card details could not be retrieved. Verify the card information and try again. | `invalid_request_error` | 404 |
| `emi_tenure_missing` | The `emi_tenure` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `order_amount_invalid` | The order amount exceeds the maximum allowed value. The amount must be less than `1,000,000`. | `invalid_request_error` | 400 |
| `netbanking_account_number_invalid` | The `netbanking_account_number` field must be at least 9 characters long. Value received: `test` | `invalid_request_error` | 400 |
| `netbanking_bank_code_invalid` | The `netbanking_bank_code` field contains an invalid value. Provide a supported bank code and try again. | `invalid_request_error` | 400 |
| `netbanking_ifsc_invalid` | The `netbanking_ifsc` field contains an invalid IFSC code. Verify the IFSC and try again. Value received: `INVALID` | `invalid_request_error` | 400 |
| `request_failed` | The selected payment mode is not configured for this account. Enable the payment mode or contact support. | `invalid_request_error` | 400 |
| `currency_invalid` | The `currency` field does not accept `INR` for this request. Use a supported non-INR currency. Value received: `INR` | `invalid_request_error` | 400 |
| `currency_missing` | The `currency` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `risk_data.customer_ip_invalid` | The `risk_data.customer_ip` field contains an invalid IP address. Provide a valid IPv4 or IPv6 address. Value received: `1.1.1` | `invalid_request_error` | 400 |
| `risk_data_ip_address_request_failed` | The IP address could not be resolved. Verify the IP address and try again. | `invalid_request_error` | 400 |
| `order_token_missing` | The `order_token` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_method_invalid` | The `payment_method` field contains an unrecognised value. Provide a valid payment method and try again. | `invalid_request_error` | 400 |
| `payment_method_missing` | The `payment_method` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_method_unsupported` | The specified payment method is not supported for this request. Use a supported payment method and try again. | `invalid_request_error` | 400 |
# Order Pay Authorise Only
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/order-pay-authorise-only
openapi/payments/v2026-01-01.yaml post /orders/sessions/authorize
Use this API when an order has already been created and you want Cashfree to process the payment for authorisation only. To use this API, the 'AUTHORIZE_ONLY' flag must be enabled for your account. Submit [Support Form](https://merchant.cashfree.com/auth/login) to enable this feature.
# Preauthorisation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/preauthorisation
openapi/payments/v2026-01-01.yaml post /orders/{order_id}/authorization
Use this API to capture or void a [pre-authorised](/docs/payments/features/pre-authorisation) payment.
# Submit or Resend OTP
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/submit-or-resend-otp
openapi/payments/v2026-01-01.yaml post /orders/pay/authenticate/{cf_payment_id}
Use this API to submit or resend OTP if you use [Native OTP](https://www.cashfree.com/docs/payments/features/native-otp) for authentication of card payments.
Refer to the sample responses below:
Submit OTP Success and Transaction Successful – 200 OK
```json theme={"dark"}
{
"action": "SUBMIT_OTP",
"authenticate_status": "SUCCESS",
"cf_payment_id": "3991872901",
"payment_message": "payment successful"
}
```
Submit OTP Success but Invalid OTP – 200 OK
```json theme={"dark"}
{
"action": "SUBMIT_OTP",
"authenticate_status": "FAILED",
"cf_payment_id": "5114916442998",
"payment_message": "otp is invalid"
}
```
Max OTP Submit Limit Exceeded – 400 Bad Request
```json theme={"dark"}
{
"message": "Exceeded retry attempts. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "invalid_request_error"
}
```
Transaction Already Completed – 400 Bad Request
```json theme={"dark"}
{
"message": "Transaction is already processed. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "invalid_request_error"
}
```
Invalid Request – 404 Not Found
```json theme={"dark"}
{
"message": "transaction not found. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "payment_not_found",
"type": "invalid_request_error"
}
```
Submit OTP Success but Transaction Failed – 502 Bad Gateway
```json theme={"dark"}
{
"message": "transaction failed",
"code": "bank_processing_failure",
"type": "api_error"
}
```
Submit OTP Success but Transaction Pending – 502 Bad Gateway
```json theme={"dark"}
{
"message": "transaction incomplete",
"code": "bank_processing_failure",
"type": "api_error"
}
```
Resend OTP Success – 200 OK
```json theme={"dark"}
{
"action": "RESEND_OTP",
"authenticate_status": "SUCCESS",
"cf_payment_id": "5114916574918",
"payment_message": "otp sent successfully"
}
```
## Error codes
The following table lists the error codes you may encounter when submitting an OTP:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `action_missing` | The `action` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `cf_payment_id_missing` | The `cf_payment_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
# Payment Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/payments/webhooks
Subscribe to Cashfree webhooks to receive asynchronous events for payment success, failure, refunds, and dispute updates on each order attempt.
Webhooks are server callbacks from Cashfree to your server. Cashfree sends webhooks for the following events for a `payment`:
* Payment success webhook
* Payment failed webhook
* Payment user dropped webhook
* Payment charges webhook
## Webhook signature
The merchant will receive the Webhook signature in the Webhook Header part. Below is a sample header that merchants can expect in the Webhook request. For best practices on securing your webhook endpoints, refer to the [Webhook Security Checklist](/docs/payments/online/webhooks/security-checklist).
| Header name | Header value |
| - | :-: |
| content-length | 1681 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | BUl8l3gElw9rlWUg0u3diRQMDzp1RysuTvxca2J5qOk= |
| x-idempotency-key | A5UkesCnpkM4gGG+RpMLQ9coTGyN56UWXPoQjfYeuII= |
| x-webhook-timestamp | 1785401067911 |
| x-webhook-version | 2026-01-01 |
| Header name | Header value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-idempotency-key | n9rn7079wqXcse3GEDEXCYle9ajXmU0SUQY8zrUNAlc= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
| Header name | Header value |
| - | :-: |
| content-length | 1002 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 0s9zgYXyUYrQaadF5oTYzpxzHmPBMmGDSjbAKZTleL4= |
| x-webhook-timestamp | 1746426425612 |
| x-webhook-version | 2023-08-01 |
Ensure that the webhook payload is received in raw text format. Converting the webhook into a JSON object can lead to automatic transformation of decimal values—such as the payment\_amount—into integers. This alteration (e.g., payment\_amount: 170 instead of payment\_amount: 170.00) can cause a webhook signature mismatch.
**Correct format: payment\_amount: 170.00** ✅ **Incorrect format: payment\_amount: 170** ❌
## Payment success webhook
A payment success webhook triggers when a payment completes successfully. Use this webhook to:
* Update the order status
* Trigger fulfilment
* Send a confirmation to the customer
If you have migrated from Autocollect to PG VBA, use the [2022 version VBA payment webhooks](/docs/payments/vba/webhooks) to receive payment updates for VBA transactions.
```javascript Version (2026-01-01) theme={"dark"}
{
"data": {
"order": {
"order_id": "order_1112353JRZPMsx42lOnAuXiz0vddwovDk",
"order_amount": 1,
"order_currency": "INR",
"order_tags": {
"GST": "364JPAYTM0312",
"Merchant_ID": "123456",
"Merchant_Note": "99month Incl GST for 12 MonthsJPAYTMTJMMO_0003"
},
"order_note": "testing Terminate Order Flow"
},
"payment": {
"cf_payment_id": "1453995084705707520",
"payment_status": "SUCCESS",
"payment_amount": 1,
"payment_currency": "INR",
"payment_message": "Simulated response message",
"payment_time": "2026-09-17T11:47:22+05:30",
"bank_reference": "1453995084705707520",
"auth_id": null,
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3032",
"netbanking_bank_name": "Kotak Mahindra Bank"
}
},
"payment_group": "net_banking",
"international_payment": null,
"payment_surcharge": {
"payment_surcharge_service_charge": 0,
"payment_surcharge_service_tax": 0
}
},
"customer_details": {
"customer_name": "ABC co",
"customer_id": "Customer_123",
"customer_email": null,
"customer_phone": "8971520300"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1453994974886245888",
"gateway_payment_id": "1453995084705707520",
"gateway_status_code": null,
"gateway_order_reference_id": null,
"gateway_settlement": "CASHFREE",
"gateway_reference_name": null
},
"payment_offers": null,
"terminal_details": null
},
"event_time": "2026-09-17T11:47:29+05:30",
"type": "PAYMENT_SUCCESS_WEBHOOK"
}
```
```javascript Version (2025-01-01) theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2025-01-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"rishab@ybl",
"upi_instrument":"UPI_CREDIT_CARD",
"upi_instrument_number":"masked card number",
"upi_payer_ifsc":"SBI0025434",
"upi_payer_account_number":"XXXXX0231"
}
},
"payment_group":"upi",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0.36,
"payment_surcharge_service_tax":0.06
}
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":{
"gateway_name":"CASHFREE",
"gateway_order_id":"1634766330",
"gateway_payment_id":"1504280029",
"gateway_order_reference_id":"abc_124",
"gateway_settlement":"CASHFREE",
"gateway_status_code":null
},
"payment_offers":[
{
"offer_id":"0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type":"DISCOUNT",
"offer_meta":{
"offer_title":"50% off on UPI",
"offer_description":"50% off for testing",
"offer_code":"UPI50",
"offer_start_time":"2022-11-09T06:23:25.972Z",
"offer_end_time":"2025-02-27T18:30:00Z"
},
"offer_redemption":{
"redemption_status":"SUCCESS",
"discount_amount":1,
"cashback_amount":0
}
}
],
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time":"2025-01-15T11:16:10+05:30",
"type":"PAYMENT_SUCCESS_WEBHOOK"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2022-12-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"suhasg6@ybl",
}
},
"payment_group":"upi"
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":{
"gateway_name":"CASHFREE",
"gateway_order_id":"1634766330",
"gateway_payment_id":"1504280029",
"gateway_order_reference_id":"abc_124",
"gateway_settlement":"CASHFREE",
"gateway_status_code":null
},
"payment_offers":[
{
"offer_id":"0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type":"DISCOUNT",
"offer_meta":{
"offer_title":"50% off on UPI",
"offer_description":"50% off for testing",
"offer_code":"UPI50",
"offer_start_time":"2022-11-09T06:23:25.972Z",
"offer_end_time":"2023-02-27T18:30:00Z"
},
"offer_redemption":{
"redemption_status":"SUCCESS",
"discount_amount":1,
"cashback_amount":0
}
}
]
},
"event_time":"2023-08-01T11:16:10+05:30",
"type":"PAYMENT_SUCCESS_WEBHOOK"
}
```
## Payment failed webhook
The payment failed webhook notifies you when a payment attempt fails, and we receive a failed response from the bank. Use case: Update order status, notify customer, initiate retry flow
```javascript Version 2026-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255",
"link_id": "7f0efd36-23f3-4213-95dc-3c32ba1a27e2"
},
"order_note": "Sample Order Note"
},
"payment": {
"cf_payment_id": "1504280029",
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree",
"error_code_raw": null,
"error_description_raw": null,
"error_subcode_raw": "U09"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_settlement": "CASHFREE",
"gateway_order_reference_id": null,
"gateway_reference_name": null,
"gateway_status_code": null
},
"payment_offers": null,
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2023-08-01T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255",
"link_id": "7f0efd36-23f3-4213-95dc-3c32ba1a27e2"
}
},
"payment": {
"cf_payment_id": "1504280029",
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree",
"error_code_raw": null,
"error_description_raw": null,
"error_subcode_raw": "U09"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_settlement": "CASHFREE",
"gateway_order_reference_id": null,
"gateway_reference_name": null,
"gateway_status_code": null
},
"payment_offers": null,
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2023-08-01T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255"
}
},
"payment": {
"cf_payment_id": "1504280029",
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree",
"error_subcode_raw": "U09"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_settlement": "CASHFREE",
"gateway_status_code": null
},
"payment_offers": null
},
"event_time": "2023-08-01T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
## Payment user dropped webhook
The User Dropped Webhook notifies you when your customer abandons the payment flow. It will help you understand if customers attempted to pay or not. Some common scenarios where the transaction will be marked as USER\_DROPPED are:
* User was redirected to the bank's OTP page, but never entered the OTP.
* User was redirected to open the UPI app, but never entered the UPI PIN.
* User was shown the 3ds OTP modal, but did not enter the OTP.
```javascript Version 2026-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null,
"order_note": "Sample Order Note"
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
## Payment charges webhook
A payment charges webhook is triggered after a successful payment when Cashfree finalises the Transaction Discount Rate (TDR) and related charges for that payment. The event time can be later than the payment time. Use this webhook to reconcile per-payment charges and the net settlement amount.
To receive this event, subscribe to **Success Payment TDR** when you [configure webhooks](/docs/payments/online/webhooks/configure) in the Merchant Dashboard. The webhook `type` in the payload is `PAYMENT_CHARGES_WEBHOOK`.
The `payment_method` object in this webhook can be empty (`{}`). This is expected for the payment charges event.
For background on TDR, see [What is TDR?](/docs/help/account/pricing#what-is-tdr).
### `charges_details` fields
| Field | Description | Example |
| - | - | - |
| `service_charge` | Service charge (TDR) applicable for the payment. | `0.12` |
| `service_tax` | Service tax applicable on the service charge. | `0.02` |
| `settlement_amount` | Net amount for the payment after deducting the service charge and service tax. | `5.86` |
| `settlement_currency` | Currency of the settlement amount. | `INR` |
| `service_charge_discount` | Discount applied on the service charge, if any. Returns `null` when no discount applies. | `null` |
```javascript Version 2026-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
## Sample payload by payment method
The instrument used for making a payment will vary by the payment methods used by the customer. Details of the payload by payment method are documented for reference.
```javascript theme={"dark"}
{
...,
"payment_method": {
"card": {
"channel": "link",
"card_number": "XXXXXXXXXXXX4738",
"card_network": "visa",
"card_type": "credit_card",
"card_sub_type": "R",
"card_country": "IN",
"card_bank_name": "HDFC Bank",
"card_network_reference_id": "100212023061200000001014824849",
"instrument_id":"8e9cc167-4fe2-4ece-be8d-c1b224e50a23",
"par": "V0010014623022637739353641436"
}
},
"payment_group": "credit_card",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"netbanking": {
"channel":null,
"netbanking_bank_code":"3022",
"netbanking_bank_name":"ICICI Bank"
}
},
"payment_group":"net_banking",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "rishabtated@ybl",
"upi_instrument" : "UPI_CREDIT_CARD",
"upi_instrument_number" : "masked card number",
"upi_payer_ifsc" : "SBI0025434",
"upi_payer_account_number" : "XXXXX0231"
}
},
"payment_group":"upi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"app": {
"channel":"AmazonPay",
"upi_id":null,
"provider": "AmazonPay"
}
},
"payment_group":"wallet",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"credit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
},
"card_network_reference_id":null
}
},
"payment_group":"credit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"debit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
}
}
},
"payment_group":"debit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"cardless_emi":{
"channel":null,
"provider":"flexmoney",
"phone":"9731117102",
"emi_details":null
}
},
"payment_group":"cardless_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"pay_later":{
"channel":null,
"provider":"olapostpaid",
"phone":"9731117102"
}
},
"payment_group":"pay_later",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"vba_transfer":{
"utr":"MerchantID_utr",
"credit_ref_no":"NA",
"remitter_account":"808081pxqp242614HW",
"remitter_name":"Test",
"remitter_ifsc":"IFSC",
"email":"rishabtated@gmail.com",
"phone":"9999999999",
"vaccount_id":"123499",
"vaccount_number":"94260000123400"
}
},
"payment_group":"vba_transfer",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"bank_transfer":{
"transfer_type":"NEFT",
"bank":"UNION BANK OF INDIA"
}
},
"payment_group":"bank_transfer",
...
}
```
## Webhook FAQs
You can configure webhook URLs for each notification type in your merchant dashboard. To receive notifications, subscribe to specific events, such as PAYMENT\_SUCCESS or PAYMENT\_FAILED. For step-by-step instructions, go through the [official documentation](/docs/payments/online/webhooks/overview).
This may occur if the PAYMENT\_FAILED webhook event is not subscribed. To resolve this, open your dashboard, navigate to the webhook configuration, and ensure that the `PAYMENT_FAILED` event is selected.
This applies to all webhook events. Make sure relevant events are enabled as needed.
Ensure that your endpoint is reachable and returns a 2xx status code. Also, verify that it is properly configured to accept webhook requests.
There could be multiple reasons:
* The webhook URL was not included in the notify\_url parameter during order creation.
* Make sure you have done the webhook configuration for the notification type as needed.
* The endpoint URL is returning a 4xx or 5xx error.
Actions to take:
* Verify that your webhook is correctly configured. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payment Gateway > Developers > Webhook Configuration**.
* Ensure that the endpoint is accessible and able to accept requests from Cashfree.
You can enable or disable specific webhook types directly from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). For detailed instructions, refer to the
**Payment Gateway > Developers > Webhook Configuration** section.
Once the feature is rolled out in Production, the new version will appear in the version drop-down under Webhook Configuration.
If you do not see the new version, the rollout may still be in progress. Please check back later or contact support for assistance.
This may happen if the webhook URL is configured, but no events are selected. Ensure:
* Webhook types are enabled.
* Your endpoint is healthy and accessible to accept the requests from Cashfree.
Duplicate webhook triggers may occur due to misconfiguration or retry logic. This can happen if multiple webhook versions are configured using the same or different endpoint URLs.
✅ Actions to take:
* The Merchant can revisit and delete the duplicate configured endpoint URL. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payment Gateway > Developers > Webhook Configuration**.
Notify URLs are necessary for webhook delivery. Return URLs only redirect the user after the transaction. Ensure you pass both as different URLs, especially if you need server-side notifications.
* Always subscribe to the necessary webhook event types (`SUCCESS`, `FAILED`, `USER_DROPPED`, and **Success Payment TDR** for payment charges).
* Test your webhook integration in Sandbox before going live.
* Use publicly accessible HTTPS URLs that return 200 OK responses.
* Regularly review and update webhook configurations in the merchant dashboard to avoid outdated or incorrect entries.
# PG Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pg-reconciliation/pg-reconciliation
openapi/payments/v2026-01-01.yaml post /recon
- Use this API to get the payment gateway reconciliation details with date range.
- It will have events for your payment account
# Create VBA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/create-vba
openapi/pgvba/pgvba.yaml post /pg/vba
Use this API to create a virtual bank account. It allows you to receive payments just like a regular bank account.
# Create VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/create-vba-notification-group
openapi/pgvba/pgvba.yaml post /pg/vba/notificationgroup
Use this API to create a notification group. The recipients in the group will receive notifications regarding the payment details.
# Edit VBA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/edit-vba
openapi/pgvba/pgvba.yaml put /pg/vba/{virtual_account_id}
Use this API to edit the details of the created virtual bank account.
# Edit VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/edit-vba-notification-group
openapi/pgvba/pgvba.yaml put /pg/vba/notificationgroup/{notification_group_name}
Use this API to edit the details of the created notification group.
# Get VBA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/get-vba
openapi/pgvba/pgvba.yaml get /pg/vba/{virtual_account_id}
Use this API to get the details of the created virtual bank account by entering the virtual account ID.
# Get VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/get-vba-notification-group
openapi/pgvba/pgvba.yaml get /pg/vba/notificationgroup/{notification_group_name}
Use this API to get the details of the created notification group.
# Get VBA Payments
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/get-vba-payments
openapi/pgvba/pgvba.yaml post /pg/vba/payments
Use this API to get all the payment details regarding a virtual bank account.
# Get VBA Payments By UTR
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/get-vba-payments-by-utr
openapi/pgvba/pgvba.yaml get /pg/vba/payments/{utr}
Use this API to get the payment details by entering the unique transaction reference (UTR).
# Manage VBA
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/manage-vba
openapi/pgvba/pgvba.yaml patch /pg/vba/{virtual_account_id}
Use this API to manage the status of the created virtual bank account.
# Manage VBA Notification Group Status
Source: https://www.cashfree.com/docs/api-reference/payments/latest/pgvba/manage-vba-notification-group-status
openapi/pgvba/pgvba.yaml patch /pg/vba/notificationgroup/{notification_group_name}
Use this API to modify the status of the created notification group.
# Vendor Reconciliation API
Source: https://www.cashfree.com/docs/api-reference/payments/latest/reconciliation/vendor-reconciliation-api
openapi/payments/v2026-01-01.yaml post /recon/vendor
This API allows you to fetch vendor reconciliation details by using different filters. Use the appropriate filters based on your requirements. After you receive a VENDOR_SETTLEMENT_SUCCESS webhook confirmation, wait 15 minutes before you call this API endpoint.
- **View Split Order Details Using Settlement ID**: Retrieve details of split orders within a settlement by Settlement ID.
- **Vendor Recon for a Time Period**: Fetch reconciliation details for all vendors within a specific time interval.
- **Vendor Recon Using Vendor ID & Time Interval**: Get reconciliation details for a specific vendor within a given time interval.
**Vendor Recon API usage**
When you use the Vendor Recon API, follow these guidelines:
* Don't call the API with a failed `settlement_id`. If a settlement has failed and the amount remains unsettled, the API returns no data.
* If the amount is later settled under a new (successful) `settlement_id`, the API returns data for the successful settlement instead.
* To retrieve records older than six months, include a date range in your request. Searches using `settlement_id` return data from the last six months only.
# Create Refund
Source: https://www.cashfree.com/docs/api-reference/payments/latest/refunds/create-refund
openapi/payments/v2026-01-01.yaml post /orders/{order_id}/refunds
Use this API to initiate refunds. You can initiate refunds only within six months of the original successful transaction's date and time.
# Get All Refunds for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/latest/refunds/get-all-refunds-for-an-order
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/refunds
Use this API to fetch all refunds processed against an order.
# Get Refund
Source: https://www.cashfree.com/docs/api-reference/payments/latest/refunds/get-refund
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/refunds/{refund_id}
Use this API to fetch a specific refund processed on your Cashfree Account.
# Update Refund
Source: https://www.cashfree.com/docs/api-reference/payments/latest/refunds/update-refund
openapi/payments/v2026-01-01.yaml put /orders/{order_id}/refunds/{refund_id}
Use this API to Update refunds.
# Refund Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/refunds/webhooks
Subscribe to Cashfree refund webhook events for successful refunds, cancelled refunds after retries, and automatic auto-refunds triggered for failed orders.
Webhooks are server callbacks to your server from Cashfree. We send refund webhooks for three different events for a payment.
1. Refund is successfully processed
2. Refund is cancelled by Cashfree - we were unable to successfully refund to customer even after multiple attempts.
3. For successful Auto-refunds - Read more about Auto-Refunds [here](/docs/payments/manage/refunds/overview#auto-refunds)
## Refund webhook payload
```javascript Version 2025-01-01 theme={"dark"}
{
"data":{
"refund":{
"cf_refund_id":11325632,
"cf_payment_id":789727431,
"refund_id":"refund_sampleorder0413",
"order_id":"sampleorder0413",
"refund_amount":2.00,
"refund_currency":"INR",
"entity":"Refund",
"refund_type":"MERCHANT_INITIATED",
"refund_arn":"205907014017",
"refund_status":"SUCCESS",
"status_description":"Refund processed successfully",
"created_at":"2022-02-28T12:54:25+05:30",
"processed_at":"2022-02-28T13:04:27+05:30",
"refund_note":"Test",
"refund_splits":[
{
"merchantVendorId":"sampleID12345",
"amount":1,
"percentage":null
},
{
"merchantVendorId":"otherVendor",
"amount":1,
"percentage":null
}
],
"metadata":null,
"requested_speed":"STANDARD",
"processed_speed":"STANDARD",
"service_charge":0.00,
"service_tax":0.00,
"forex_conversion_handling_charge":null,
"forex_conversion_handling_tax":null,
"forex_conversion_rate":null,
"charges_currency":null
},
terminalDetails:{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time":"2022-02-28T13:04:28+05:30",
"type":"REFUND_STATUS_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data":{
"refund":{
"cf_refund_id":11325632,
"cf_payment_id":789727431,
"refund_id":"refund_sampleorder0413",
"order_id":"sampleorder0413",
"refund_amount":2.00,
"refund_currency":"INR",
"entity":"Refund",
"refund_type":"MERCHANT_INITIATED",
"refund_arn":"205907014017",
"refund_status":"SUCCESS",
"status_description":"Refund processed successfully",
"created_at":"2022-02-28T12:54:25+05:30",
"processed_at":"2022-02-28T13:04:27+05:30",
"refund_note":"Test",
"refund_splits":[
{
"merchantVendorId":"sampleID12345",
"amount":1,
"percentage":null
},
{
"merchantVendorId":"otherVendor",
"amount":1,
"percentage":null
}
],
"metadata":null,
"requested_speed":"STANDARD",
"processed_speed":"STANDARD",
"service_charge":0.00,
"service_tax":0.00
}
},
"event_time":"2022-02-28T13:04:28+05:30",
"type":"REFUND_STATUS_WEBHOOK"
}
```
## Auto refund webhook payload
Auto-refund webhooks differ from standard refund webhooks because they handle refunds that occur automatically (like failed payment attempts) rather than manual refunds tied to specific orders. Since these automatic refunds may happen before an order is created, they don't contain the usual order-related data fields that are mandatory in standard refund webhooks,
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null,
"forex_conversion_handling_charge": null,
"forex_conversion_handling_tax": null,
"forex_conversion_rate": null,
"charges_currency": null
},
terminalDetails:{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
# Submit Risk Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/risk/submit-risk-details
openapi/payments/risk-details.yaml post /risk-details
Use this API to submit comprehensive risk assessment data for an order to Cashfree's risk management system. The API accepts customer details, device information, and industry-specific transaction data for enhanced fraud detection and risk analysis.
# Get All Settlements
Source: https://www.cashfree.com/docs/api-reference/payments/latest/settlement-reconciliation/get-all-settlements
openapi/payments/v2026-01-01.yaml post /settlements
Use this API to get all settlement details by specifying the settlement ID, settlement UTR, settlement status or date range. Returns settlements of all statuses including SUCCESS, PENDING, PENDING_WITH_CASHFREE, PENDING_WITH_BANK and FAILED.
# Settlement Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/settlement-reconciliation/settlement-reconciliation
openapi/payments/v2026-01-01.yaml post /settlement/recon
- Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range.
- This API will return events for the settlement IDs you want
# Get Settlements by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/latest/settlements/get-settlements-by-order-id
openapi/payments/v2026-01-01.yaml get /orders/{order_id}/settlements
Use this API to view the latest linked settlement details for a particular order, including pending and failed settlements.
# Mark Order For Settlement
Source: https://www.cashfree.com/docs/api-reference/payments/latest/settlements/mark-order-for-settlement
openapi/payments/v2026-01-01.yaml post /orders/settlements
Use this API to pass the CBRIKS ID to Cashfree and mark an order for settlement.
This API supports only merchants linked with the National Stock Exchange (NSE) or Bombay Stock Exchange (BSE).
# Settlement Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/latest/settlements/settlement-webhooks
Get notified about Cashfree merchant and vendor settlements via webhooks that fire when payouts to bank accounts are initiated, succeeded, or failed.
We broadly send two types of notifications when a payout happens.
1. Payout to Merchant account
2. Payout to Vendor account (if you are using Easy Split)
## Settlement Webhook
This webhook is triggered whenever there is a payout to your merchant account. The settlement webhooks will notify you about instant settlements in addition to the standard settlement webhooks. We send webhooks for four different events for a `settlement`.
| Webhook event | Description |
| - | - |
| SETTLEMENT\_INITIATED | This webhook will be triggered when a settlement is initiated. |
| SETTLEMENT\_SUCCESS | This webhook will be triggered when a settlement is successful. |
| SETTLEMENT\_FAILED | This webhook will be triggered when a settlement has failed. |
| SETTLEMENT\_REVERSED | This webhook will be triggered when a settlement has been reversed. |
The following webhook is sent for other types of settlements as well: instant settlement or an on-demand settlement.
```javascript 2025-01-01 theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 97.94,
"payment_amount": 100,
"payment_from": "2025-02-14 12:00:00",
"payment_till": "2025-02-14 12:15:00",
"reason": null,
"service_charge": 1.75,
"service_tax": 0.31,
"settled_on": "2025-02-14T12:35:19+05:30",
"settlement_type": "STANDARD", //settlement type //
"settlement_amount": 97.94,
"settlement_id": 738,
"settlement_initiated_on": "2025-02-14T12:35:17+05:30",
"status": "SUCCESS",
"utr": 1644822317781212,
"settlement_charge": 0, // applicable for instant settlement //
"settlement_tax": 0, // applicable for instant settlement //
"remarks": null, // applicable for instant settlement //
"forex_conversion_handling_charge":null,
"forex_conversion_handling_tax":null,
"forex_conversion_rate":null,
"charges_currency":null
}
},
"event_time": "2022-02-08T13:37:34+05:30",
"type": "SETTLEMENT_SUCCESS"
}
```
```javascript 2023-08-01 theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 97.94,
"payment_amount": 100,
"payment_from": "2022-02-14 12:00:00",
"payment_till": "2022-02-14 12:15:00",
"reason": null,
"service_charge": 1.75,
"service_tax": 0.31,
"settled_on": "2022-02-14T12:35:19+05:30",
"settlement_type": "STANDARD", //settlement type //
"settlement_amount": 97.94,
"settlement_id": 738,
"settlement_initiated_on": "2022-02-14T12:35:17+05:30",
"status": "SUCCESS",
"utr": 1644822317781212,
"settlement_charge": 0, // applicable for instant settlement //
"settlement_tax": 0, // applicable for instant settlement //
"remarks": null. // applicable for instant settlement //
}
},
"event_time": "2022-02-08T13:37:34+05:30",
"type": "SETTLEMENT_SUCCESS"
}
```
## Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | Sum of refunds, disputes, and chargebacks included in this settlement. | 0 |
| amount\_settled | Total amount settled in this schedule. | 15 |
| payment\_amount | Total transaction amount considered for settlement. | 15 |
| payment\_from | Start date and time from which payments are considered for settlement. | 2022-02-14 12:00:00 |
| payment\_till | End date and time till which payments are considered for settlement. | 2022-02-23 12:00:00 |
| reason | Reason for failed or reversed settlements. | Transfer mode not valid for beneficiary. |
| service\_charge | Service charges applicable to the payments included in this settlement. | 2 |
| service\_tax | Service tax applicable to the payments included in this settlement. | 0 |
| settled\_on | Date and time when the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_type | Type of settlement (e.g., INSTANT). | INSTANT |
| settlement\_amount | Net settlement amount for the payments included in this settlement. | 13 |
| settlement\_id | Unique settlement ID generated by Cashfree. | 1155353 |
| settlement\_initiated\_on | Date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (INITIATED, SUCCESS, FAILED, or REVERSED). | SUCCESS |
| utr | Unique transaction reference number provided by the bank for the settlement. | N076221079016329 |
| settlement\_charge | Additional charge applicable for instant settlement. | 10.10 |
| settlement\_tax | Settlement tax applicable for instant settlement. | 01.97 |
| remarks | Any remarks specified by the merchant. | Settlement Initiated |
| event\_time | Time when the settlement webhook was triggered. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook event (SETTLEMENT\_INITIATED, SETTLEMENT\_SUCCESS, SETTLEMENT\_FAILED, or SETTLEMENT\_REVERSED). | SETTLEMENT\_SUCCESS |
## Vendor Settlement Webhook
This section only applies to merchants using our Easy Split product
These settlement webhooks automate notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
| Webhook event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
```javascript Vendor Settlement Webhook theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 10,
"payment_amount": null,
"payment_from": "2022-05-26",
"payment_till": "2022-05-26",
"reason": null,
"service_charge": 0.05,
"service_tax": 0.01,
"settled_on": "2022-05-26T15: 06: 14+05: 30",
"settled_orders_count": 2,
"settlement_amount": 10,
"settlement_id": 6151,
"settlement_initiated_on": "2022-05-26T15: 06: 09+05: 30",
"settlement_type": null,
"status": "CREATED",
"utr": null,
"vendor_id": "Vendor_123adj4dr4osn23fn",
"vendor_transaction_amount": 10,
"account_mode": "BANK",
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
},
"event_time": "2022-05-26T15:06:15+05:30",
"type": "VENDOR_SETTLEMENT_INITIATED"
}
}
```
## Transaction wise settlement webhook
This section only applies to merchants using our Transaction Wise Settlement model
These TWS(Transaction Wise Settlement) webhooks are triggered when settlement are initiated, successfully processed, failed, or reversed.
| Webhook event | Description |
| :- | :- |
| TRANSACTION\_WISE\_SETTLEMENT\_INITIATED | This webhook will be triggered when a TWS is initiated. |
| TRANSACTION\_WISE\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a TWS is successful. |
| TRANSACTION\_WISE\_SETTLEMENT\_FAILED | This webhook will be triggered when a TWS has failed. |
| TRANSACTION\_WISE\_SETTLEMENT\_REVERSED | This webhook will be triggered when a TWS has been reversed. |
```javascript Transaction Wise Settlement Webhook theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2022-12-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"suhasg6@ybl",
"upi_instrument":"UPI_CREDIT_CARD",
"upi_instrument_number":"masked card number",
"upi_payer_ifsc":"SBI0025434",
"upi_payer_account_number":"XXXXX0231"
}
},
"payment_group":"upi"
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":null,
"payment_offers":null,
"settlement": {
"settlement_id": "1639789947",
"status": "SUCCESS",
"utr": "1212743972438575",
"payment_amount": 500.00,
"settlement_initiated_on": "2025-03-15T22:21:29+05:30",
"settled_on": "2025-03-15T22:22:30+05:30",
"reason": "Transfer completed successfully",
"adjustment": 0.00,
"settlement_amount": 441.00,
"service_charge": 50.00,
"service_tax": 9.00,
"amount_settled": 441.00,
"payment_from": "2025-03-15T22:21:29+05:30",
"payment_till": "2025-03-15T22:21:29+05:30",
"settlement_type": "NORMAL_SETTLEMENT",
"remarks": null,
"settlement_charge": 0.00,
"settlement_tax": 0.00
}
},
"event_time": "2025-04-10T22:22:06+05:30",
"type": "TRANSACTION_WISE_SETTLEMENT_SUCCESS"
}
}
```
# Fetch Settlement Simulation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/simulation/fetch-settlement-simulation
openapi/payments/v2026-01-01.yaml get /simulate/settlement/{simulation_id}
Use this API to fetch the details of a simulated settlement.
# Fetch Simulation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/simulation/fetch-simulation
openapi/payments/v2026-01-01.yaml get /simulate/{simulation_id}
Use this API to fetch simulated payment details.
# Simulate Payment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/simulation/simulate-payment
openapi/payments/v2026-01-01.yaml post /simulate
Use this API to simulate payment. To use this API you should first create an order using the Create Order API. Also, you need to create a payment with the same order.
# Simulate Settlement Payment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/simulation/simulate-settlement-payment
openapi/payments/v2026-01-01.yaml post /simulate/settlement
Use this API to simulate a settlement in the sandbox environment. First, create a successful order, and then call this API with the order ID to simulate the settlement for that order.
# Easy Split Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/easy-split-overview
Use Cashfree Easy Split to share each order amount across multiple vendors and settle their share automatically when the parent transaction is captured.
Easy Split automates the splitting of payments with vendors and partners on time. Collect payments from customers, and set up a flexible schedule options to disburse payments to your vendors. Get detailed reports on the transactions, settlements, refunds, vendor payments and adjustments.
**How does Easy Split work?**
**You can perform the following tasks using Easy Split:**
* Add and manage all your vendors efficiently
* Split payments and settle them into multiple vendor accounts using the available schedule options cycles
* Check on-demand vendor balance and settle the money into the vendor accounts instantly
* Vendor reconciliation
The table below provides the list of Easy Split APIs along with their description:
**Vendor APIs**
| API name | Description |
| :- | :- |
| [Create Vendor](/docs/api-reference/payments/latest/easy-split/create-vendor) | Create Vendor API creates a new vendor in your Easy Split account. |
| [Update Vendor Details](/docs/api-reference/payments/latest/easy-split/update-vendor-details) | Update Vendor Details API updates the existing vendor details. |
| [Get All Vendor Details](/docs/api-reference/payments/latest/easy-split/get-vendor-all-details) | Get All Vendor Details API gets the details of all the vendors associated with that Easy Split account. |
| [Create On Demand Transfer](/docs/api-reference/payments/latest/easy-split/create-on-demand-transfer) | Create On Demand Transfer API initiates a balance transfer request between merchant and vendor. |
| [Create Refund](/docs/api-reference/payments/latest/refunds/create-refund) | Create Refund API creates a new refund. |
**Split Order APIs**
| API name | Description |
| :- | :- |
| [Create Static Split](/docs/api-reference/payments/latest/easy-split/create-static-split-configuration) | Use this API to create a split at order level. |
| [Split After Payment](/docs/api-reference/payments/latest/easy-split/split-after-payment) | Split After Payment API creates a split after the payment is completed. |
| [Get Split and Settlement Details by Order ID](/docs/api-reference/payments/latest/easy-split/get-split-and-settlement-details-by-orderid) | Get Split and Settlement Details by Order ID API gets details of the split, settled and unsettled transactions of each vendor using the Order ID. |
**Settlement APIs**
| API name | Description |
| :- | :- |
| [Get Vendor Settlement Details](/docs/api-reference/payments/latest/easy-split/get-split-and-settlement-details-by-orderid) | Get Vendor Settlement Details (same endpoint as split-order recon; specify a settlement ID to filter results or leave blank for all) |
**On Demand Settlement APIs**
| API name | Description |
| :- | :- |
| [Get On Demand Balance](/docs/api-reference/payments/latest/easy-split/get-on-demand-balance) | Get On Demand Balance API fetches the available merchant and vendor balances. |
| [Create On Demand Transfer](/docs/api-reference/payments/latest/easy-split/create-on-demand-transfer) | Create On Demand Transfer API initiates a balance transfer request between merchant and vendor. |
**Reconciliation APIs**
| API name | Description |
| :- | :- |
| [Vendor Reconciliation](/docs/api-reference/payments/latest/reconciliation/vendor-reconciliation-api) | Vendor Reconciliation API fetches vendor recon details; supports split-order lookups by settlement ID, time-period queries, and vendor-specific intervals. |
# Easy Split - Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/easy-split-postman-collection
Download the Easy Split Postman collection to explore Cashfree marketplace endpoints for vendor creation, splits, on-demand transfers, and settlements.
Get started quickly with Cashfree's Easy Split APIs by downloading the collection and importing it in Postman.
Download Cashfree Easy Split Postman Collection
Watch the video below to learn how to setup API
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/end-points
Reference base URLs for the Cashfree Easy Split sandbox and production environments along with authentication headers required for every API call.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you can see your AppId and SecretKey.
Cashfree expects the API key to be included in all API requests to the server. Use the endpoint /api/v1/credentials/verify to verify your credentials.
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/vendors/overview
Use Cashfree's Vendor 2.0 APIs to create vendors, update KYC and bank details, upload documents, and fetch vendor status for Easy-Split payouts.
This section consists of the new set of Vendor KYC APIs. Use these APIs to perform actions such as creating a vendor, updating vendor details, get vendor details, upload vendor KYC documents, get all vendor documents and so on.
**Vendors 2.0 APIs**
| API Name | Description |
| :- | :- |
| [Create Vendor v2.0](/docs/api-reference/payments/latest/easy-split/create-vendor) | This API creates a new vendor in Cashfree system. |
| [Update Vendor Details v2.0](/docs/api-reference/payments/latest/easy-split/update-vendor-details) | This API updates the existing vendor details such as name, email, phone number, UPI details, and any of the KYC details. |
| [Get Vendor All Details](/docs/api-reference/payments/latest/easy-split/get-vendor-all-details) | This API fetches all the details of a specific vendor by sharing the vendor ID. |
| [Upload Vendor Docs](/docs/api-reference/payments/latest/easy-split/upload-vendor-docs) | This API uploads the vendor KYC docs. |
| [Get Vendor All Document Status](/docs/api-reference/payments/latest/easy-split/get-vendor-all-documents-status) | This API fetches the submitted vendor KYC document status. |
| [Get Vendor Document Download URL](/docs/api-reference/payments/latest/easy-split/download-vendor-documents) | This API downloads the uploaded KYC documents. Provide the vendor ID and the document type. |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/webhooks/overview
Subscribe to Cashfree Easy Split webhooks to receive event-based notifications about vendor settlements, vendor status changes, and split payment activity.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events happen.
The table below lists the various webhook events:
| Webhook name | Description |
| :- | :- |
| [Vendor Settlement Webhook](/docs/api-reference/payments/latest/split/webhooks/vendor-settlement-webhooks) | Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed. |
| [Vendor Status Change Webhook](/docs/api-reference/payments/latest/split/webhooks/vendor-status-change-webhooks) | Configure vendor status change webhooks to receive automated notifications when vendor status is changed. |
# Vendor Settlement Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/webhooks/vendor-settlement-webhooks
Receive Cashfree vendor settlement webhooks when vendor payouts are initiated, successfully processed, failed, or reversed, so you can keep ledgers in sync.
Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
The webhook notifications are sent on all the URLs added and enabled in the settlement webhook. You can add new URLs and enable or disable existing URLs for settlement webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for settlements.
| Webhook event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
## Vendor settlement initiated
SETTLEMENT\_INITIATED webhook is triggered when a settlement has been initiated by Cashfree.
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "CREATED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_CREATED"
}
```
## Vendor settlement success
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "SUCCESS",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "2023-06-08T15:10:37+05:30",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": 600.00,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "UPI",
"settled_orders_count": 1,
"account_number": null,
"ifsc": null,
"vpa": "9898989898@ybl"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_SUCCESS"
}
```
***
## Vendor settlement failed
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "FAILED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_FAILED"
}
```
***
## Vendor settlement reversed
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "REVERSED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": Failed from bank end,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_REVERSED"
}
```
***
## Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | The sum of refunds, disputes, and chargeback part of this settlement is displayed here. | 0 |
| amount\_settled | The total amount that is settled in this schedule option. | 50 |
| payment\_amount | Total transaction amount considered for settlement. | 100 |
| payment\_from | Start date from which the payments are considered for settlement. | 2022-03-15 |
| payment\_till | End date till which the payments are considered for settlement. | 2022-03-23 |
| reason | Reason for failed and reversed settlements. | Transfer mode is not valid for beneficiary. |
| service\_charge | Service charges are applicable for the payments that are included in this settlement. | 2 |
| service\_tax | Service tax is applicable for the payments that are included in this settlement. | 0.50 |
| settled\_on | Date and time at which the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_amount | The sum of net settlement amount for the payments part of this settlement. | 13 |
| settlement\_id | Cashfree settlement ID | 1155353 |
| settlement\_initiated\_on | The date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (either INITIATED, SUCCESS, FAILED, or REVERSED) | SUCCESS |
| utr | The unique transaction reference number is given by the bank for the settlement. | N076221079016329 |
| vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| vendor\_transaction\_amount | Transaction amount split of vendor | 50 |
| event\_time | Time at which settlement webhook was initiated. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook - VENDOR\_SETTLEMENT\_INITIATED, VENDOR\_SETTLEMENT\_SUCCESS, VENDOR\_SETTLEMENT\_FAILED, or VENDOR\_SETTLEMENT\_REVERSED. | VENDOR\_SETTLEMENT\_SUCCESS |
## Reasons for failed and reversed settlements
| Reason | Category | Description |
| :- | :- | :- |
| BANK\_GATEWAY\_ERROR | Bank | Technical error at the bank |
| BENE\_BANK\_DECLINED | Bank | Rejected by Beneficiary bank due to business reasons |
| FAILED | Bank | No explicit failure reason from the bank |
| INVALID\_IFSC\_FAIL | Customer | Invalid ifsc code provided for bank account |
| INVALID\_ACCOUNT\_FAIL | Customer | Bank account is invalid |
| RETURNED\_FROM\_BENEFICIARY | Bank | Immediate reversal from the beneficiary bank |
| INSUFFICIENT\_BALANCE | Vendor | Your balance is exhausted, need to add funds |
| IMPS\_MODE\_FAIL | Bank | IMPS mode not supported for the beneficiary |
| RTGS\_MODE\_FAIL | Bank | RTGS mode not supported (only for RTGS) |
| REINITIALIZE\_TRANSFER\_LATER | Bank | Technical error at the bank, retry later |
| NRE\_ACCOUNT\_FAIL | Customer | Customer bank account is an NRE account |
| ACCOUNT\_BLOCKED | Customer | Customer bank account is blocked |
| DEST\_LIMIT\_REACHED | Bank | Transfer limit to beneficiary exceeded |
| INVALID\_MODE\_FAIL | Bank | Transfer mode not valid for beneficiary |
| NPCI\_UNAVAILABLE | Bank | NPCI in unavailable |
| BENEFICIARY\_BANK\_OFFLINE | Bank | Beneficiary bank is offline |
| INVALID\_AMOUNT\_FAIL | Vendor | Amount is invalid for the given transfer mode |
| SUSPECTED\_TRANSFER | Customer | Suspicious transfer identified |
| BENE\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| DISABLED\_MODE | Vendor | Transfer mode not enabled for the account |
| AMAZON\_AMOUNT\_EXCEED | Vendor | Amount should be less than 10000 for Amazon Pay mode |
| BENEFICIARY\_BLACKLISTED | Vendor | Beneficiary is blacklisted |
| PAYOUT\_INACTIVE | Vendor | Payout account is not active |
| INVALID\_TRANSFER\_AMOUNT | Vendor | Transfer amount is invalid |
| BENEFICIARY\_NOT\_EXIST | Vendor | Beneficiary does not exist |
| BENEFICIARY\_INVALID\_MODE | Vendor | Mode Not valid for Beneficiary |
| INVALID\_BENE\_ACCOUNT\_OR\_IFSC | Vendor | Invalid bank account number or ifsc provided |
| BENEFICIARY\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| ANY\_OTHER\_REASON | Bank | No reason provided for the failure/reversal |
| INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Customer | Invalid account |
***
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
Watch this video to learn more on Vendor Webhooks:
# Vendor Status Change Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/latest/split/webhooks/vendor-status-change-webhooks
Set up Cashfree vendor status change webhooks to receive automated notifications whenever a vendor in your Easy Split program is activated, blocked, or updated.
Configure vendor status change webhooks to receive automated notifications when vendor status is changed.
The webhook notifications are sent on all the URLs added and enabled in the vendor status change webhook. You can add new URLs and enable or disable existing URLs for vendor status change webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for vendor status change.
| Webhook event | Description |
| :- | :- |
| VENDOR\_STATUS\_UPDATE | This webhook will be triggered whenever there is a change in the status of the vendor. |
# Vendor Status Update
```javascript 2025-01-01 theme={"dark"}
{
"data": {
"merchant_id": 152707,
"merchant_vendor_id": "status002",
"email": "[john.doe@cashfree.com]()",
"updated_status": "ACTION_REQUIRED",
"past_status": "IN_BENE_CREATION",
"account_holder": "JOHN DOE",
"phone": "9876554927",
"name": "BOB HOPE",
"product_type": "PG",
"max_split": 100,
"account_number": null,
"ifsc": null,
"dashboard_access": false,
"vpa": "success@upi",
"account_type": "Individual",
"business_type": "Travel and Hospitality",
"updated_by": "AUTOMATED",
"document_status": {
"PAN": "VERIFIED",
"GSTIN": "DUE_CURRENTLY"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_STATUS_UPDATE"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"merchant_id": 152707,
"merchant_vendor_id": "status002",
"email": "[john.doe@cashfree.com]()",
"updated_status": "ACTION_REQUIRED",
"past_status": "IN_BENE_CREATION",
"account_holder": "JOHN DOE",
"phone": "9876554927",
"name": "BOB HOPE",
"product_type": "PG",
"max_split": 100,
"account_number": null,
"ifsc": null,
"dashboard_access": false,
"vpa": "success@upi",
"account_type": "Individual",
"business_type": "Travel and Hospitality",
"updated_by": "AUTOMATED",
"document_status": {
"PAN": "VERIFIED",
"GSTIN": "DUE_CURRENTLY"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_STATUS_UPDATE"
}
```
***
# Payload Field Description
| Field | Description | Example |
| - | - | - |
| merchant\_id | Cashfree Merchant ID. | 152707 |
| merchant\_vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| email | Email of the vendor. | [test@gmail.com](mailto:test@gmail.com) |
| updated\_status | Current status of the vendor. | ACTIVE |
| past\_status | Previous status of the vendor. | ACTION\_REQUIRED |
| account\_holder | Name of the account holder associated with the vendor. | John Doe |
| phone | Contact phone number of the vendor. | 9876554927 |
| name | Name of the vendor. | BOB HOPE |
| product\_type | Type of product offered to the vendor | PG |
| max\_split | The maximum percentage of the amount shared with a vendor in any order. | 100 |
| account\_number | Vendor's bank account number. | 12345678909 |
| ifsc | IFSC (Indian Financial System Code) associated with the vendor's bank. | SBIN1231935 |
| dashboard\_access | Access level to the dashboard for the vendor (if applicable). | FALSE |
| vpa | VPA of the vendor for UPI transactions. | success\@upi |
| account\_type | Type of the vendor's account. | Individual |
| business\_type | Type of business conducted by the vendor. | Travel and Hospitality |
| updated\_by | Entity or process that initiated the status update. | AUTOMATED |
| document\_status | Status of any associated documents for the vendor. | "PAN": "VERIFIED" "GSTIN": "DUE\_CURRENTLY" |
***
# Signature Verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
Watch this video to learn more on Vendor Webhooks
# Create a Plan
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/create-a-plan
openapi/payments/v2026-01-01.yaml post /plans
A plan allows your customer to identify the features you offer along with your pricing. You can create plans as per the pricing you support for your services. For each plan, you can set a pre-decided frequency and amount with which they’ll be charged.
Example: Netflix Plans : Premium, Basic, Standard, Mobile. Each plan differs and caters for a particular set of audiences.
# Create a Refund
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/create-a-refund
openapi/payments/v2026-01-01.yaml post /subscriptions/{subscription_id}/refunds
This API allows you to create refund on a successful payment. Refund amount can be partial or the full amount of the payment.
# Create Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/create-subscription
openapi/payments/v2026-01-01.yaml post /subscriptions
Use this API to create a new subscription.
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/endpoints
Reference base URLs and authentication headers required to call the Cashfree Subscriptions APIs across the sandbox and production environments.
Cashfree uses API keys to control access to the API. After you sign up on the merchant site, you'll receive your `AppId` and `SecretKey`.
Include your API key in all requests to the server. Use the endpoint **`/api/v1/credentials/verify`** to verify your credentials.
All API responses are in JSON format. POST requests must include the header `Content-Type: application/json`.
| Environment | Base URL |
| - | - |
| Test | `https://sandbox.cashfree.com/pg` |
| Production | `https://api.cashfree.com/pg` |
| Latest version | v6, 2026-01-01 Previous versions: 2025-01-01, 2023-08-01, 2021-05-21, 2022-01-01, 2022-09-01 |
# Error Codes and Reasons
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/error-codes
Reference the most common Cashfree Subscriptions API error codes, their failure reasons, and recommended resolutions to debug mandate and charge issues quickly.
## Error codes
The following are the common error codes returned by the Subscription APIs:
| Error code | Description | Resolution |
| - | - | - |
| `subscription_id_missing` | Subscription ID is required but missing in the request | Ensure the subscription ID is included in your API request |
| `plan_id_missing` | Plan ID is missing, invalid, or not found | Verify the plan ID exists and is correctly specified |
| `payment_id_missing` | Payment ID is missing or not found | Include a valid payment ID in your request |
| `subscription_id_missing_request_failed_failed` | Subscription ID missing; request failed | Add the required subscription ID parameter |
| `invalid_payment_type` | Invalid payment type specified | Use supported payment types: 'E\_MANDATE', 'UPI', or 'CARD' |
| `subscription_does_not_exist` | Subscription doesn't exist for the provided reference ID | Verify the subscription reference ID is correct |
| `authorization_payment_info_mismatch` | Authorisation payment info doesn't match subscription creation info | Ensure payment details match between subscription creation and authorisation |
| `tpv_not_supported` | TPV currently not allowed for Intent and QR auth flow | Use alternative auth flows when TPV is enabled |
## Transaction failure reasons
The following are the detailed failure reasons categorised by their nature:
* [Account issues](#account-issues)
* [Balance and limit issues](#balance-and-limit-issues)
* [Mandate issues](#mandate-issues)
* [Fraud and security](#fraud-and-security)
* [Technical issues](#technical-issues)
* [Customer action required](#customer-action-required)
* [Invalid data and validation](#invalid-data-and-validation)
* [Know your customer and documentation](#know-your-customer-and-documentation)
* [System and processing status](#system-and-processing-status)
* [Notification issues](#notification-issues)
### Account issues
The following are the account-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `ACCOUNT CLOSED` | The account has been closed and all associated mandates were deactivated | Create a new mandate with a different account for the customer |
| `Account Blocked or frozen` | Account is temporarily blocked (for example, KYC not updated) | Customer needs to contact their bank to unblock the account |
| `DEBIT HAS BEEN FAILED \| ACCOUNT DOES NOT EXIST (REMITTER)` | Account verification failed due to incorrect account details | Verify and update correct account information |
| `Not a CBS act no.or old act no.representwithCBS no` | Account given for debit is old/non CBS/wrong/invalid | Use a valid CBS-enabled account number |
| `DEBIT HAS BEEN FAILED \| REMITTER CBS OFFLINE` | Core Banking System is offline | Wait for CBS to come online and retry |
| `U30\|DEBIT HAS BEEN FAILED\|YE\|REMITTING ACCOUNT BLOCKED/FROZEN` | Remitting account is blocked or frozen | Customer should contact their bank to resolve account issues |
### Balance and limit issues
The following are the balance and limit-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Balance Insufficient` | Insufficient funds in customer account | Customer should add funds or retry when balance is available |
| `DEBIT HAS BEEN FAILED \| INSUFFICIENT FUNDS IN CUSTOMER (REMITTER) ACCOUNT` | Insufficient balance in customer account | Recommend customer to maintain sufficient balance before retry |
| `U30\|DEBIT HAS BEEN FAILED\|Z9\|INSUFFICIENT FUNDS IN CUSTOMER (REMITTER) ACCOUNT` | Insufficient funds in remitter account | Customer needs to ensure adequate balance |
| `Amount Exceeds E-mandate Limit` | Transaction amount exceeds the e-mandate limit | Reduce amount or increase mandate limit if supported |
| `DEBIT HAS BEEN FAILED \| PER TRANSACTION LIMIT EXCEEDED AS SET BY REMITTING MEMBER` | Per transaction limit exceeded | Use amount within the set transaction limits |
| `U29\|ADDRESS RESOLUTION IS FAILED\|QL\|MANDATE DEBIT IS BEYOND PSP SPECIFIED AMOUNT CAP` | Amount limit is breached | Ensure amount is within PSP specified limits |
| `DEBIT HAS BEEN FAILED \| MANDATE REQUEST LIMIT HAS BREACHED` | Mandate request limit has been breached | Wait for limit reset or contact support |
| `U30\|DEBIT HAS BEEN FAILED\|QK\|MANDATE REQUEST LIMIT HAS BREACHED` | Mandate request limit exceeded | Review and adjust mandate limits |
| `Not Arranged For` | Bank account isn't set up to facilitate debit transaction | Customer should contact bank to set up debit facility |
### Mandate issues
The following are the mandate-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Invalid UMRN or Inactive Mandate` | Mandate has been deactivated by NPCI or cancelled by customer/merchant | Create a new mandate for the customer |
| `Mandate Cancelled` | Mandate has been cancelled by customer or merchant | Create a new mandate to continue debits |
| `Record Level Error: Invalid Mandate Info` | Mandate cancelled by customer from bank | Create a new mandate with updated information |
| `DEBIT HAS BEEN FAILED \| MANDATE HAS BEEN REVOKED` | Mandate has been revoked | Create a new mandate for the customer |
| `DEBIT HAS BEEN FAILED \| MANDATE SIGNATURE IS TAMPERED OR CORRUPT (REMITTER)` | Mandate signature is corrupted | Customer should contact issuing bank |
| `DUPLICATE MANDATE REQUEST FOR SAME ITEM` | Duplicate mandate request submitted | Avoid duplicate requests or check existing mandates |
| `Mandate Qr tampered` | Mandate QR code has been tampered with | Generate a new mandate with fresh QR code |
| `U29\|ADDRESS RESOLUTION IS FAILED\|QB\|MANDATE IS ALREADY HONOURED` | Duplicate transaction attempt | Ensure transaction isn't a duplicate of a previously successful one |
| `Invalid frequency` | Invalid frequency specified for LOAN category | Use appropriate frequency as per NPCI guidelines |
### Fraud and security
The following are the fraud and security-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `DEBIT HAS BEEN FAILED \| SUSPECTED FRAUD` | Transaction flagged as suspected fraud | Customer should contact their bank for clearance |
| `U30\|DEBIT HAS BEEN FAILED\|K1\|SUSPECTED FRAUD, DECLINE / TRANSACTIONS DECLINED BASED ON RISK SCORE BY REMITTER` | Risk-based decline by remitter bank | Customer may retry or contact bank |
| `ADDRESS RESOLUTION IS FAILED \| TRANSACTION CANNOT BE COMPLETED. COMPLIANCE VIOLATION (REMITTER)` | Compliance violation detected | Ensure transaction complies with regulatory requirements |
| `DEBIT HAS BEEN FAILED \| DO NOT HONOUR (REMITTER)` | Debit transaction rejected by issuing bank | Customer should contact their bank |
### Technical issues
The following are the technical error codes:
| Error | Description | Resolution |
| - | - | - |
| `REMITTER BANK NOT AVAILABLE` | Remitter bank system is unavailable | Retry the transaction after some time |
| `DEBIT TIMEOUT \| REMITTER/ISSUER UNAVAILABLE (TIMEOUT)` | Bank system timeout occurred | Retry the transaction when bank systems are stable |
| `U67\|DEBIT TIMEOUT\|UT\|REMITTER/ISSUER UNAVAILABLE (TIMEOUT)` | Timeout from remitter or issuer | Retry during stable network conditions |
| `REMITTER BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | Bank system experiencing high traffic or technical issues | Retry during off-peak hours |
| `U90\|REMITTER BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | High response time from remitter bank | Retry when bank systems are more responsive |
| `U91\|BENEFICIARY BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | Beneficiary bank system issues | Retry when bank systems are stable |
| `No response received from bank within the prescribed API time limit` | Bank API timeout | Retry the transaction |
| `ADD_RESLN_DISPATCH_FAILED` | Address resolution dispatch failure | Contact support for technical assistance |
### Customer action required
The following are the error codes that require customer action:
| Error | Description | Resolution |
| - | - | - |
| `No action performed by customer` | Customer didn't complete the authorisation process | Customer needs to complete the payment flow |
| `COLLECT EXPIRED` | Customer didn't complete auth after entering VPA | Customer should complete the transaction within time limit |
| `RESPMANDATE TIMEOUT AT REMITTER END` | Customer didn't honour the mandate within time | Customer should respond to mandate requests |
| `RESPMANDATE DECLINED BY REMITTER BANK` | Remitter bank declined the mandate | Customer should contact their bank |
| `RESPAUTHMANDATE EXPIRED` | No action performed on collect request and it expired | Customer should complete authorisation within time limit |
| `RESPAUTHMANDATE DECLINED BY PSP` | PSP declined the authorisation mandate | Contact support for assistance |
| `Transaction Open Status` | Customer closed transaction page before completion or retried failed transaction | Complete the transaction without closing the page |
| `No Details available for Requested MandateReqID` | Customer cancelled mandate before reaching NPCI page | Reinitiate the mandate creation process |
### Invalid data and validation
The following are the data validation error codes:
| Error | Description | Resolution |
| - | - | - |
| `U29\|ADDRESS RESOLUTION IS FAILED\|ZH\|INVALID VIRTUAL ADDRESS` | Invalid VPA used in transaction | Use a valid and verified VPA |
| `ADDRESS RESOLUTION IS FAILED \| INVALID VIRTUAL ADDRESS` | Invalid Virtual Address during VPA validation | Verify and use correct VPA |
| `DEBIT HAS BEEN FAILED \| INVALID TRANSACTION OR IF MEMBER IS NOT ABLE TO FIND ANY APPROPRIATE RESPONSE CODE (REMITTER)` | Invalid transaction or unrecognised response | Retry with valid transaction details |
| `U30\|DEBIT HAS BEEN FAILED\|XB\|INVALID TRANSACTION OR IF MEMBER IS NOT ABLE TO FIND ANY APPROPRIATE RESPONSE CODE (REMITTER)` | Invalid transaction from remitter | Verify transaction details and retry |
| `DEBIT HAS BEEN FAILED \| INVALID RESPONSE CODE` | Invalid response received from bank | Retry the transaction |
| `U30\|DEBIT HAS BEEN FAILED\|XD\|INVALID AMOUNT (REMITTER)` | Invalid amount specified | Use valid amount format and value |
| `DEBIT HAS BEEN FAILED \| RegIdDetails must be present` | Required registration details missing | Ensure all required details are provided |
| `U30\|DEBIT HAS BEEN FAILED\|V1\|RegIdDetails must be present` | Registration details missing | Include all required registration information |
| `DEBIT HAS BEEN FAILED \| Id name must be present` | Required ID name field missing | Include the ID name field in the request |
### Know your customer and documentation
The following are the KYC and documentation-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Aadhaar number does not have mobile number registered with uidai` | Mobile number not linked with Aadhaar | Customer should link mobile number with Aadhaar |
| `Payer Account Validation Failure` | TPV verification failed | Ensure correct account details for TPV verification |
### System and processing status
The following are the system and processing status error codes:
| Error | Description | Resolution |
| - | - | - |
| `Internal Payment Failed` | Internal system error during payment processing | Retry the transaction or contact support |
| `Charge couldn't happen on time` | Previous charge was in progress, preventing next charge | Wait for previous charge to complete |
| `Previous request in progress` | Previous request for same action is still being processed | Wait for previous request to complete before retrying |
| `debit has been failed` | Bank didn't send any failure reason | Check with bank for specific failure details |
### Notification issues
The following are the notification-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Notification couldn't be sent to the customer` | Pre-debit notification failed to send | Ensure customer contact details are correct |
| `DEBIT HAS BEEN FAILED \| Unable to Notify the Customer` | Pre-debit notification delivery failed | Update customer contact information |
## Error response structure
Subscription API errors follow this structure:
```json theme={"dark"}
{
"status": "ERROR",
"subCode": "400",
"message": "Error description",
"reason": "Detailed error reason"
}
```
## Best practices for error handling
The following are the recommended practices for handling subscription errors:
**Implement retry logic**:
* For timeout and temporary errors, implement exponential backoff retry logic.
* Start with a 1-second delay, double the delay for each subsequent retry.
* Use a maximum of 3-5 retry attempts.
* Apply different retry strategies for different error types.
**Customer communication**:
* Provide clear, actionable error messages to customers.
* Include specific steps they need to take for resolution.
* Avoid technical jargon in customer-facing messages.
**Mandate management**:
* Monitor mandate status.
* Proactively create new mandates when existing ones are cancelled or expired.
* Implement mandate renewal work flows before expiration.
**Balance monitoring**:
* Advise customers to maintain sufficient balance before scheduled debits.
* Send pre-debit notifications to remind customers.
* Implement balance check APIs where available.
**Error logging and monitoring**:
* Log all errors with timestamps and request details.
* Set up alerts for critical error patterns.
* Analyse error trends to identify systemic issues.
**Graceful degradation**:
* Provide alternative payment methods when subscription payment fails.
* Implement fallback mechanisms for critical payment flows.
* Maintain service availability despite individual payment failures.
**Security considerations**:
* Handle fraud-related errors with additional verification steps.
* Implement risk scoring for suspicious transaction patterns.
* Maintain compliance with regulatory requirements.
For additional API error codes and web hook error structures, refer to the [Payment Errors documentation](/docs/api-reference/payments/errors).
# Fetch Details of a Refund
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/fetch-details-of-a-refund
openapi/payments/v2026-01-01.yaml get /subscriptions/{subscription_id}/refunds/{refund_id}
Use this API to fetch details of a refund of a subscription payment.
# Fetch Details of a Single Payment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/fetch-details-of-a-single-payment
openapi/payments/v2026-01-01.yaml get /subscriptions/{subscription_id}/payments/{payment_id}
Use this API to fetch details of a single payment of a subscription.
# Fetch Details of All Payments of a Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/fetch-details-of-all-payments-of-a-subscription
openapi/payments/v2026-01-01.yaml get /subscriptions/{subscription_id}/payments
Use this API to fetch all payments of a subscription.
# Fetch Plan
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/fetch-plan
openapi/payments/v2026-01-01.yaml get /plans/{plan_id}
Use this API to fetch plan details.
# Fetch Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/fetch-subscription
openapi/payments/v2026-01-01.yaml get /subscriptions/{subscription_id}
Use this API to fetch subscription details.
# Generate Transaction Return Summary
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/generate-transaction-return-summary
openapi/payments/v2026-01-01.yaml post /subscriptions/charge/{payment_id}/transaction-return-summary/generate
Use this API to generate transaction return summary for failed transactions (insufficient balance).
# Get All the Payment Method Details Available for Subscription Payments
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/get-all-the-payment-method-details-available-for-subscription-payments
openapi/payments/v2026-01-01.yaml post /subscriptions/eligibility/payment_methods
Use this API to check if a payment method is enabled for your account.
# Manage a Single Payment
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/manage-a-single-payment
openapi/payments/v2026-01-01.yaml post /subscriptions/{subscription_id}/payments/{payment_id}/manage
Use this API to manage a payment of a subscription. A payment can be cancelled or retried with this API.
# Manage Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/manage-subscription
openapi/payments/v2026-01-01.yaml post /subscriptions/{subscription_id}/manage
Use this API to manage subscriptions. You can cancel, pause, activate, or change the plan associated with a subscription.
To update the recurring amount for a periodic subscription: 1. Create a new plan with the revised amount. 2. Use the Manage Subscription API to associate the subscription with the new plan. 3. Include the `CHANGE_PLAN` action and the new `plan_id` in the request body.
* Customers won't be notified about plan changes. The charge amount can't exceed the maximum amount defined in the original plan.
* The `CHANGE_PLAN` and `PAUSE` actions aren't supported for On-Demand Subscriptions.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/overview
Use the Cashfree Subscriptions APIs to manage recurring payments, mandate authorisation, charge schedules, and payment instruments at scale across India.
The Subscription APIs provide RESTful endpoints for managing recurring payments, customer mandates, and automated billing schedules. These APIs support both sandbox testing and production environments with consistent authentication and error handling across all endpoints. Real-time webhooks ensure seamless integration for subscription lifecycle events, payment notifications, and mandate status updates.
## API endpoints
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Latest version | v6, 2026-01-01 The previous versions were 2025-01-01, 2023-08-01, 2021-05-21, 2022-01-01, and 2022-09-01 |
## Authentication
All Subscription APIs require authentication. Refer to the [Authentication](/docs/api-reference/authentication) guide for detailed information on API authentication for merchants and partners.
## Subscription APIs
Retrieve refund details and status using refund ID or payment ID.
## Supported payment methods
Cashfree Subscriptions supports the following payment methods for recurring payments:
* **Bank account (e-Mandate)**: Net banking, debit card, or Aadhaar-based authorisation with up to ₹1,00,00,000 mandate amount
* **Bank account (Physical mandate)**: Signature-based NACH mandate for accounts without digital access
* **UPI Autopay**: Recurring payments via UPI applications with ₹15,000-₹1,00,000 limits based on authentication
* **Standing Instructions (SI) on cards**: Credit or debit cards (Indian and International) with flexible amount limits
For detailed payment method information, refer to the [Supported Payment Methods](/docs/payments/subscription/payment-modes) guide.
## Getting started
Complete the following steps to set up subscriptions using Cashfree APIs:
1. **Create a Plan** (optional): Define your subscription terms including billing frequency and amount
2. **Create a Subscription**: Set up a mandate with customer details and payment method
3. **Customer Authorisation**: Customer authorises the recurring payment through their chosen method
4. **Raise Payments**: Initiate recurring charges as per the subscription schedule
5. **Manage Subscriptions**: Update subscription status, handle payment retries, and process refunds
For a comprehensive integration guide, visit the [Subscription Introduction](/docs/payments/subscription/introduction) page.
# Create Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-execution
openapi/payments/v2026-01-01.yaml post /subscriptions/pay/controlled/execute-mandate
Use this API to create a controlled charge execution for an on-demand subscription mandate after a successful notification.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.The debit amount cannot change after the pre-debit notification (PDN) is initiated. If the executed debit amount differs from the amount notified in the PDN, the transaction is declined by the issuing bank due to the amount-match logic enforced at the issuing bank.
# Create Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-notification
openapi/payments/v2026-01-01.yaml post /subscriptions/pay/controlled/notify-mandate
Use this API to initiate a controlled payment notification (PDN) for an on-demand subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-execution
openapi/payments/v2026-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}
Use this API to fetch the details of a controlled execution for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Executions
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-executions
openapi/payments/v2026-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions
Use this API to fetch all controlled payment executions for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notification
openapi/payments/v2026-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}
Use this API to fetch the details of a controlled payment notification for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Notifications
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notifications
openapi/payments/v2026-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications
Use this API to fetch all controlled payment notifications for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Controlled Subscription Payments
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/payment/controlled/overview
Drive pre-debit notification and charge execution yourself with the controlled subscription payment APIs for UPI Autopay and card mandates.
v2026-01-01 introduces a controlled payment flow for UPI Autopay and card mandate subscriptions, giving you explicit control over when to notify your customers and when to execute the debit. This is a significant change if you need to comply with pre-debit notification rules for UPI Autopay and card mandates.
The controlled flow supports UPI Autopay and card mandates. eNACH and Physical NACH (PNACH) mandates are not supported.
## How it works
The controlled flow replaces the automatic charge trigger with a two-step process you drive:
1. **Send a pre-debit notification**: Notify your customer of the upcoming charge amount before the debit window opens.
2. **Execute the charge**: Trigger the mandate debit after the compliance window elapses. The debit amount must exactly match the notified amount; a mismatch causes the issuing bank to decline the transaction.
Controlled charging is a two-step flow in which you send the pre-debit notification and trigger the debit. Cashfree does not automatically retry a failed attempt. You must trigger each attempt yourself.
## API endpoints
The following endpoints support the controlled notification and execution flow:
| API | Method | Description |
| - | - | - |
| [Create Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-notification) | `POST /subscriptions/pay/controlled/notify-mandate` | Send a pre-debit notification to the customer |
| [Fetch Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notification) | `GET /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}` | Retrieve a single notification |
| [Fetch All Controlled Notifications](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notifications) | `GET /subscriptions/payments/{payment_id}/controlled/notifications` | List all notifications for a payment |
| [Create Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-execution) | `POST /subscriptions/pay/controlled/execute-mandate` | Trigger the mandate debit after the notification window |
| [Fetch Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-execution) | `GET /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}` | Retrieve a single execution |
| [Fetch All Controlled Executions](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-executions) | `GET /subscriptions/payments/{payment_id}/controlled/executions` | List all execution attempts for a payment |
For UPI Autopay mandates, NPCI enforces blackout windows during which attempts are rejected. When this happens, the error response tells you the next permitted timestamp. Use this timestamp to schedule your next attempt instead of retrying immediately.
## Webhooks
Subscribe to both events rather than polling:
* `SUBSCRIPTION_PAYMENT_CONTROLLED_NOTIFICATION_STATUS`: A notification attempt reached a terminal state.
* `SUBSCRIPTION_PAYMENT_CONTROLLED_EXECUTION_STATUS`: A charge attempt reached a terminal state.
# Physical Mandates
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/physical-mandates
Use Cashfree Subscriptions Physical Mandate APIs to authorise customers with only signature and bank details, without a debit card or netbanking.
Physical mandate is the process of authorisation where the customer requires only their signature and bank account details. There is no requirement to have a Debit Card or Netbanking enabled to set up the mandate. Read more about [Physical Mandates](/docs/payments/subscription/payment-modes#bank-account-physical-mandate).
List of Physical Mandates APIs
| API name | Description |
| :- | :- |
| [Create Subscription API](/docs/api-reference/payments/latest/subscription/create-subscription) | Use this API to create a subscription by providing a custom payment experience to your customers by specifying the plan ID and the customer details. You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. Make sure to choose the payment mode as PNACH to enable Physical NACH flow. TPV is applicable only for eNACH and UPI. |
| [Create an Auth API](/docs/api-reference/payments/latest/subscription/raise-a-charge-or-create-an-auth) | Use this API to create an authorisation request for your customer. For Physical mandates (PNACH), you must include the payment\_method with "pnach" details in the request payload. Upon creation, the authorisation status will be set to "DOCUMENT\_PENDING". To move the status to "INITIALIZED", use the Upload File API to upload the required documents. |
| [Upload File](/docs/api-reference/payments/latest/subscription/upload-file-for-physical-nach-authorisation) | Use this API to upload the Physical Nach registration forms that contain your customer’s bank account details and signature. Use the paymentId you get in the response in the "Create Auth API" and set action as "SUBMIT\_DOCUMENT". |
| [Simulate Payment api](/docs/api-reference/payments/latest/simulation/simulate-payment) | Use this API to update the authorisation status from INITIALIZED to either SUCCESS or FAILED. You must provide the payment\_id (obtained from the upload file API) along with the desired payment status. This functionality is available only in the test environment. |
# Raise a Charge or Create an Auth
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/raise-a-charge-or-create-an-auth
openapi/payments/v2026-01-01.yaml post /subscriptions/pay
Use this API to create an auth or to raise a charge.
In the sandbox environment, authorisation-related responses for eNACH, card, and UPI differ from those in production.UPI AutoPay Collect flow for recurring mandates is being deprecated across desktop and Android as per NPCI guidelines. To ensure uninterrupted payment acceptance, merchants are advised to migrate to UPI AutoPay Intent and UPI AutoPay QR flows. For integration changes and more details, refer to the [UPI AutoPay Collect Deprecation](/docs/payments/manage/payment-methods/upi-collect) document.
You must generate the URL in production by concatenating it with the payload data in JSON format. The following are example responses for all Seamless Auth modes in the production environment.
```
{
"action": "custom",
"cf_payment_id": "39394805",
"channel": "link",
"data": {
"url": "https://centinelapi.cardinalcommerce.com/V2/Cruise/StepUp",
"payload": {
"JWT": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI4MjcxZmJlMS1mOTU5LTQwMTgtOTc1OC01MzZkMWRkNzM2NjIiLCJpYXQiOjE3NDc2NDI4NjIsImlzcyI6IjYxNDIwNjg4OTMzODI1Njc1MDg0ZGI2ZiIsImV4cCI6MTc0NzY0NjQ2MiwiT3JnVW5pdElkIjoiNjRkNjA3ZGFmZjUzNDk2MWYxNjk0YWZjIiwiUGF5bG9hZCI6eyJBQ1NVcmwiOiJodHRwczovL3NlY3VyZWljaWNpLWNyMS5pY2ljaWJhbmsuY29tL3YxL2Fjcy9zZXJ2aWNlcy9icm93c2VyL2NyZXEvTC84MTEyLzMzNzAxNTBlLTM0OGEtMTFmMC05NTliLTJiYjZmODk2ZjIzOCIsIlBheWxvYWQiOiJleUp0WlhOellXZGxWSGx3WlNJNklrTlNaWEVpTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1pNHdJaXdpZEdoeVpXVkVVMU5sY25abGNsUnlZVzV6U1VRaU9pSTRZV1ZtT1RCaU15MW1ZakU0TFRRME5qa3RPREF3TVMwMk1tVm1ZakEwWW1RMk56TWlMQ0poWTNOVWNtRnVjMGxFSWpvaU16TTNNREUxTUdVdE16UTRZUzB4TVdZd0xUazFPV0l0TW1KaU5tWTRPVFptTWpNNElpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBeUluMCIsIlRyYW5zYWN0aW9uSWQiOiJUNGVtNEdidnBubGwzQWViakNKMSJ9LCJPYmplY3RpZnlQYXlsb2FkIjp0cnVlLCJSZXR1cm5VcmwiOiJodHRwczovL3d3dy5jYXNoZnJlZS5jb20vc3Vic2NyaXB0aW9uL2NhcmRfcmV0dXJuLzE1MTk5NzA3P3NiY2RhdGE9bHM5SmlOMUl6VUlKaU9pY0diaEpDTGlRMVZLSmlPaUFYZTBKeWUualY5MTNOd2NUTzVFVE54b2pJa2xFYTBWWFlpc25PaXdrVVY5bFRTVkZWRkoxWEhCMVhJUlZWQkp5ZS5CM2txOWhMeXdvY2hlV1U3QV9yT2tmQ2tTVl9TUEw3NzZxcl9mVHY2RG85MmwifQ.BeWYE8vslkOLZVWJd4mJ4MU1eu682fpp2Va7IvzdL9U",
"MD": "3881717951"
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 1,
"payment_currency": "INR",
"payment_id": "test12343234887",
"payment_method": "card",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "jd-rupay-test106"
}
```
```
{
"action": "custom",
"cf_payment_id": "39394843",
"channel": "link",
"data": {
"url": "https://enach.npci.org.in/onmags/sendRequest",
"payload": {
"AuthMode": "NetBanking",
"BankID": "ICIC",
"CheckSumVal": "Ril5otPjBl/Y44z3a0HAsSce2NlDqO1iEpP3pIBuKGYJplXVLuIQ1azxNB2aSJkx7...",
"MandateReqDoc": "..."
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 1,
"payment_currency": "INR",
"payment_id": "test12343234888",
"payment_method": "enach",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "jd-enach-test107"
}
```
```
{
"action": "custom",
"cf_payment_id": "40756575",
"channel": "link",
"data": {
"url": "https://payments.cashfree.com/subscriptions/checkout/timer",
"payload": {
"paymentType": "UPI",
"upiIntentData": {
"androidAuthAppLinks": {
"AMAZONPAY": "intent://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=in.amazon.mShop.android.shopping;end",
"BHIM": "intent://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=in.org.npci.upiapp;end",
"DEFAULT": "upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"GPAY": "gpay://upi/mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=com.google.android.apps.nbu.paisa.user;end",
"PAYTM": "paytmmp://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=net.one97.paytm;end",
"PHONEPE": "phonepe://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=com.phonepe.app;end"
},
"iosAuthAppLinks": {
"BHIM": "bhim://upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"GPAY": "tez://upi/mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"PAYTM": "paytmmp://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"PHONEPE": "phonepe://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00"
}
}
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 10,
"payment_id": "PAY-1749025491584-4289ae9a",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "custom",
"cf_payment_id": "40756761",
"channel": "collect",
"data": {
"url": "https://payments.cashfree.com/subscriptions/checkout/timer",
"payload": {
"paymentType": "UPI"
},
"content_type": "application/json",
"method": ""
},
"payment_amount": 10,
"payment_id": "PAY-1749025606422-791be52e",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "custom",
"cf_payment_id": "40757018",
"channel": "qrcode",
"data": {
"url": "",
"payload": {
"paymentType": "UPI",
"qrData": "upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413592105685824&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00"
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 10,
"payment_id": "PAY-1749025760541-4c158190",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "post",
"cf_payment_id": "47720375",
"channel": "post",
"data": {
"url": "https://api.cashfree.com/pg/view/gateway/subscriptions/testkriti12upi12ANUG5689TFVNB357123",
"payload": null,
"content_type": "",
"method": null
},
"payment_amount": 0,
"payment_currency": "INR",
"payment_id": "PAY-1749025760541-4c158190",
"payment_method": "pnach",
"payment_status": "PENDING",
"payment_tags": null,
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/rate-limits
Reference the per-minute rate limits applied to the Cashfree Subscriptions APIs and learn how to handle throttling for create, charge, and management endpoints.
The rate limit value shows the number of API calls that were made in a minute. For example, if the rate limit is 400 - it means you can call a maximum of 400 API calls in a minute.
**Rate Limits in Sandbox & Production:**\
We use rate limiting for all endpoints. Rate limiting is based on your IP and your account Id. By default, the following rate limits are applied per minute.
| API | Rate limit value per minute | Rate limit type |
| :- | :- | :- |
| [Create Plan](/docs/api-reference/payments/latest/subscription/create-a-plan) | 60 | Account |
| [Create Subscription](/docs/api-reference/payments/latest/subscription/create-subscription) | 60 | Account |
| [Create Seamless Subscription](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | 60 | Account |
| [Get Subscription Details](/docs/api-reference/payments/latest/subscription/fetch-subscription) | 60 | Account |
| [Get All Subscription Payments](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-subscription-payments) | 60 | Account |
| [Get Single Subscription Payment](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-single-subscription-payment) | 60 | Account |
| [Cancel Charge](/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription) | 60 | Account |
| [Charge Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/charge-subscription) | 60 | Account |
| [Charge Retry](/docs/api-reference/payments/previous/subscriptionsv1/subscription/retry-subscription-charge) | 60 | Account |
| [Activate Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/activate-subscription) | 60 | Account |
| [Get Payment Details using Merchant Txn ID](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-payment-by-merchant-transaction-id) | 60 | Account |
| [Update Recurring-amount](/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-recurring-amount) | 60 | Account |
# Redirection Payload After Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/redirection-payload-after-authorization
Understand the POST parameters Cashfree sends to your subscription return URL after the customer authorises a mandate, covering status confirmation and flow finalisation.
## Parameters
The POST request to the return URL includes the following parameters:
| Parameter | Type | Description |
| - | - | - |
| cf\_subReferenceId | Long | Unique numeric ID generated when the subscription was created. |
| cf\_subscriptionId | String | ID of the subscription. |
| cf\_authAmount | Float | The amount charged to authorise the subscription. |
| cf\_referenceId | Long | The reference ID or transaction ID of authorisation in PG. |
| cf\_status | String | Status of the subscription. In the returnUrl, the response should be `ACTIVE` or `BANK_APPROVAL_PENDING` if the authorisation was successful, or `INITIALIZED` if the authorisation failed. |
| cf\_message | String | A brief note about the payment. |
| signature | String | The hash of all parameters in the request generated using Secret Key. |
| cf\_umrn | String | The unique identifier associated with a mandate. Applicable if the payment mode is eMandate. |
| cf\_checkoutStatus | String | The subscription checkout status. The status can be `SUCCESS`, `FAILED`, `SUCCESS_DEBIT_PENDING`, or `SUCCESS_TOKENIZATION_PENDING`. |
| cf\_mode | String | The checkout payment mode. Modes: `NPCI_SBC`, `SBC_UPI`, `SBC_CREDIT_CARD`, `SBC_DEBIT_CARD`. |
| cf\_subscriptionPaymentId | String | The subscription payment ID. |
| cf\_umn | String | The unique identifier associated with a mandate. Applicable if the payment mode is **UPI**. |
## Sample Payload
Once the authorisation is complete, Cashfree will send a POST request to your `return_url` with the following payload:
```json theme={"dark"}
{
"cf_subReferenceId": 1234567,
"cf_subscriptionId": "sub_test_123",
"cf_authAmount": 1.00,
"cf_referenceId": 987654321,
"cf_status": "ACTIVE",
"cf_message": "Subscription authorised successfully",
"signature": "calculated_signature_here",
"cf_umrn": "UMRN1234567890",
"cf_checkoutStatus": "SUCCESS",
"cf_mode": "SBC_UPI",
"cf_subscriptionPaymentId": "pay_test_123",
"cf_umn": "UMN1234567890"
}
```
## Sample Code
Below are examples of how to receive and process the redirection payload in your backend.
```javascript Node.js theme={"dark"}
const express = require('express');
const app = express();
// Middleware to parse POST bodies
app.use(express.urlencoded({ extended: true }));
app.post('/return-url', (req, res) => {
const payload = req.body;
console.log('Received Redirection Payload:', payload);
const status = payload.cf_status;
if (status === 'ACTIVE' || status === 'BANK_APPROVAL_PENDING') {
// Handle success
res.send('Subscription Authorised Successfully');
} else {
// Handle failure
res.send('Authorization Failed');
}
});
```
```python Python theme={"dark"}
from flask import Flask, request
app = Flask(__name__)
@app.route('/return-url', methods=['POST'])
def return_url():
# Capture the POST payload
payload = request.form.to_dict()
print("Received Redirection Payload:", payload)
status = payload.get('cf_status')
if status in ['ACTIVE', 'BANK_APPROVAL_PENDING']:
return "Subscription Authorised Successfully", 200
else:
return "Authorisation Failed", 400
```
```java Java theme={"dark"}
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class SubscriptionController {
@PostMapping("/return-url")
public String handleRedirection(HttpServletRequest request) {
// Collect parameters from the POST request
Map parameterMap = request.getParameterMap();
String status = request.getParameter("cf_status");
if ("ACTIVE".equals(status) || "BANK_APPROVAL_PENDING".equals(status)) {
return "Subscription Authorised Successfully";
} else {
return "Authorisation Failed";
}
}
}
```
```go Go theme={"dark"}
package main
import (
"fmt"
"net/http"
)
func returnURLHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
// Parse the POST form
r.ParseForm()
status := r.FormValue("cf_status")
fmt.Printf("Subscription Status: %s\n", status)
if status == "ACTIVE" || status == "BANK_APPROVAL_PENDING" {
fmt.Fprint(w, "Subscription Authorised Successfully")
} else {
fmt.Fprint(w, "Authorisation Failed")
}
}
func main() {
http.HandleFunc("/return-url", returnURLHandler)
http.ListenAndServe(":8080", nil)
}
```
```php PHP theme={"dark"}
```
**Return URL**
* After the customer completes the checkout on the OTP page, they are redirected to your `return_url`. This redirection is link-based. For example, if you provide a `return_url` in the format `https://b8af79f41056.eu.ngrok.io?order_id={order_id}`, the customer is redirected to `https://b8af79f41056.eu.ngrok.io?order_id=order_271vfuhh1o4h6bQIigqyOx74YiJ1T`.
* In production, `cf_status` and `cf_message` may not be included in the `return_url` response, even though they are present in the sandbox.\
The `return_url` is intended only to redirect customers back to your site after payment. It should not be used to retrieve complete subscription details.
For accurate and complete data, use webhooks.
* Configure your webhook URL in the Cashfree Dashboard.
* Enable the relevant events, such as `SUBSCRIPTION_AUTH_STATUS` and `SUBSCRIPTION_PAYMENT_SUCCESS`.
Always validate the subscription status through webhook notifications for production-grade reliability.
# Refund APIs Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/refund/refund-apis-overview
Browse the Cashfree Subscriptions refund APIs that let you create refunds against subscription charges and fetch the latest refund status from your backend.
# List of Subscription Refund APIs
| API name | Description |
| :- | :- |
| [Create Refund](/docs/api-reference/payments/latest/subscription/create-a-refund) | Use this API to create a refund for the payment of a Subscription. |
| [Get Refund](/docs/api-reference/payments/latest/subscription/fetch-details-of-a-refund) | Use this API to fetch the status of the refund of a Subscription. |
# Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/subscription-postman-collection
Download the Cashfree Subscriptions Postman collection to test mandate creation, charge, refund, and plan APIs against the sandbox before going live.
Get started with Cashfree's subscription APIs by downloading the collection and importing it in Postman.
Download Cashfree subscription Postman collection
## Error codes and reasons
For comprehensive error codes, failure reasons, and troubleshooting guidance when working with subscription APIs, refer to the [Error codes and reasons](/docs/api-reference/payments/latest/subscription/error-codes) documentation.
# Upload file for Physical Nach Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/upload-file-for-physical-nach-authorisation
openapi/payments/v2026-01-01.yaml post /subscriptions/pay/documents/{payment_id}
Use this API to upload file for Physical Nach Authorization.
# Signature Verification
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/webhook-signature
Verify Cashfree Subscriptions webhook signatures to confirm authenticity, prevent spoofing, and validate payload integrity before processing recurring events.
Webhook signature verification validates that webhook notifications are sent by Cashfree and haven't been tampered with during transmission. This cryptographic verification protects your server from accepting malicious or forged webhook requests.
Each webhook request sent by Cashfree includes the following:
| Parameter | Description |
| - | - |
| `x-webhook-signature` | HMAC SHA256 signature generated by Cashfree. |
| `x-webhook-timestamp` | Timestamp of when the webhook was generated. |
| Request body | The actual webhook payload. |
To validate the webhook, verify the signature using your webhook secret key.
## Verification flow
To validate the webhook:
* Read `x-webhook-signature` from request headers.
* Read `x-webhook-timestamp` from request headers.
* Capture the raw request body.
Don't modify, parse, or reformat the request body before verification.
Concatenate the timestamp and raw request body:
```text theme={"dark"}
signatureData = timestamp + rawBody
```
* Use your secret key.
* Apply HMAC SHA256 hashing on `signatureData`.
Please note that the Partner API key should be used for partner level webhooks.
Encode the hash as a Base64 string.
Compare the computed signature with the received signature:
```text theme={"dark"}
computed_signature == x-webhook-signature
```
* If matched: Webhook is valid.
* If not matched: Reject the request.
## Sample implementations
Select your language or framework to view a sample implementation.
```javascript Node.js theme={"dark"}
const express = require("express");
const crypto = require("crypto");
const app = express();
// Capture raw body
app.use(express.json({
verify: (req, res, buf) => {
req.rawBody = buf.toString();
}
}));
function verifyWebhook(req) {
const signature = req.headers["x-webhook-signature"];
const timestamp = req.headers["x-webhook-timestamp"];
const rawBody = req.rawBody;
const secretKey = process.env.CASHFREE_WEBHOOK_SECRET;
const computedSignature = crypto
.createHmac("sha256", secretKey)
.update(timestamp + rawBody)
.digest("base64");
return computedSignature === signature;
}
app.post("/webhook", (req, res) => {
if (!verifyWebhook(req)) {
return res.status(400).send("Invalid signature");
}
res.send("Webhook received");
});
```
```python Python theme={"dark"}
import hmac
import hashlib
import base64
from flask import request
def verify_webhook(secret_key):
webhook_signature = request.headers.get("x-webhook-signature")
timestamp = request.headers.get("x-webhook-timestamp")
raw_body = request.get_data(as_text=True)
signature_data = timestamp + raw_body
dig = hmac.new(
secret_key.encode('utf-8'),
msg=signature_data.encode('utf-8'),
digestmod=hashlib.sha256
).digest()
computed_signature = base64.b64encode(dig).decode()
return computed_signature == webhook_signature
```
```go Go theme={"dark"}
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"io/ioutil"
"net/http"
)
func verifyWebhook(r *http.Request, secretKey string) bool {
signature := r.Header.Get("x-webhook-signature")
timestamp := r.Header.Get("x-webhook-timestamp")
bodyBytes, _ := ioutil.ReadAll(r.Body)
rawBody := string(bodyBytes)
h := hmac.New(sha256.New, []byte(secretKey))
h.Write([]byte(timestamp + rawBody))
computed := base64.StdEncoding.EncodeToString(h.Sum(nil))
return computed == signature
}
```
```php PHP theme={"dark"}
```
```java Java theme={"dark"}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class WebhookValidator {
public static boolean verify(String rawBody, String timestamp, String signature, String secretKey) {
try {
String data = timestamp + rawBody;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256"));
byte[] hash = mac.doFinal(data.getBytes());
String computed = Base64.getEncoder().encodeToString(hash);
return computed.equals(signature);
} catch (Exception e) {
return false;
}
}
}
```
```csharp C# theme={"dark"}
using System;
using System.Security.Cryptography;
using System.Text;
public class WebhookValidator
{
public static bool Verify(string rawBody, string timestamp, string signature, string secretKey)
{
var data = timestamp + rawBody;
using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(secretKey)))
{
var hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(data));
var computed = Convert.ToBase64String(hash);
return computed == signature;
}
}
}
```
## Security requirements
Keep the following requirements in mind when implementing webhook signature verification.
* Always use the raw request body for signature computation.
* Don't modify, parse, or reformat the payload before verification.
* Store your webhook secret key securely. Use environment variables.
* Reject webhook requests if signature mismatch occurs or required headers are missing.
## Best practices
Use these practices to improve the security and reliability of your webhook implementation.
* Validate timestamp to prevent replay attacks (recommended window: 5 minutes).
* Log invalid webhook attempts for debugging and monitoring.
* Process webhook events only after successful signature verification.
## Summary
The verification process covers the following steps:
1. Capture the `x-webhook-signature` and `x-webhook-timestamp` headers along with the raw request body.
2. Concatenate the timestamp and raw body to form the signature data.
3. Generate an HMAC SHA256 hash using your webhook secret key.
4. Encode the hash as a Base64 string.
5. Compare the computed signature with `x-webhook-signature`. If they match, the webhook is valid. If they don't match, reject the request.
# Events
Source: https://www.cashfree.com/docs/api-reference/payments/latest/subscription/webhooks
Subscribe to Cashfree Subscriptions webhooks for mandate authorisation, recurring charges, payment status changes, and subscription lifecycle updates.
Cashfree sends webhook notifications to your server whenever significant events occur during the lifecycle of a subscription, enabling you to track subscription status changes, payment outcomes, authorisation updates, and refund status in real-time without polling the API. By listening to these webhooks, you can automate your business workflows, update your database, and keep your customers informed about their subscription status.
Below are the various events that can be sent to your webhook endpoint. These webhooks will be triggered if you have integrated the Subscription API.
* If the merchant added the webhook under the 2025-01-01 version, they will receive the same version of the webhook for older subscriptions as well.
* While filling the UPI payment methods, `upi_instrument` and `upi_instrument_number` will remain empty for webhook versions before 2025. This will be implemented in later versions.
* While filling the UPI payment methods, `upi_payer_account_number` and `upi_payer_ifsc` will be applicable only for TPV customers who have passed TPV details while creating the subscription.
* [`SUBSCRIPTION_STATUS_CHANGED`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_status_changed)
* [`SUBSCRIPTION_AUTH_STATUS`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_auth_status)
* [`SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_payment_notification_initiated)
* [`SUBSCRIPTION_PAYMENT_SUCCESS`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_payment_success)
* [`SUBSCRIPTION_PAYMENT_FAILED`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_payment_failed)
* [`SUBSCRIPTION_PAYMENT_CANCELLED`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_payment_cancelled)
* [`SUBSCRIPTION_REFUND_STATUS`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_refund_status)
* [`SUBSCRIPTION_CARD_EXPIRY_REMINDER`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_card_expiry_reminder)
* [`SUBSCRIPTION_CONTROLLED_NOTIFICATION_STATUS`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_controlled_notification_status)
* [`SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS`](/docs/api-reference/payments/latest/subscription/webhooks#subscription_controlled_execution_status)
Payment method object attributes:
```javascript UPI theme={"dark"}
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "8709228804@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
```
```javascript ENACH theme={"dark"}
"payment_method": {
"enach": {
"channel": "link",
"auth_mode": "aadhar",
"account_type": "",
"account_number": "",
"account_ifsc": "",
"account_holder_name": "",
"account_bank_code": ""
}
},
"payment_group": "enach"
```
```javascript PNACH theme={"dark"}
"payment_method": {
"pnach": {
"channel": "link",
"mandate_creation_date": "",
"mandate_start_date": "",
"account_type": "",
"account_number": "",
"account_ifsc": "",
"account_holder_name": "",
"account_bank_code": ""
}
},
"payment_group": "pnach"
```
```javascript Debit/Credit card theme={"dark"}
{
"payment_method": {
"card": {
"channel": null,
"card_number": "XXXXXXXXXXXX2123",
"card_network": "visa",
"card_type": "debit_card",
"card_sub_type": "R",
"card_country": "IN",
"card_bank_name": "KOTAK MAHINDRA BANK",
"card_network_reference_id": null,
"instrument_id": "8e9cc167-4fe2-4ece-be8d-c1b224e50a23"
}
},
"payment_group": "debit_card"
}
```
## SUBSCRIPTION\_STATUS\_CHANGED
Whenever a subscription is created it goes to initialised state and customer is expected to authorise it. The list of statuses where this webhook will get triggered are:
* ACTIVE
* ON\_HOLD
* COMPLETED
* CUSTOMER\_CANCELLED
* CUSTOMER\_PAUSED
* EXPIRED
* LINK\_EXPIRED
* BANK\_APPROVAL\_PENDING
* CANCELLED
* CARD\_EXPIRED
```javascript theme={"dark"}
{
"data": {
"subscription_details": {
"cf_subscription_id": "23639356",
"subscription_id": "mozuyYwUCbWEfJVVRLi",
"subscription_status": "BANK_APPROVAL_PENDING",
"subscription_expiry_time": "2055-08-07T10:30:46",
"subscription_first_charge_time": null,
"subscription_tags": null,
"next_schedule_date": null
},
"customer_details": {
"customer_name": null,
"customer_email": "john@dummy.com",
"customer_phone": "9900000000"
},
"plan_details": {
"plan_id": "mozuyYwUCbWEfJVVRLi",
"plan_name": "6Msuj2mttuf2F5P1FYVSet",
"plan_type": "ON_DEMAND",
"plan_max_cycles": 0,
"plan_recurring_amount": null,
"plan_max_amount": 399.00,
"plan_interval_type": null,
"plan_intervals": null,
"plan_currency": "INR",
"plan_note": null,
"plan_status": null
},
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "2025-09-06T10:30:47",
"authorization_reference": "6ba74ac2b047424da95591xxxxx[at]xxxx",
"authorization_time": "2025-08-07T10:31:36",
"authorization_status": "PENDING",
"payment_id": "49988270",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23639356",
"gateway_plan_id": "mozuyYwUCbWEfJVVRLi",
"gateway_auth_id": "6ba74ac2b047424da95591xxxxx[at]xxxx"
}
},
"event_time": "2025-08-07T10:31:35+05:30",
"type": "SUBSCRIPTION_STATUS_CHANGED"
}
```
```javascript theme={"dark"}
{
"data": {
"subscription_details": {
"cf_subscription_id": "123456",
"subscription_id": "Demo_Subscription",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2024-01-14T23:00:08+05:30",
"subscription_first_charge_time": "2024-01-10T23:00:08+05:30"
},
"customer_details": {
"customer_name": "john",
"customer_email": "john@dummy.com",
"customer_phone": "9900000000"
},
"plan_details": {
"plan_id": "plan12345",
"plan_name": "Plan Name",
"plan_type": "ON_DEMAND",
"plan_max_cycles": 10,
"plan_recurring_amount": 100.00,
"plan_max_amount": 1000.00,
"plan_currency": "INR",
"plan_note": "Note",
"plan_status": "ACTIVE"
},
"authorization_details": {
"authorizationAmount": 1.00,
"authorizationAmountRefund": true,
"approveByTime": "2025-09-06T16:44:48",
"authorizationReference": "544edde057f34ce588627axxxxx[at]xxxx",
"authorizationTime": "2025-08-07T16:46:06",
"authorizationStatus": "PENDING",
"paymentId": "50088288",
"paymentMethod": "upi",
"instrumentId": "xxxxx@xxxx"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_plan_id": "plan12345",
"gateway_auth_id": "6595231908096894505959"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_STATUS_CHANGED"
}
```
## SUBSCRIPTION\_AUTH\_STATUS
The event is triggered when the checkout is completed by the customer for success and failed cases.
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"cf_payment_id": "49988825",
"cf_txn_id": "4213159266",
"cf_order_id": "4519691525",
"subscription_id": "mozth7smWGCCqPRaSv7",
"cf_subscription_id": "23639858",
"payment_type": "AUTH",
"subscription_details": {
"cf_subscription_id": "23639858",
"subscription_id": "mozth7smWGCCqPRaSv7",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2047-07-30T13:24:54",
"subscription_first_charge_time": null,
"subscription_tags": {
"company": "Cashfree",
"name": "Payment link"
},
"next_schedule_date": null
},
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "cce92d335be0467693c020xxxxx[at]xxxx",
"authorization_time": "2025-08-07T10:34:23+05:30",
"authorization_status": "FAILED",
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T10:33:56+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT HAS BEEN FAILED"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23639858",
"gateway_payment_id": "49988825"
}
},
"event_time": "2025-08-07T10:34:23+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"cf_payment_id": "49988825",
"cf_txn_id": "4213159266",
"cf_order_id": "4519691525",
"subscription_id": "mozth7smWGCCqPRaSv7",
"cf_subscription_id": "23639858",
"payment_type": "AUTH",
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "cce92d335be0467693c020xxxxx[at]xxxx",
"authorization_time": "2025-08-07T10:34:23+05:30",
"authorization_status": "FAILED",
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T10:33:56+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT HAS BEEN FAILED"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23639858",
"gateway_payment_id": "49988825"
}
},
"event_time": "2025-08-07T10:34:23+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200.75,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
## SUBSCRIPTION\_PAYMENT\_NOTIFICATION\_INITIATED
This webhook is used to inform the merchant that we have sent a notification of payment to the customer.
```javascript Version (2026-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"cf_payment_id": "49970855",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "moziva9hyjiLtCuGN74",
"cf_subscription_id": "22390006",
"payment_type": "CHARGE",
"subscription_details": {
"cf_subscription_id": "22390006",
"subscription_id": "moziva9hyjiLtCuGN74",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2047-07-30T13:24:54",
"subscription_first_charge_time": null,
"subscription_tags": {
"company": "Cashfree",
"name": "Payment link"
},
"next_schedule_date": null
},
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"payment_method": null,
"payment_group": null
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-07T09:08:09+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22390006",
"gateway_payment_id": "49970855"
}
},
"event_time": "2025-08-07T09:51:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"cf_payment_id": "49970855",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "moziva9hyjiLtCuGN74",
"cf_subscription_id": "22390006",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"payment_method": null,
"payment_group": null
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-07T09:08:09+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22390006",
"gateway_payment_id": "49970855"
}
},
"event_time": "2025-08-07T09:51:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "PENDING",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
## SUBSCRIPTION\_PAYMENT\_SUCCESS
This notification is sent whenever a successful payment is processed for an active subscription.
```javascript Version (2026-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"cf_payment_id": "49914526",
"cf_txn_id": "4212435861",
"cf_order_id": "4518936510",
"subscription_id": "moznV33AssPd6vXsSm2",
"cf_subscription_id": "23601811",
"payment_type": "AUTH",
"subscription_details": {
"cf_subscription_id": "23601811",
"subscription_id": "moznV33AssPd6vXsSm2",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2047-07-30T13:24:54",
"subscription_first_charge_time": null,
"subscription_tags": {
"company": "Cashfree",
"name": "Payment link"
},
"next_schedule_date": null
},
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "427b608f83ad4cbdb6d472xxxxx[at]xxxx",
"authorization_time": "2025-08-07T05:53:22+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "8100000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T05:52:21+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23601811",
"gateway_payment_id": "49914526"
}
},
"event_time": "2025-08-07T05:53:21+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"cf_payment_id": "49914526",
"cf_txn_id": "4212435861",
"cf_order_id": "4518936510",
"subscription_id": "moznV33AssPd6vXsSm2",
"cf_subscription_id": "23601811",
"payment_type": "AUTH",
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "427b608f83ad4cbdb6d472xxxxx[at]xxxx",
"authorization_time": "2025-08-07T05:53:22+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "8100000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T05:52:21+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23601811",
"gateway_payment_id": "49914526"
}
},
"event_time": "2025-08-07T05:53:21+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
## SUBSCRIPTION\_PAYMENT\_FAILED
This notification is sent whenever payment processing fails for an active subscription.
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"cf_payment_id": "49585655",
"cf_txn_id": "4212555720",
"cf_order_id": "4519061918",
"subscription_id": "mozh4iRHSsjre7GkDNz",
"cf_subscription_id": "22393526",
"payment_type": "CHARGE",
"subscription_details": {
"cf_subscription_id": "22393526",
"subscription_id": "mozh4iRHSsjre7GkDNz",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2047-07-30T13:24:54",
"subscription_first_charge_time": null,
"subscription_tags": {
"company": "Cashfree",
"name": "Payment link"
},
"next_schedule_date": null
},
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "a7d6101a7d9340269f070dxxxxx[at]xxxx",
"authorization_time": "2025-07-25T22:37:53+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-07T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T05:02:41+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT FAILED | Insufficient Funds In Customer (Remitter) Account"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22393526",
"gateway_payment_id": "49585655"
}
},
"event_time": "2025-08-07T10:24:45+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"cf_payment_id": "49585655",
"cf_txn_id": "4212555720",
"cf_order_id": "4519061918",
"subscription_id": "mozh4iRHSsjre7GkDNz",
"cf_subscription_id": "22393526",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "a7d6101a7d9340269f070dxxxxx[at]xxxx",
"authorization_time": "2025-07-25T22:37:53+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-07T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T05:02:41+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT FAILED | Insufficient Funds In Customer (Remitter) Account"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22393526",
"gateway_payment_id": "49585655"
}
},
"event_time": "2025-08-07T10:24:45+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Insufficient balance"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
## SUBSCRIPTION\_PAYMENT\_CANCELLED
This notification is sent whenever payment processing is cancelled by user for an active subscription.
```javascript Version (2026-01-01) theme={"dark"}
{
"data": {
"payment_id": "433563_33_1754492527395",
"cf_payment_id": "2011332",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "subTestIdOndemand_2025080615020470",
"cf_subscription_id": "1220385",
"payment_type": "CHARGE",
"subscription_details": {
"cf_subscription_id": "1220385",
"subscription_id": "subTestIdOndemand_2025080615020470",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2047-07-30T13:24:54",
"subscription_first_charge_time": null,
"subscription_tags": {
"company": "Cashfree",
"name": "Payment link"
},
"next_schedule_date": null
},
"authorization_details": {
"authorization_amount": 1.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "433563_33_1754492527395",
"payment_method": null,
"payment_group": null
},
"payment_amount": 1.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T20:32:07+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "1220385",
"gateway_payment_id": "2011332"
}
},
"event_time": "2025-08-06T20:32:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "433563_33_1754492527395",
"cf_payment_id": "2011332",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "subTestIdOndemand_2025080615020470",
"cf_subscription_id": "1220385",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 1.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "433563_33_1754492527395",
"payment_method": null,
"payment_group": null
},
"payment_amount": 1.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T20:32:07+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "1220385",
"gateway_payment_id": "2011332"
}
},
"event_time": "2025-08-06T20:32:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Subscription is not active"
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
## SUBSCRIPTION\_REFUND\_STATUS
This event is triggered whenever a refund status of a transaction will be success, failed, or cancelled.
```javascript theme={"dark"}
{
"data": {
"payment_id": "yCzJxeT2aXDqI",
"cf_payment_id": "49778199",
"refund_id": "WHOqiwy05P1l0",
"cf_refund_id": "SUB_21ebb4bf-e84f-4afa-bb09-07aac433abe4",
"refund_amount": 1000.00,
"refund_speed": "STANDARD",
"refund_note": "Tesg Refund",
"refund_status": "SUCCESS",
"failure_details": "",
"refund_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_payment_id": "49778199",
"gateway_refund_id": "SUB_21ebb4bf-e84f-4afa-bb09-07aac433abe4"
}
},
"event_time": "2025-08-06T17:20:02+05:30",
"type": "SUBSCRIPTION_REFUND_STATUS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "pay8643",
"cf_payment_id": "863782648",
"refund_id": "refund2",
"cf_refund_id": "ref_212",
"refund_amount": 100,
"refund_note": "test",
"refund_speed": "INSTANT",
"refund_status": "SUCCESS",
"failure_details": null,
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_payment_id": "pay8643",
"gateway_refund_id": "refund2"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_REFUND_STATUS"
}
```
## SUBSCRIPTION\_CARD\_EXPIRY\_REMINDER
This event is triggered 7 days prior to the card’s expiry date for active card subscriptions.
```javascript theme={"dark"}
{
"data": {
"subscription_status_webhook": {
"subscription_details": {
"cf_subscription_id": "23661347",
"subscription_id": "SUB_TEST_1754550382119",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2050-12-31T00:00:00",
"subscription_first_charge_time": "2025-09-30T00:00:00",
"subscription_tags": {
"next_schedule_date": "2025-09-30T00:10:00"
}
},
"customer_details": {
"customer_name": "John Doe",
"customer_email": "john@cashfree.com",
"customer_phone": "9090909090"
},
"plan_details": {
"plan_id": "PLAN_1754550139964",
"plan_name": "MY_PLAN",
"plan_type": "PERIODIC",
"plan_max_cycles": 2,
"plan_recurring_amount": 5,
"plan_max_amount": 1000,
"plan_interval_type": "MONTH",
"plan_intervals": 1,
"plan_currency": null,
"plan_note": null,
"plan_status": null
},
"authorization_details": {
"authorizationAmount": 1,
"authorizationAmountRefund": false,
"approveByTime": "2025-09-06T12:36:22",
"authorizationReference": null,
"authorizationTime": "2025-08-07T13:14:18",
"authorizationStatus": "ACTIVE",
"paymentId": "160594_178_1754552533131",
"paymentMethod": "card",
"instrumentId": null
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23661347",
"gateway_plan_id": "PLAN_1754550139964",
"gateway_auth_id": null
}
},
"card_expiry_date": "2025-09-30"
},
"event_time": "2025-09-24T02:00:09+05:30",
"type": "SUBSCRIPTION_CARD_EXPIRY_REMINDER"
}
```
The following webhooks are only relevant if you are using Controlled API endpoints for notification and charge.
## SUBSCRIPTION\_CONTROLLED\_NOTIFICATION\_STATUS
Cashfree sends this webhook when the status of a merchant-controlled payment notification attempt changes (for example, SUCCESS or FAILED).
```javascript theme={"dark"}
{
"data": {
"cf_notification_id": "3333",
"cf_order_id": "123456",
"cf_payment_id": "123456",
"cf_subscription_id": "7891011",
"cf_txn_id": "123456",
"notification_attempted_time": "2025-06-01T22:14:59+05:30",
"notification_completed_time": "2025-06-01T22:15:59+05:30",
"notification_failure_details": {
"failure_reason": "",
"failure_error_code": "",
"failure_sub_error_code": ""
},
"notification_id": "notification-001",
"notification_initiated_time": "2025-06-01T22:14:58+05:30",
"notification_status": "SUCCESS",
"payment_amount": 1,
"payment_id": "test-payment-id",
"payment_remarks": "monthly charge",
"payment_status": "INITIALIZED",
"subscription_id": "test-subscription-id"
},
"event_time": "2025-06-01T22:15:59+05:30",
"type": "SUBSCRIPTION_CONTROLLED_NOTIFICATION_STATUS"
}
```
## SUBSCRIPTION\_CONTROLLED\_EXECUTION\_STATUS
Cashfree sends this webhook when the status of a merchant-controlled charge execution attempt changes (for example, SUCCESS or FAILED).
```javascript theme={"dark"}
{
"data": {
"cf_execution_id": "3333",
"cf_order_id": "123456",
"cf_payment_id": "123456",
"cf_subscription_id": "7891011",
"cf_txn_id": "123456",
"execution_attempted_time": "2025-06-01T22:14:59+05:30",
"execution_completed_time": "2025-06-01T22:15:59+05:30",
"execution_id": "execution-001",
"execution_initiated_time": "2025-06-01T22:14:58+05:30",
"execution_status": "SUCCESS",
"failure_details": {
"failure_reason": "",
"failure_error_code": "",
"failure_sub_error_code": ""
},
"payment_amount": 1,
"payment_id": "test-payment-id",
"payment_remarks": "",
"payment_status": "SUCCESS",
"subscription_id": "test-subscription-id"
},
"event_time": "2025-06-01T22:15:59+05:30",
"type": "SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS"
}
```
# Delete Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/latest/token-vault/delete-saved-card-instrument
openapi/payments/v2026-01-01.yaml delete /customers/{customer_id}/instruments/{instrument_id}
Use this API to delete a specific saved card stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Fetch All Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/latest/token-vault/fetch-all-saved-card-instrument
openapi/payments/v2026-01-01.yaml get /customers/{customer_id}/instruments?instrument_type=card
Use this API to fetch all saved cards stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Fetch Cryptogram for a Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/latest/token-vault/fetch-cryptogram-for-a-saved-card-instrument
openapi/payments/v2026-01-01.yaml get /customers/{customer_id}/instruments/{instrument_id}/cryptogram
Use this API to retrieve the token and cryptogram for a specific saved card stored in Cashfree's [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Fetch Specific Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/latest/token-vault/fetch-specific-saved-card-instrument
openapi/payments/v2026-01-01.yaml get /customers/{customer_id}/instruments/{instrument_id}
Use this API to fetch a specific saved card stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Card Token Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/latest/token-vault/webhooks
Receive Cashfree Token Vault webhooks for asynchronous updates on saved card instruments including tokenisation success, failure, and expiry events.
| Event | Description |
| - | - |
| INSTRUMENT\_ACTIVE\_WEBHOOK | This webhook is triggered when the card is successfully tokenised. |
| INSTRUMENT\_FAILED\_WEBHOOK | This webhook is triggered when the card tokenisation fails. |
For more information on how to configure webhooks, see [Webhook configuration](/docs/payments/online/webhooks/configure).
## Instrument active webhook
```javascript Instrument active webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "ACTIVE",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_token_type": "PG_CASHFREE",
"card_par": "50012ADWQZJKHCLXLT61QTYD5QNX1",
"card_token_details": null
}
}
},
"event_time": "2026-09-07T15:16:48+05:30",
"type": "INSTRUMENT_ACTIVE_WEBHOOK"
}
```
```javascript Instrument active webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "ACTIVE",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": "50012ADWQZJKHCLXLT61QTYD5QNX1",
"card_token_details": null
}
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_ACTIVE_WEBHOOK"
}
```
## Instrument failed Webhook
```javascript Instrument failed webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "FAILED",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_token_type": "PG_CASHFREE",
"card_par": null,
"card_token_details": null
}
},
"error_details": {
"error_code": "NETWORK_ERROR",
"error_description": "Error while processing the request",
"error_source": "NETWORK"
}
},
"event_time": "2026-09-29T20:10:51+05:30",
"type": "INSTRUMENT_FAILED_WEBHOOK"
}
```
```javascript Instrument failed webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "FAILED",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": null,
"card_token_details": null
}
},
"error_details": {
"error_code": "NETWORK_ERROR",
"error_description": "Error while processing the request",
"error_source": "NETWORK"
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_FAILED_WEBHOOK"
}
```
## Payload field description
| Field | Description | Type |
| - | - | - |
| customer\_id | For checkout, this is the customer phone number and for seamless this is the customer ID provided by the merchant during the [Create Order API](/docs/api-reference/payments/latest/orders/create-order) call, which is used to save cards for the customer. | `string` |
| afa\_reference | Represents the `cf_payment_id` of the successful transaction done while saving the instrument. | `string` |
| instrument\_id | Represents the identifier for the card saved at Cashfree. | `string` |
| instrument\_type | Specifies the type of instrument. Available options: `card`. | `enum` |
| instrument\_uid | Represents the unique identifier for the card, used to identify a specific card. | `string` |
| instrument\_display | Shows the last 4 digits of the actual card number. | `string` |
| instrument\_status | Shows the status of the saved instrument. It is `ACTIVE` when the card is successfully tokenised, else `FAILED`. Available options: `ACTIVE`, `FAILED`. | `enum` |
| added\_at | Shows the timestamp at which the instrument was attempted to be saved. | `string` |
| card\_network | Specifies the card scheme or network. Available options: `visa`, `mastercard`, `rupay`, `amex`, `diners`. | `string` |
| card\_bank\_name | Shows the issuing bank name of the card. Examples: `HDFC BANK`, `ICICI BANK`, `AXIS BANK`. | `string` |
| card\_country | Shows the issuing country of the card. Example: `IN`. | `string` |
| card\_type | Specifies the type of card. Available options: `credit`, `debit`, `prepaid`. | `string` |
| sub\_type | Specifies the sub-type of card. `R` = Retail, `P` = Premium, `C` = Corporate. Available options: `R`, `P`, `C`. | `string` |
| card\_par | Represents the [PAR](/docs/payments/features/payment-account-reference) for the plain card. Appears only in instrument active webhook when the card is tokenised successfully. | `string` |
| card\_token\_details | Always passed as null. | `object` |
| event\_time | Shows the time at which the webhook is initiated. | `string` |
| type | Specifies the type of the instrument webhook. Available options: `INSTRUMENT_ACTIVE_WEBHOOK`, `INSTRUMENT_FAILED_WEBHOOK`. | `string` |
# Get Card BIN Details
Source: https://www.cashfree.com/docs/api-reference/payments/latest/utilities/get-card-bin-details
openapi/payments/v2026-01-01.yaml post /utilities/cardbin
Use this API to get [Card BIN](https://www.cashfree.com/docs/payments/features/utility-apis) (Bank Identification Number) details.
# Get PAR
Source: https://www.cashfree.com/docs/api-reference/payments/latest/utilities/get-par
openapi/payments/v2026-01-01.yaml post /utilities/pars
Use this API to get [Payment Account Reference (PAR)](https://www.cashfree.com/docs/payments/features/payment-account-reference) by providing plain card details.
# Incident Service Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/latest/utilities/incidents/incident-webhook
Subscribe to Cashfree Incident Service webhooks so your checkout learns when payment rails go down, recover, or change scope across banks and networks.
Cashfree will notify you whenever we create an incident at our end. An incident implies that the issuing bank is facing high failure rates or has scheduled a maintenance activity during that time. The former could be due to many reasons and until the failure rates go down, we would recommend customers to use alternative payment instruments.
There are two channels through which we notify. You can subscribe to either of the channels by adding your email address and webhook endpoint in the merchant dashboard.
Email - Cashfree will send an email alert when an issuer is facing downtime or a scheduled incident.
Webhooks - Cashfree will invoke a server to server call whenever an incident is created. You can use this webhook and update your payment page accordingly.
## Webhook schema of incident service webhook
### Sample payload for creation of incident
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
### Sample payload when incident is resolved
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
### Payload
| Field | Description | Example | Mandatory |
| - | - | - | - |
| end\_time | Null when an incident is created. Or end time when incident is resolved | 2021-04-16T15:10:36+05:30 | No |
| start\_time | Time since we have seen this incident | 2021-04-16T14:10:36+05:30 | Yes |
| id | Incident id | Alphanumeric with \_,- | Yes |
| impact | Impact of the downtime | HIGH, MEDIUM, LOW | Yes |
| message | Human readable message | | No |
| status | Status of the incident. OPEN when created, RESOLVED when resolved, UPDATE when updated with details | OPEN, UPDATE, RESOLVED | Yes |
| type | Is this a scheduled or an unscheduled downtime? | SCHEDULED, UNSCHEDULED | Yes |
| instruments | Refers to the payment mode. This will contain a nested object | | Yes |
| upi.issuers | Issuers which are impacted | Array | No |
| net\_banking.issuers | Net banking banks which are impacted | Array | No |
| wallet.issuers | Wallets which are impacted | Array | No |
| card.type | Card types which are impacted | CREDIT\_CARD, DEBIT\_CARD, ALL | No |
| card.scheme | Card schemes which are impacted | MASTER, VISA, RUPAY, MAESTRO, AMEX, Multiple Schemes | No |
| card.issuers | Banks which are impacted | Array | No |
| event\_time | Time when this webhook was created | | Yes |
| type | Type of webhook | HEALTH\_ALERT | Yes |
| version | Version of webhook. You should build your parsing logic with respect to this version | | Yes |
| Children | Optional | Type | Possible values |
| - | - | - | - |
| wallet | Y\* | Child attributes | Available below |
| net\_banking | Y\* | Child attributes | Available below |
| upi | Y\* | Child attributes | Available below |
| card | Y\* | Child attributes | Available below |
> At least one of the children needs to be present
### Wallet
| Children | Optional | Type | Possible values |
| - | - | - | - |
| issuers | N | Text | See list of wallet issuers below. |
### Net Banking
| Children | Optional | Type | Possible values |
| - | - | - | - |
| issuers | N | Array | See list of issuers below. |
### UPI
| Children | Optional | Type | Possible values |
| - | - | - | - |
| issuers | N | Array | See list of issuers below. |
### Card
| Children | Optional | Type | Possible values |
| - | - | - | - |
| type | N | Text | CREDIT\_CARD, DEBIT\_CARD, ALL |
| scheme | N | Text | MASTER, VISA, RUPAY, MAESTRO, AMEX, Multiple Schemes |
| issuers | N | Array | See list of issuers below. |
### Payload Headers
Cashfree will send two custom headers for every webhook being invoked by our system.
| Name | Description | Example |
| - | - | - |
| x-cashfree-timestamp | Timestamp for this event. Used to generate signature | 1618562436364 |
| x-cashfree-signature | Cashfree signature for this webhook | ke+K3gR8GssH9AMfJm+0+8jGIL1Mq7hOheP9w36/hL0= |
## Signature Generation
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree Payment Gateway secret key along with the payload.
```
//The payload here refers to the raw request sent by
Cashfree to your endpoint. No modifications need to be
done to this payload.
payload := {"data":{"bank_name":"Test Bank",
"card_type":"Visa","health":"DEGRADED",
"incident_end_time":"2021-04-07T00:20:30",
"incident_id":"INCIDENT_HIGH_Test Bank_954b95zz-f11a-test-abcd-0eb0e8608847",
"incident_impact":"High",
"incident_start_time":"2021-04-06T00:20",
"incident_type":"Scheduled",
"is_resolved":false,
"issuers":[],
"message":"We are facing high failure issues in Payment gateway at the moment and will keep you updated about the issue.",
"payment_gateway":null,"payment_mode":"DEBIT_CARD",
"scope":"PaymentMode"},
"type":"HEALTH_ALERT","version":1}
# timestamp is present in the header x-cashfree-timestamp
timestamp := 1617695238078
signedPayload := $timestamp.$payload
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey))
```
## Bank Names
* Axis Bank
* Bank of Baroda - Retail Banking
* Bank of India
* Bank of Maharashtra
* Canara Bank
* Catholic Syrian Bank
* Central Bank of India
* City Union Bank
* Deutsche Bank
* DBS Bank Ltd
* DCB Bank - Personal
* Dhanlakshmi Bank
* Federal Bank
* HDFC Bank
* ICICI Bank
* IDBI Bank
* IDFC Bank
* Indian Bank
* Indian Overseas Bank
* IndusInd Bank
* Jammu and Kashmir Bank
* Karnataka Bank Ltd
* Karur Vysya Bank
* Kotak Mahindra Bank
* Laxmi Vilas Bank - Retail Net Banking
* Punjab & Sind Bank
* Punjab National Bank - Retail Net Banking
* RBL Bank
* Saraswat Bank
* South Indian Bank
* Standard Chartered Bank
* State Bank Of India
* Tamilnad Mercantile Bank Ltd
* UCO Bank
* Union Bank of India
* Yes Bank Ltd
* Bank of Baroda - Corporate
* Bank of India - Corporate
* DCB Bank - Corporate
* Lakshmi Vilas Bank - Corporate
* Punjab National Bank - Corporate
* State Bank of India - Corporate
* Union Bank of India - Corporate
* Axis Bank Corporate
* Dhanlaxmi Bank Corporate
* ICICI Corporate Netbanking
* Ratnakar Corporate Banking
* Shamrao Vithal Bank Corporate
* Equitas Small Finance Bank
* Yes Bank Corporate
* Bandhan Bank- Corporate banking
* Barclays Corporate- Corporate Banking - Corporate
* Indian Overseas Bank Corporate
* City Union Bank of Corporate
* HDFC Corporate
* Shivalik Bank
* AU Small Finance
* Bandhan Bank - Retail Net Banking
* Shamrao Vitthal Co-operative Bank
* Tamil Nadu State Co-operative Bank
All Banks (Note: This parameter will be sent when all banks are having a downtime)
## Wallet Names
* FreeCharge
* MobiKwik
* Ola Money
* Reliance Jio Money
* Airtel Money
* Paytm
* Amazon Pay
* PhonePe
## Compute signature and verify
#### Sample code
#### Verify Signature using SDK
```javascript Node(express) theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```go Go theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature']
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```csharp C# theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
### Compute signature and verify manually
```javascript Node(express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Webhook Configuration
Source: https://www.cashfree.com/docs/api-reference/payments/latest/webhooks/configure
Add, test, and edit Payment Gateway webhook endpoints in the Merchant Dashboard, then review delivery logs and analytics for your integration.
Add and define webhooks for Payment Gateway, Payment Links, Payment Forms, and Subscriptions. Get notified for each action on the URLs you configure.
## Add a webhook endpoint
To add a new webhook:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Go to **Payment Gateway** > **Developers** or select **Developers** from the homepage.
3. Select **Add Webhook Endpoint** to create a new webhook. Enter the endpoint URL and select the webhook version from the drop-down menu.
4. Select **Test** to verify if the webhook endpoint returns a response and select **Next**.
In the sandbox environment, both http\:// and https\:// endpoints are supported. In the production environment, only https\:// endpoints are supported.
5. Select the events for which you want to configure the webhooks and select **Add Webhook**.
* Dispute Closed
* Dispute Created
* Dispute Updated
* Failed Payment
* Incident
* Instrument Active
* Instrument Failed
* Refund
* Settlement Failed
* Settlement Initiated
* Settlement Reversed
* Success Payment
* Success Payment TDR (Payment Charges webhook — `PAYMENT_CHARGES_WEBHOOK`)
* User Dropped Payment
* Vendor Settlement Failed
* Vendor Settlement Initiated
* Vendor Settlement Reversed
* Vendor Settlement Success
You have successfully created a webhook for the required event. You can view all your webhooks from the **Webhook Endpoints** homepage. Details such as **URL**, **Webhook Version**, **Event**, and **Actions** are available.
## Test a webhook endpoint
You can test the URL at any time using the **Test** option.
1. Select **Test** on the webhook you want to verify.
2. In the **Test Webhook Endpoint** pop-up, select **Test**.
3. Select **Done** after you receive a success response.
## Edit a webhook endpoint
To edit a webhook:
1. Select **Edit** on the webhook you want to modify.
2. Select the events you want to add or remove.
3. Select **Save**.
## Logs
The **Logs** section displays all webhook logs (successful or failed) on your Merchant Dashboard. You can access the logs directly at [merchant.cashfree.com/merchants/pg/developers/webhooks/logs?env=prod](https://merchant.cashfree.com/merchants/pg/developers/webhooks/logs?env=prod).
To view logs:
1. Specify the date range to view logs for a particular period.
2. Use the **Search and Filter** option to view specific logs. Enter the **URL** and select the required webhook type from the drop-down menu.
3. Select a request to view details such as **Message**, **Time**, **Version**, **Header Details**, and **Payload**.
4. To view only **Success** or **Failed** logs, navigate to the respective tabs.
Watch the video below to learn how logs work.
***
## Analytics
The webhook analytics feature provides contextual information on webhook metrics that help you track, monitor, and assess the success or failure of your webhooks. Metrics such as success rate and latency are available.
To view analytics:
1. Specify the date range to view metrics for a particular period.
2. Use the **Search and Filter** option to filter results. Enter the URL and select the required webhook type from the drop-down menu.
***
### Success rate
The success rate chart displays the webhook delivery status over time. The chart shows the following metrics:
* **Total Attempts**: The total number of webhook delivery attempts.
* **Successful**: The count of webhooks delivered successfully on the first attempt.
* **Retried Successful**: The count of webhooks that succeeded after retry attempts.
* **Failed**: The count of webhooks that failed to deliver.
Hover over individual bars to view the breakdown for a specific date.
### Latency
Latency is the time taken to respond to webhooks. Hover over individual bars to view the latency for a specific date. The average latency value is also displayed.
## Webhook configuration across accounts
Webhook configurations are managed at the merchant/MID level and are not automatically replicated across different accounts. You must configure the required webhook endpoint directly from the Cashfree Merchant Dashboard for each MID and select the relevant events you wish to receive.
The webhook options in the Partner Dashboard are limited to partner-level events supported by the platform. Payment Link-specific webhook events are not available at the Partner level and can only be configured at the individual merchant account level via the Merchant Dashboard.
# Webhook Idempotency
Source: https://www.cashfree.com/docs/api-reference/payments/latest/webhooks/idempotency
Handle duplicate Cashfree Payment Gateway webhook deliveries safely: deduplicate by cf_payment_id and treat only SUCCESS as terminal.
When integrating with Cashfree Payment Gateway, it's crucial to implement webhook idempotency to ensure your application processes only final and unique payment events. Below are the core principles and practices to follow.
## Key concepts
The following are the key concepts:
* **Multiple payment attempts per order\_id**: For a single `order_id`, Cashfree allows multiple payment attempts until one succeeds. Each attempt generates a unique `cf_payment_id`.
* **Unique payment\_id per attempt**: Every retry—whether triggered by the user or automatically—will have a distinct `cf_payment_id` but the same `order_id`.
* **Terminal status**: Only consider webhook events where `payment_status = SUCCESS` as the final confirmation of payment for an order.
Statuses such as `FAILED`, `NOT_ATTEMPTED`, or `PENDING` are transitional and should not be treated as final.
## Best practices
The following are the recommended best practices:
* **De-duplicate using cf\_payment\_id**: Track `cf_payment_id` in your database and process each payment only once, regardless of how many webhook retries you receive.
* **Order-level validation**: Update the order status **only when** you receive a webhook that meets **all** of the following conditions:
* The `order_id` matches the one you created.
* The `payment_status` is `SUCCESS`.
* The order has **not already** been marked as paid.
* **Handle retried payments**: Users may retry failed payments. As a result, you may receive multiple webhook events in the sequence: `FAILED → PENDING → SUCCESS`.\
Implement logic to update the order status only upon receiving the `SUCCESS` webhook.
* **Ignore duplicate FAILED webhooks**: Webhook events with a `FAILED` status may be sent multiple times. Do not trigger any final actions for these statuses unless you are tracking them for logging or metrics.
* **Store payment attempts**: Keep a log of all `cf_payment_id` for a given `order_id` to support reporting, reconciliation, or dispute management.
* **Use HTTPS endpoints**: Your webhook URL must be publicly reachable from Cashfree. Production endpoints must use HTTPS.
* **Respond immediately**: Your endpoint must return a successful HTTP 200 response immediately after receiving the webhook payload.
* **Verify signatures**: Verify the webhook signature using the `x-webhook-signature` header before processing the payload to authenticate the request. For implementation details, see [Webhook signature verification](/docs/payments/online/webhooks/signature-verification).
Do not mark the order as PAID on receiving `FAILED` or `PENDING` statuses.
Always wait for a `SUCCESS` webhook before finalising the payment status.
## Webhooks as the source of truth
Cashfree webhooks provide server-to-server communication. This means your server receives the payment status even if the customer closes the browser or application before being redirected back to your site. Webhooks are the recommended source of truth for your internal systems. You can monitor webhook delivery and retry history in the **Logs** section. See [Webhook configuration](/docs/payments/online/webhooks/configure).
# Webhook Overview
Source: https://www.cashfree.com/docs/api-reference/payments/latest/webhooks/overview
Understand Cashfree Payment Gateway webhooks: event references, verification, retries, resends, and version migration for your integration.
When building Cashfree integrations, you might want your applications to receive events as they occur in your Cashfree account so that your back-end systems can execute actions accordingly.
To enable real-time event notifications, register your webhook endpoints with Cashfree at **Developers > Webhooks**. These endpoints receive HTTP POST requests containing JSON payloads whenever specific events happen in your Cashfree account. This allows your application to react promptly to changes such as successful payments, failed transactions, or new chargebacks.
Install [Cashfree Agent Skills](/docs/tools-ai/cashfree-agent-skills) to bring Cashfree product knowledge into your AI coding assistant (Claude Code, Cursor, VS Code Copilot, Gemini CLI, and more) to answer integration questions and generate accurate code without leaving your editor.
Headers and payload samples for payment status notifications.
Payload samples for refund status notifications.
Settlement status notifications and payout objects.
Subscription lifecycle and payment status notifications for recurring billing.
Payload samples for payment link status notifications.
Payment status notifications for no-code payment forms.
Instrument payloads for saved card token status notifications.
Chargeback and dispute status notifications.
Terminal and SoftPOS transaction status notifications.
Vendor settlement and vendor status change notifications for Easy Split.
Partner-facing notifications for international collections transactions.
### Verify webhooks
Verify webhooks to prevent tampering and ensure you process only legitimate notifications from Cashfree. Without verification, your application is vulnerable to fraudulent payment confirmations and security threats.
Use [webhook signatures](/docs/payments/online/webhooks/signature-verification) to authenticate Cashfree webhooks, and proceed with further actions only after successful verification.
Cashfree generates the webhook signature based on the raw payload, not the
parsed payload. You can refer to how the popular JavaScript framework
[NestJS](https://docs.nestjs.com/faq/raw-body) provides a hook for accessing
the raw body.
### Test webhooks
Before going live, test your webhooks in the sandbox environment to verify payloads and integration behaviour. Configure your webhooks from the dashboard in the test environment. Events triggered by test transactions send webhooks to your configured endpoint.
You can create endpoint URLs and test webhooks using tools like
[webhook.site](https://webhook.site) or create a tunnel to your localhost
using tools like [ngrok](https://ngrok.com).
### Duplicate webhook processing
Cashfree uses **at-least-once** delivery to prevent missed webhook
notifications.
In case of inadvertent downtimes at Cashfree or your end, Cashfree may attempt
duplicate webhook delivery to ensure fulfilment.
To prevent business processing of duplicate events at your end, you are strongly
recommended to validate `x-idempotency-header` in each webhook header. This hashed
value will always be unique for each unique webhook payload.
This feature is available on webhook versions starting 2025-01-01. To migrate
to this new version, refer to [Webhook Migration](#webhook-migration) section
below.
### Retry webhooks policy
You can define a custom retry policy for webhooks that do not receive a **200 response**. To configure the retry policy, log in to the **[Merchant Dashboard](https://merchant.cashfree.com/auth/login)** and go to **Payment Gateway > Developers > Webhooks**. Cashfree retries delivery to your URLs based on the defined policy until it receives a **200 response**.
You will see two types of URLs listed -
1. `NOTIFY_URL` - This is the default configuration added to your account and configurations here cannot be edited or deleted. This configuration will apply to only the URLs sent in the notify\_url param of [Create Order API](/docs/api-reference/payments/latest/orders/create-order) within the order\_meta object
2. Your custom configured URLs - You can click on 'Edit' and follow the steps on the screen to define a custom retry policy. A default policy is applied to all URLs
The following webhook policy types are available:
* **Default**: The system retries up to three times at 2, 10, and 30-minute intervals.
* **Fixed**: You can specify the number of retries (maximum of 10) and the interval between retries.
* **Exponential**: You can specify the number of retries (maximum of 10), the interval, and a multiplier. For example, if the number of retries is 5, the interval is 15 minutes, and the multiplier is 2, retries occur at 15, 17, 19, 23, and 31-minute intervals.
* **Custom**: You can specify the number of retries (maximum of 10) and define custom intervals.
### Resend webhooks
This feature is only available for [`payment`
webhooks](/docs/api-reference/payments/latest/payments/webhooks)
There are various reasons why you might need to resend a webhook response to your endpoint, such as service-level downtime or failure to register a webhook payload. With Cashfree, you can resend previously triggered webhooks. Log in to your dashboard and follow the steps below:
1. Go to Webhooks under the Developer section and go to **Logs**.
2. On the top right, click the **Batch Resend** button.
3. You will see three options here:
* **Text**: Enter transaction IDs (comma separated) in the text box and click **Resend**. Transaction IDs are the same as Entity IDs listed on the logs dashboard.
* **File**: Upload the file in the required format (downloadable from the dashboard) with the required Transaction IDs and click **Resend**.
* **Time Duration**: Select the time period (max. allowed duration is 24 hours) and click **Resend**.
### Webhook signature verification
Cashfree generates the webhook signature based on the raw payload, not the
parsed payload. You can refer to how the popular JavaScript framework
[NestJS](https://docs.nestjs.com/faq/raw-body) provides a hook for accessing
the raw body.
Use the signature to verify that the request has not been tampered with. To verify the signature, you need your Cashfree PG secret key and the payload.
* The timestamp is present in the header `x-webhook-timestamp`.
* The actual signature is present in the header `x-webhook-signature`.
```bash signature-verification theme={"dark"}
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));
```
### SDK verification (built-in approach)
```javascript Node (express) theme={"dark"}
var express = require('express')
const { Cashfree, CFEnvironment } = require("cashfree-pg");
var app = express()
const cashfree = new Cashfree(
CFEnvironment.SANDBOX,
"{Client ID}",
"{Client Secret Key}"
);
app.post('/webhook', function (req, res) {
try {
cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"])
} catch (err) {
console.log(err.message)
}
})
```
```go golang theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature']
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```csharp csharp theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Manual verification (custom approach)
```javascript Node (Express) theme={"dark"}
function verify(ts, request){
const body = request.headers['x-webhook-timestamp'] + request.rawBody
const secretKey = ;
let generatedSignature = crypto.createHmac('sha256', secretKey).update(body).digest("base64");
const signature = request.headers['x-webhook-signature']
if(generatedSignature === signature) {
let jsonObject = JSON.parse(rawBody)
return jsonObject
}
throw new Error("Generated signature and received signature did not match.");
}
```
```go golang theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
clientSecret := ""
signatureString := ts + rawBody
hmacInstance := hmac.New(sha256.New, []byte(*clientSecret))
hmacInstance.Write([]byte(signatureString))
bytesData := hmacInstance.Sum(nil)
generatedSignature := base64.StdEncoding.EncodeToString(bytesData)
if generatedSignature == expectedSig {
var object interface{}
err := json.Unmarshal([]byte(rawBody), &object)
if err != nil {
return nil, errors.New("something went wrong when unmarshalling raw body")
}
if objectAsMapInterface, ok := object.(map[string]interface{}); ok {
if webhookType, ok := objectAsMapInterface["type"].(string); ok {
return "signatures match", nil
}
}
return "", nil
}
return nil, errors.New("generated signature and received signature did not match")
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$timestamp = getallheaders()['x-webhook-timestamp'];
$signature = getallheaders()['x-webhook-signature'];
$body = $timestamp . $rawBody;
$secretKey = "";
$genSignature = hash_hmac('sha256', $body, $secretKey, true);
$genSignatureBase64 = base64_encode($genSignature);
if($genSignatureBase64 == $signature) {
$jsonResponse = json_decode($rawBody);
return $jsonResponse;
}
throw new Exception("Generated signature and received signature did not match.");
}
```
```java Java theme={"dark"}
public Object generateSignature() {
try {
String data = headers.get("x-webhook-timestamp") + rawBody;
String secretKey = "";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
String signature = headers.get("x-webhook-signature")
if(computed_signature.equals(signature)) {
Gson g = new Gson();
Object response = g.fromJson(rawBody, Object.class);
return response;
}
throw new Exception("Generated signature and received signature did not match.");
} catch (Exception e) {
throw e;
}
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
raw_body = request.data
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature']
signatureData = timestamp+rawBody
message = bytes(signatureData, 'utf-8')
secretkey=bytes("",'utf-8')
generatedSignature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(generatedSignature, encoding='utf8')
if computed_signature == signature:
json_response = json.loads(rawBody)
return json_response
raise Exception("Generated signature and received signature did not match.")
```
### Webhook migration
Webhook endpoints have a specific API version set, for example, `2023-08-01`. To migrate from an older version to a newer version, follow these steps:
Create a new webhook endpoint with the new URL and new version. Subscribe to
the events you want to consume.
Update your event processing code and return a 200 response to prevent
delivery retries. Next, enable the new webhook endpoint that you created in
the previous step. At this point, every event is sent twice: once with the
old API version and once with the new one.
Update your code to ensure you can process the version of your new webhook
endpoint. Make sure you read the changelog and handle any breaking changes.
If events aren’t being correctly handled by your new code, first temporarily
disable the new webhook endpoint. After monitoring for some time, you can
permanently delete the old webhook endpoint.
snippets/related-topics-loader.mdx
# Webhook Security Checklist
Source: https://www.cashfree.com/docs/api-reference/payments/latest/webhooks/security-checklist
Harden Payment Gateway webhook endpoints with HTTPS, IP whitelisting, signature verification, SSL whitelisting, and authentication validation.
Secure webhook integration requires multiple layers of protection to safeguard your systems from unauthorised access and data tampering. This guide outlines the recommended security measures for your webhook endpoints.
The following table summarises the security controls and their implementation priority:
| Security control | Priority | Description |
| - | - | - |
| [Public endpoint URL](#public-endpoint-url) | Mandatory | Ensure your endpoint is publicly accessible over HTTPS. |
| [IP whitelisting](#ip-whitelisting) | Highly recommended | Restrict traffic to Cashfree's IP ranges. |
| [Signature verification](#signature-verification) | Highly recommended | Verify HMAC signature for each request. |
| [Secure Sockets Layer (SSL) whitelisting](#ssl-whitelisting) | Optional | Configure mutual TLS for enhanced security. |
| [Authentication validation](#authentication-validation) | Optional | Add custom authentication for additional protection. |
## Public endpoint URL
Your webhook endpoint must be publicly accessible over the internet for Cashfree to deliver notifications. Use this as your foundation and apply the security controls described in the following sections to protect the integration.
Ensure your endpoint URL uses HTTPS to encrypt data during transmission.
For instructions on adding and configuring webhook endpoints, refer to [Webhook configuration](/docs/payments/online/webhooks/configure).
## IP whitelisting
Restrict inbound traffic to accept requests only from Cashfree's known IP ranges. This control ensures your endpoint receives webhooks exclusively from legitimate Cashfree sources.
To configure IP whitelisting, complete the following steps:
1. Allow inbound traffic from the IP addresses listed below.
2. Configure your firewall rules to allow requests only from these IP ranges.
3. Block all other inbound traffic to your webhook endpoint.
Whitelist the following IP addresses on port 443:
**Production**
* 52.66.101.190
* 3.109.102.144
* 18.60.134.245
* 18.60.183.142
**Test/Sandbox (UAT)**
* 52.66.25.127
* 15.206.45.168
Cashfree may update its IP ranges periodically. Monitor the documentation for changes and update your firewall rules accordingly.
## Signature verification
All webhook notifications include a cryptographic signature using HMAC-based validation. Verify this signature to confirm the authenticity and integrity of each request.
To implement signature verification, follow these guidelines:
* Serve your webhook endpoint over **HTTPS** to protect data during transmission.
* Extract the signature from the webhook request headers.
* Verify the signature against the raw request body using your secret key.
* Receive the payload as **raw data** to prevent modifications before verification.
For partner webhooks, use the partner API key.
### Required headers
Validate the following mandatory headers in each webhook request:
| Header | Description |
| - | - |
| `x-webhook-signature` | The cryptographic signature for payload verification. |
| `x-webhook-timestamp` | The timestamp when the webhook was generated. |
| `x-webhook-version` | The API version of the webhook payload. |
For detailed implementation examples with SDK and manual verification code samples, refer to [Webhook signature verification](/docs/payments/online/webhooks/signature-verification).
## SSL whitelisting
For enhanced transport-level security, configure mutual TLS (mTLS) authentication between your systems and Cashfree.
To enable SSL whitelisting, you can:
* Provide your SSL certificate to Cashfree for addition to their trusted certificate sources.
* Add Cashfree's certificate to your system's trusted certificates.
This configuration ensures only mutually authenticated communication occurs between your systems and Cashfree.
SSL whitelisting is an optional security layer. Contact [Cashfree support](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) to configure mutual TLS authentication for your account.
## Authentication validation
If your endpoint requires custom authentication, configure Cashfree to include the necessary credentials in webhook requests.
Cashfree supports the following authentication methods:
* **Basic authentication**: Username and password credentials
* **Bearer tokens**: Token-based authentication
* **Custom headers**: Application-specific authentication parameters
To configure authentication for webhooks:
1. Share the required authentication parameters with Cashfree.
2. Implement server-side validation to verify the authentication fields in request headers.
3. Reject requests that fail authentication checks.
For more information on API authentication methods, refer to [Authentication](/docs/api-reference/authentication).
Implement signature verification at minimum to prevent payload manipulation through man-in-the-middle attacks.
# Webhook Troubleshooting
Source: https://www.cashfree.com/docs/api-reference/payments/latest/webhooks/troubleshooting
Diagnose missing triggers, failed endpoint additions, and duplicate deliveries for Cashfree Payment Gateway webhooks using dashboard logs and resends.
## Webhook did not trigger
If a webhook does not trigger for the specified endpoint:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Navigate to **Developer > Webhooks** under **Payment Gateway**, and select the **Logs** tab to check for failures and take necessary action.
Common reasons for webhook failure are:
* The endpoint returns a **500 error** or does not respond.
* The required event is not configured in the webhook settings.
3. Select **Batch Resend** to resend missed webhook events.
4. Select the **Batch Source** and enter **Entity IDs** in the **Batch Resend** modal.
5. Select **Resend**. Refer to the screenshot below:
## Cannot add a payment gateway webhook
To add a webhook endpoint URL:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Navigate to **Developer > Webhooks** under **Payment Gateway**, and select **Add Webhook Endpoint** in the **Configuration** tab.
3. Add the following details in the **Add Webhook Endpoint** modal:
* **Endpoint Details**: Enter the endpoint URL for the webhook and select the latest webhook version from the drop-down list.
**Note**:
When you add the endpoint URL, Cashfree sends a test `POST` request to check if it is valid and responsive. If the endpoint does not respond, select **Continue** and manually select the required events.
* **Add Policy**: Customise the retry policy and select the webhook events you want to subscribe to.
* **Summary**: Review and confirm your selections.
4. Select **Save** to complete the setup. Refer to the screenshot below:
## Receiving duplicate webhook events
If you receive duplicate webhook events, check for the following issues:
* **Multiple subscriptions to the same event**
* You may have subscribed to the same event multiple times across different webhook versions or for different URLs.
* Check each **URL Configuration** and remove duplicate subscriptions.
* **Retries due to downtime**
* If **Cashfree** or your server experiences downtime, Cashfree retries webhook deliveries to ensure event completion.
* **Prevent duplicate processing**
* Validate the **x-idempotency-header** in the webhook header.
* This header contains a unique hashed value for each webhook payload.
* Webhook versions from **2025-01-01** support this feature.
* To upgrade, see the [Webhook Migration](/docs/payments/online/webhooks/overview#webhook-migration) section.
## Configure webhooks for non-payment gateway products
To configure webhooks for products such as **Payouts**, **Subscriptions**, **Payments**, **Payment Links**, or **Secure ID**, go to the respective product webhook section on the Merchant Dashboard and add the required webhook endpoint URL.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/overview
Explore Cashfree Payment Gateway APIs for orders, payments, refunds, and more.
Cashfree's RESTful Payment Gateway API provides a robust and flexible interface for integrating payment solutions into your applications. The API uses predictable resource-oriented URLs, accepts JSON request bodies, returns JSON-encoded responses, and supports standard HTTP response codes and authentication. SDKs in popular programming languages help you integrate faster with pre-built handling for authentication, request or response formatting, and error handling.
We strongly recommend using [SDKs](/docs/api-reference/payments/sdk) to streamline the integration process and ensure optimal performance and security.
## What's new in v2026-01-01
Cashfree API v2026-01-01 is now available. This release includes the following changes:
* A new [Order Pay Authorise Only](/docs/api-reference/payments/latest/payments/order-pay-authorise-only) endpoint for authorising card payments without immediate capture.
* A new controlled subscription payment flow for UPI Autopay and card mandates, with six dedicated APIs for pre-debit notification and charge execution.
* New fields and parameters on Create Order, Order Pay, Create Payment Link, and Get All Settlements.
* A restructured Create Subscription request body, two new fields, and one removed field.
* Updated example payloads for all three Payment webhooks and five subscription webhook events, reflecting the v2026-01-01 response format.
* Breaking response schema changes to settlement endpoints and a removed field on Create Order. Review your integration before upgrading.
* Partner and PA Partner authentication on Collect from India import settlement APIs.
* A new NuGet package ID for the .NET SDK: `cashfree-dotnet-pg` from v6.0.7. The previous `cashfree_pg` package is no longer updated.
Expand the sections below for more details:
A new endpoint, [Order Pay Authorise Only](/docs/api-reference/payments/latest/payments/order-pay-authorise-only), is available for merchants with the `AUTHORIZE_ONLY` flag enabled on their account. Use it to authorise a card payment without capturing it immediately.
The request requires a `payment_session_id` and an `authorization_data` object containing the following 3DS authentication fields:
| Field | Description |
| - | - |
| `authentication_token` | 3DS authentication token |
| `directory_server_transaction_id` | Directory server transaction ID from the 3DS flow |
| `three_ds_server_transaction_id` | 3DS server transaction ID |
| `eci` | Electronic Commerce Indicator value |
| `token_number` | Network token number |
| `token_expiry_year` | Token expiry year |
| `token_expiry_month` | Token expiry month |
| `token_cryptogram` | Cryptogram for the token |
| `transaction_type` | One of `ALT_ID`, `TOKEN`, or `APPLE_PAY` |
The endpoint returns a `PaymentEntity` on success and requires no authentication (`security: []`).
v2026-01-01 introduces a controlled payment flow for UPI Autopay and card mandate subscriptions, giving you explicit control over when to notify your customers and when to execute the debit. This is a significant change if you need to comply with pre-debit notification rules for UPI Autopay and card mandates. See [Controlled Subscription Payments](/docs/api-reference/payments/latest/subscription/payment/controlled/overview) for the two-step flow, endpoints, and webhooks.
The controlled flow supports UPI Autopay and card mandates. eNACH and Physical NACH (PNACH) mandates are not supported.
**How it works**
The controlled flow replaces the automatic charge trigger with a two-step process you drive:
1. **Send a pre-debit notification**: Notify your customer of the upcoming charge amount before the debit window opens.
2. **Execute the charge**: Trigger the mandate debit after the compliance window elapses. The debit amount must exactly match the notified amount; a mismatch causes the issuing bank to decline the transaction.
**APIs**
| API | Method | Description |
| - | - | - |
| [Create Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-notification) | `POST /subscriptions/pay/controlled/notify-mandate` | Send a pre-debit notification to the customer |
| [Fetch Controlled Notification](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notification) | `GET /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}` | Retrieve a single notification |
| [Fetch All Controlled Notifications](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-notifications) | `GET /subscriptions/payments/{payment_id}/controlled/notifications` | List all notifications for a payment |
| [Create Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/create-controlled-execution) | `POST /subscriptions/pay/controlled/execute-mandate` | Trigger the mandate debit after the notification window |
| [Fetch Controlled Execution](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-execution) | `GET /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}` | Retrieve a single execution |
| [Fetch All Controlled Executions](/docs/api-reference/payments/latest/subscription/payment/controlled/fetch-controlled-executions) | `GET /subscriptions/payments/{payment_id}/controlled/executions` | List all execution attempts for a payment |
**Client environment headers: Order Pay and Get Eligible Payment Methods**
[Order Pay](/docs/api-reference/payments/latest/payments/order-pay) and [Get Eligible Payment Methods](/docs/api-reference/payments/latest/eligibility/get-eligible-payment-methods) now formally accept four optional device-context headers required for NPCI compliance. These headers were required in practice; they are now part of the spec with full validation.
| Header | Accepted values | Requirement |
| - | - | - |
| `x-client-device` | `mobile`, `desktop`, `tablet` | Required |
| `x-client-os` | `android`, `ios`, `windows`, `macos`, `linux`, `others` | Required |
| `x-client-browser` | `safari`, `chrome`, `firefox`, `edge`, `others` | Required |
| `x-client-rendering-type` | `mweb`, `webview`, `native` | Required when `x-client-device` is `mobile` |
***
**Offer filters and UPI app priority: Create Order**
Two new optional fields are available on `order_meta` in [Create Order](/docs/api-reference/payments/latest/orders/create-order):
* `offer_filters`: explicitly allow or deny specific offers for an order. Set `action` to `ALLOW` or `DENY` and provide a list of up to 25 offer values.
* `upi_app_priority`: control the display order of UPI apps on your checkout page. Accepted values: `gpay`, `phonepe`, `paytm`, `navi`, `cred`, `supermoney`, `amazonpay`, `bhim`, `mobikwik`, `airtel`, `popclub`, `kiwi`.
***
**Settlement status filter: Get All Settlements**
[Get All Settlements](/docs/api-reference/payments/latest/settlement-reconciliation/get-all-settlements) now accepts a new optional filter field `filters.settlement_status`. Pass an array of one or more of the following values to retrieve settlements by processing state:
* `SUCCESS`
* `PENDING`
* `PENDING_WITH_CASHFREE`
* `PENDING_WITH_BANK`
* `FAILED`
***
**Subscription support: Payment Links**
[Create Payment Link](/docs/api-reference/payments/latest/payment-links/create-payment-link) now accepts an optional `subscription` field to create recurring payment links backed by a plan. The plan is defined inline with the following fields:
| Field | Required | Description |
| - | - | - |
| `plan_id` | Yes | Unique identifier for the plan |
| `plan_name` | Yes | Display name of the plan |
| `plan_type` | Yes | Type of plan |
| `plan_max_amount` | Yes | Maximum charge amount per cycle |
| `plan_currency` | No | Currency code (default: INR) |
| `plan_amount` | No | Fixed amount per cycle |
| `plan_max_cycles` | No | Maximum number of billing cycles |
| `plan_intervals` | No | Number of intervals per cycle |
| `plan_interval_type` | No | Interval unit (day, week, month, year) |
| `plan_note` | No | Internal note for the plan |
Additional subscription-level fields: `authorization_amount`, `authorization_amount_refund` (boolean), `subscription_expiry_time`, and `subscription_first_charge_time`.
***
**PAR field: card payments**
`PayOrderRequest.payment_method.card` now accepts a `par` field (Payment Account Reference received from the card network). This is relevant for token-based and network-tokenised card flows.
v2026-01-01 introduces updated payload examples for the following webhook events, reflecting the new response fields introduced in this release.
| Webhook page | Events updated |
| - | - |
| [Payment webhooks](/docs/api-reference/payments/latest/payments/webhooks) | `PAYMENT_SUCCESS_WEBHOOK`, `PAYMENT_FAILED_WEBHOOK`, `PAYMENT_USER_DROPPED_WEBHOOK` |
| [Subscription webhooks](/docs/api-reference/payments/latest/subscription/webhooks) | `SUBSCRIPTION_AUTH_STATUS`, `SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED`, `SUBSCRIPTION_PAYMENT_SUCCESS`, `SUBSCRIPTION_PAYMENT_FAILED`, `SUBSCRIPTION_PAYMENT_CANCELLED` |
Payload examples for the remaining subscription webhook events will be updated to v2026-01-01 soon.
The following endpoints return a different response schema in v2026-01-01. Review and update your integration before switching to this version.
These are breaking changes. Existing code that reads from the previous response structure will fail silently or throw errors after upgrading to `x-api-version: 2026-01-01`.
**[Get Settlements by Order ID](/docs/api-reference/payments/latest/settlements/get-settlements-by-order-id): nested response object**
Previously returned a flat `SettlementEntity` object. Now returns `OrderSettlementEntity`, a nested object structured as follows:
| Sub-object | Key fields |
| - | - |
| `order_details` | `order_id`, `order_amount`, `order_currency` |
| `payment_details` | `cf_payment_id`, `payment_amount`, `service_charge`, `service_tax`, `charge_type`, `charged_to` |
| `customer_details` | `customer_id`, `customer_email`, `customer_phone` |
| `settlement_details` | `cf_settlement_id`, `settlement_amount`, `settlement_utr`, `settlement_status`, `settled_on` |
Update any code that reads `cf_payment_id`, `service_charge`, `settlement_amount`, or other fields directly from the response root.
***
**[Get All Settlements](/docs/api-reference/payments/latest/settlement-reconciliation/get-all-settlements): paginated response**
Previously returned a single flat settlement record. Now returns a paginated `GetAllSettlementsResponse`:
```json theme={"dark"}
{
"cursor": "string",
"limit": 10,
"data": [
{
"cf_settlement_id": "string",
"status": "SUCCESS | PENDING | PENDING_WITH_CASHFREE | PENDING_WITH_BANK | FAILED",
"settlement_utr": "string",
"payment_from": "date",
"payment_till": "date",
"settlement_initiated_on": "date",
"settlement_processed_on": "date",
"payment_amount": 0,
"pg_service_charge": 0,
"pg_service_tax": 0,
"adjustment": 0,
"settlement_charge": 0,
"settlement_tax": 0,
"split_service_charge": 0,
"split_service_tax": 0,
"vendor_commission": 0,
"amount_settled": 0,
"charge_type": "PREPAID | POSTPAID | SURCHARGE | PREPAID_SURCHARGE | POSTPAID_SURCHARGE",
"settlement_type": "string"
}
]
}
```
Update any code that reads from the flat settlement response to iterate over `data` and handle pagination using `cursor`.
***
**[Mark Order for Settlement](/docs/api-reference/payments/latest/settlements/mark-order-for-settlement): HTTP status code and response body changed**
Previously returned HTTP `202` with an empty `{}` body. Now returns HTTP `200` with the following body:
```json theme={"dark"}
{
"order_id": "string",
"meta_data": {
"cbriks_id": "string",
"settlement_date": "date"
}
}
```
Update any code that checks for a `202` status or expects an empty response body.
***
**[Get Order Extended](/docs/api-reference/payments/latest/orders/get-order-extended): `offer` renamed to `offers` (array)**
The `offer` field (a single object of type `OfferExtendedDetails`) in `OrderExtendedDataEntity` is now `offers` (an array of `OfferExtendedDetails` objects). Update field references from `offer` to `offers` and handle the array structure.
The following fields have been removed in v2026-01-01. Requests that include these fields will either be ignored or return a validation error.
| Field | Endpoint | Reason |
| - | - | - |
| `CreateOrderRequest.bbps` | [Create Order](/docs/api-reference/payments/latest/orders/create-order) | The BBPS-specific fields `bill_fetch_ref_id`, `biller_id`, and `agent_id` are no longer accepted on the Create Order request body. |
The .NET SDK is now published under a new NuGet package ID starting from version 6.0.7.
**Install the new package:**
```bash theme={"dark"}
dotnet add package cashfree-dotnet-pg
```
| | Package | Version |
| - | - | - |
| **New** | `cashfree-dotnet-pg` | 6.0.7 and above |
| **Previous** | `cashfree_pg` | Final version: 5.0.6 (no longer updated) |
No code changes are required beyond updating the package reference. All future .NET SDK releases will be published only under `cashfree-dotnet-pg`. For the full version history, see the [.NET SDK changelog](/docs/payments/developers/changelog/dotnet).
The [Subscription APIs](/docs/api-reference/payments/latest/subscription/overview) in v2026-01-01 include a restructured request body, two new request fields, and one removed field on [Create Subscription](/docs/api-reference/payments/latest/subscription/create-subscription).
**Restructured request body**
The `CreateSubscriptionRequest` previously used a flat structure where all fields were at the top level. In v2026-01-01, fields are grouped into four nested objects for clarity and consistency:
| Object | Fields |
| - | - |
| `customer_details` | `customer_name`, `customer_email`, `customer_phone`, bank account fields |
| `plan_details` | `plan_id`, `plan_name`, `plan_type`, `plan_amount`, `plan_max_amount`, `plan_currency`, and related plan configuration |
| `authorization_details` | `authorization_amount`, `authorization_amount_refund`, `payment_methods` |
| `subscription_meta` | `return_url`, `notification_channel`, `session_id_expiry` |
This is a breaking change. Update your Create Subscription integration to use the new nested structure before switching to `x-api-version: 2026-01-01`.
***
**New field: `subscription_tags`**
`CreateSubscriptionRequest` now accepts `subscription_tags`, a free-form object for attaching up to 10 custom key-value string entries to a subscription. A commonly used key is `psp_note`, which sets the note displayed to the customer in their payment service provider app or on their bank statement. When using `psp_note`, the value must be between 1 and 255 characters.
***
**New field: `subscription_payment_splits`**
`CreateSubscriptionRequest` now accepts `subscription_payment_splits`, an array of vendor split items. Each item specifies a `vendor_id` and a `percentage`, allowing subscription charges to be distributed across multiple vendors at the time of collection.
***
**Removed field: `customer_bank_account_holder_name`**
The `customer_bank_account_holder_name` field has been removed from `CreateSubscriptionRequest`. This field is no longer accepted in v2026-01-01.
***
**New: webhook signature verification**
A dedicated [Signature Verification](/docs/api-reference/payments/latest/subscription/webhook-signature) page is now available for subscription webhooks, covering how to validate the `x-webhook-signature` header to confirm event authenticity before processing.
For the controlled subscription payment flow, see the [New: controlled subscription payment flow](#) section above.
The following Collect from India import settlement endpoints in v2026-01-01 now support Partner and PA Partner authentication, in addition to standard merchant authentication:
| API | Method |
| - | - |
| [Get Import Settlement Details for an Order](/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-details) | `GET /import/orders/{order_id}/settlements` |
| [Get Import Settlement Recon Details](/docs/api-reference/payments/latest/international-payments/collect-from-india/get-import-settlement-recon-details) | `POST /import/settlements/recon` |
Use Partner authentication when calling these APIs on behalf of a merchant. For Payment Aggregator (PA) flows, select the PA Partner option and pass `x-partner-type` with the value `PA`.
For more information on partner headers, see [Partner authentication](/docs/api-reference/authentication#partner-authentication).
To use this version, set `x-api-version: 2026-01-01` in all request headers. If you are using the previous version, see the [v2025-01-01 API reference](/docs/api-reference/payments/previous/v2025-01-01/overview).
Create a softPOS terminal for in-person card acceptance.
The videos below walk through testing Payment Gateway APIs in Postman and using this API reference.
Testing APIs in Postman
Documentation Walkthrough
## Getting started
Use the following resources to begin implementing Payment Gateway APIs:
Integrate the Payment Gateway with web, mobile, and server SDKs for orders, checkout, and tokenisation
View default limits per minute, monitor usage on the dashboard, and request higher limits when needed
# Preauthorisation
Source: https://www.cashfree.com/docs/api-reference/payments/preauth-journey
Run the Cashfree preauthorisation flow in sandbox: create an order, hold funds on cards or UPI, and capture or void the authorised amount.
You can run through the full preauthorisation lifecycle in the **sandbox** environment using the same APIs as in production. For product behaviour, supported instruments, and capture or void rules, refer to [Preauthorisation](/docs/payments/features/pre-authorisation).
In the **sandbox** environment, preauthorisation for API-driven flows works only for **card** and **UPI** when you use the seamless **link** channel on the [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) API. Other payment modes are not supported in this sandbox preauthorisation path.
## Prerequisites
Ensure the following are in place before you start the sandbox flow:
* Use the sandbox base URL: `https://sandbox.cashfree.com/pg`.
* Send a supported API version in `x-api-version` (for example, `2025-01-01`), consistent with your integration.
* Use `x-client-id` and `x-client-secret` to authenticate calls to the [Create Order](/docs/api-reference/payments/latest/orders/create-order) API and the [Preauthorisation](/docs/api-reference/payments/latest/payments/preauthorisation) API. The [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) API does not require these headers. You can call it directly from the client.
## Preauthorisation flow
Complete a preauthorisation transaction in the sandbox by following the three stages below.
### Create an order
For sandbox preauthorisation testing, set `order_note` to **`preauth_transaction`** in your [Create Order](/docs/api-reference/payments/latest/orders/create-order) API request. If this value is missing or incorrect, Cashfree may not recognise the order as a sandbox preauthorisation transaction.
```bash CURL highlight={16} theme={"dark"}
curl --request POST 'https://sandbox.cashfree.com/pg/orders' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--header 'x-api-version: 2025-01-01' \
--header 'x-client-id: ' \
--header 'x-client-secret: ' \
--data-raw '{
"customer_details": {
"customer_email": "customer@example.com",
"customer_phone": "9999999999",
"customer_name": "Test Customer",
"customer_id": "customer_001"
},
"order_amount": 100,
"order_currency": "INR",
"order_note": "preauth_transaction",
"order_meta": {
"return_url": "https://example.com/return",
"notify_url": "https://example.com/webhooks/cashfree"
}
}'
```
Save the **`order_id`** and **`payment_session_id`** from the response. You will need both values for the [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) API.
`order_tags`, `order_meta`, and customer fields follow the usual [Create Order](/docs/api-reference/payments/latest/orders/create-order) API rules. Use a valid `notify_url` if you rely on [Payment Webhooks](/docs/api-reference/payments/latest/payments/webhooks) for payment status.
### Initiate payment with Order Pay API
Send the [Order Pay](/docs/api-reference/payments/latest/payments/order-pay) API request (**`POST /orders/sessions`**) with the `payment_session_id` from the [Create Order](/docs/api-reference/payments/latest/orders/create-order) API. Set **`channel`** to **`link`** so the response returns a redirect URL for the customer.
#### Card payments (link channel)
Use the following request to initiate a card preauthorisation payment. Replace the placeholder card details with values from the [Data to Test Integration](/docs/api-reference/payments/data-to-test-integration) page.
```bash CURL theme={"dark"}
curl --request POST 'https://sandbox.cashfree.com/pg/orders/sessions' \
--header 'Content-Type: application/json' \
--header 'x-api-version: 2025-01-01' \
--data '{
"payment_session_id": "",
"payment_method": {
"card": {
"channel": "link",
"card_number": "4111111111111111",
"card_expiry_mm": "06",
"card_expiry_yy": "27",
"card_cvv": "900",
"card_holder_name": "Test User"
}
},
"save_instrument": true
}'
```
Open the URL returned under `data.url` (when `action` is `link`) to complete the payment in the browser.
#### UPI payments (link channel)
For UPI preauthorisation, set **`authorize_only`** to **`true`** and pass an **`authorization`** object with the following fields:
| Field | Description |
| :- | :- |
| `approve_by` | The deadline by which the customer must approve the request (ISO 8601 with offset, for example `2025-12-20T19:20:12+05:30`). |
| `start_time` | The time at which the hold or mandate window starts (ISO 8601, UTC `Z` allowed). |
| `end_time` | The time until which the hold applies (ISO 8601). You can capture or void using the [Preauthorisation](/docs/api-reference/payments/latest/payments/preauthorisation) API while the authorisation is valid, subject to [Preauthorisation](/docs/payments/features/pre-authorisation) product rules. |
```bash CURL theme={"dark"}
curl --request POST 'https://sandbox.cashfree.com/pg/orders/sessions' \
--header 'Content-Type: application/json' \
--header 'x-api-version: 2025-01-01' \
--data '{
"payment_session_id": "",
"payment_method": {
"upi": {
"channel": "link",
"authorize_only": true,
"authorization": {
"approve_by": "2025-12-20T19:20:12+05:30",
"start_time": "2025-12-19T12:34:34Z",
"end_time": "2026-01-01T12:34:34Z"
}
}
}
}'
```
Complete the UPI approval flow in sandbox using the test UPI VPA values from the [Data to Test Integration](/docs/api-reference/payments/data-to-test-integration) page.
### Capture or void the payment
Once you simulate the payment as successfully authorised in sandbox, call the [Preauthorisation](/docs/api-reference/payments/latest/payments/preauthorisation) API (`POST /orders/{order_id}/authorization`) with the same **`order_id`** you received when you created the order. Use either action below depending on whether you want to collect or release the funds:
```bash Capture theme={"dark"}
curl --request POST 'https://sandbox.cashfree.com/pg/orders//authorization' \
--header 'Content-Type: application/json' \
--header 'x-api-version: 2025-01-01' \
--header 'x-client-id: ' \
--header 'x-client-secret: ' \
--data '{
"action": "CAPTURE",
"amount": 100
}'
```
```bash Void theme={"dark"}
curl --request POST 'https://sandbox.cashfree.com/pg/orders//authorization' \
--header 'Content-Type: application/json' \
--header 'x-api-version: 2025-01-01' \
--header 'x-client-id: ' \
--header 'x-client-secret: ' \
--data '{
"action": "VOID"
}'
```
You can send `amount` as a number or as a decimal string such as `"100.00"`. The amount must not exceed the authorised order amount. Cashfree supports partial capture. A void request does not require an amount.
You can capture or void each authorisation only once. For business rules such as time limits, refer to [Preauthorisation](/docs/payments/features/pre-authorisation).
## Go live
The sandbox flow above and the production flow use the same APIs. Two things change when you go live:
* **Base URL**: Replace `https://sandbox.cashfree.com/pg` with `https://api.cashfree.com/pg`.
* **`order_note`**: The value `preauth_transaction` is a **sandbox-only** flag that tells Cashfree to treat the order as a preauth test. In production, `order_note` follows your account configuration. Check with your integration or support. Contact if you already use this field for other purposes.
Before you process live transactions, ensure preauthorisation is enabled on your account. Submit a request through the [Preauthorisation feature request](/docs/payments/features/pre-authorisation#preauthorisation-feature-request) form.
## Best practices
Follow these practices when integrating preauthorisation in sandbox and production:
* **Confirm authorisation before capturing or voiding:** Do not call capture or void based on a client-side redirect alone. Set `order_meta.notify_url` in the [Create Order](/docs/api-reference/payments/latest/orders/create-order) API and wait for the authorisation-success event via [Payment Webhooks](/docs/api-reference/payments/latest/payments/webhooks) on your server before you proceed.
* **Use idempotency keys for capture and void requests:** Each authorisation can be captured or voided only once. If a network error leaves the outcome uncertain, resend the same request with the **`x-idempotency-key`** header so Cashfree returns the original result instead of rejecting a duplicate. Refer to [API Best Practices](/docs/api-reference/api-best-practices) for usage details.
* **Capture within the time limit:** If you do not capture or void an authorisation within seven days, the hold expires and the funds are released to the customer automatically. Build a reminder or scheduled job so authorised orders do not go unresolved. Refer to [Preauthorisation](/docs/payments/features/pre-authorisation) for the full set of timing rules.
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/endpoints
Get the production and test base URLs for the legacy Subscriptions v1 APIs, plus the API key authentication details you need to send requests.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you will see your AppId and SecretKey.
Cashfree expects the API key to be included in all API requests to the server. Use the endpoint **/api/v1/credentials/verify** to verify your credentials.
All API responses are in JSON format. POST requests should include ContentType: application/json
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
| Test | [https://test.cashfree.com/](https://test.cashfree.com/) |
# Physical Mandates
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/physical-mandates
Use the Cashfree Subscriptions v1 APIs to create and manage physical NACH mandates using customer signature and bank account details.
Physical mandate is the process of authorisation where the customer requires only their signature and bank account details. There is no requirement to have a Debit Card or Netbanking enabled to set up the mandate. Read more about [Physical Mandates](/docs/payments/subscription/payment-modes#bank-account-physical-mandate).
List of Physical Mandates APIs
| API name | Description |
| :- | :- |
| [Create Seamless Subscription API](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | Use this API to create a subscription by providing a custom payment experience to your customers by specifying the plan ID and the customer details. You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. TPV is applicable only for eNACH and UPI. |
| [Upload File](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-authorization-request) | Use this API to upload the Physical Nach registration forms that contain your customer’s bank account details and signature. Use the fileId you get in the response in the "Create Auth Seamless PhysicalMandate API". |
| [Create Auth Seamless Physical Mandate](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/get-authorization-status) | Use this API to create an Authorisation request for your customer. For Physical mandates, this API lets Cashfree know that the nach form is to be raised to the bank for successfully registering the mandate in production. |
| [Update Authorisation Status](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/update-authorization-status) | Use this API to update the status of the authorisation from INITIALIZED to SUCCESS or FAILED. Provide the authID and the payment status. This is applicable only in the test environment. |
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/rate-limits
Understand the per-minute rate limits for Cashfree Subscriptions v1 APIs and how to avoid throttling on recurring payment calls.
The rate limit value shows the number of API calls that were made in a minute. For example, if the rate limit is 400 - it means you can call a maximum of 400 API calls in a minute.
**Rate Limits in Sandbox & Production:**\
We use rate limiting for all endpoints. Rate limiting is based on your IP and your account Id. By default, the following rate limits are applied per minute.
| API | Rate limit value per minute | Rate limit type |
| :- | :- | :- |
| [Create Plan](/docs/api-reference/payments/latest/subscription/create-a-plan) | 60 | Account |
| [Create Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/create-a-subscription) | 60 | Account |
| [Create Seamless Subscription](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | 60 | Account |
| [Get Subscription Details](/docs/api-reference/payments/previous/subscriptionsv1/subscription/get-subscription-details) | 60 | Account |
| [Get All Subscription Payments](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-subscription-payments) | 60 | Account |
| [Get Single Subscription Payment](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-single-subscription-payment) | 60 | Account |
| [Cancel Charge](/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription-charge) | 60 | Account |
| [Charge Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/charge-subscription) | 60 | Account |
| [Charge Retry](/docs/api-reference/payments/previous/subscriptionsv1/subscription/retry-subscription-charge) | 60 | Account |
| [Activate Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/activate-subscription) | 60 | Account |
| [Get Payment Details using Merchant Txn ID](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-payment-by-merchant-transaction-id) | 60 | Account |
| [Update Recurring-amount](/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-recurring-amount) | 60 | Account |
# Redirection Payload After Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/redirection-payload-after-authorization
Understand the POST parameters Cashfree returns to your subscription `returnUrl` once the customer authorises on Subscriptions v1 APIs.
## Request configuration
| Method | Parameter type | URL |
| - | - | - |
| cf\_subReferenceId | Long | Unique Id which was generated when the subscription was created (Numeric) |
| cf\_subscriptionId | String | Checksum used to authenticate the transaction |
| cf\_authAmount | Float | The money that was charged to authorise the subscription |
| cf\_referenceId | Long | The referenceId/transactionId of authorisation in PG |
| cf\_status | String | Status of the subscription. In the returnUrl, the response should be ACTIVE or BANK\_APPROVAL\_PENDING if the authorisation was successful or INITIALIZED if the authorisation failed. |
| cf\_message | String | A brief note about the payment. |
| signature | String | The hash of all parameters in the request generated using secretKey. |
| cf\_umrn | String | The unique identifier associated with a mandate. Applicable if the payment mode is eMandate. |
| cf\_checkoutStatus | String | The subscription checkout status. The status can be SUCCESS, FAILED, SUCCESS\_DEBIT\_PENDING, SUCCESS\_TOKENIZATION\_PENDING. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_mode | String | The checkout payment mode. Modes - NPCI\_SBC, SBC\_UPI, SBC\_CREDIT\_CARD, SBC\_DEBIT\_CARD. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_subscriptionPaymentId | String | The subscription payment ID. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_umn | String | The unique identifier is associated with a mandate. This is applicable if the payment mode is **UPI**. |
🚧 **Return URL**
Once your customer has completed the checkout on the OTP page, we will redirect them back to your `return_url`. This will be a link-based redirection, so if you have provided a return\_url of the format - `https://b8af79f41056.eu.ngrok.io?order_id={order_id}` - your customer will be redirected to the URL - `https://b8af79f41056.eu.ngrok.io?order_id=order_271vfuhh1o4h6bQIigqyOx74YiJ1T`.
# Create Authorization Request
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-authorization-request
post /api/v2/subscriptions/seamless/authorization
Use this API to create an authorisation request for a particular subscription. This API is applicable only if you have created a subscription via Create Seamless Subscription API. Use the response of the Create Seamless Subscription API to get the supported banks for E_MANDATE and supported UPI handles.
# Create Seamless Subscription with Plan ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id
post /api/v2/subscriptions/seamless/subscription
Use this API to create a subscription by providing a custom payment experience to your customers by specifying the plan ID and the customer details. You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. TPV is applicable only for eNACH and UPI.
# Get Authorization Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/get-authorization-status
get /api/v2/subscriptions/seamless/authorization/{authId}/poll
Use this API to fetch the status of the authorisation request. Provide the authID that is available in the Create Auth API response. This API is applicable only if you have created a subscription using the Create Seamless Subscription API
# Update Authorization Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/update-authorization-status
post /api/v2/subscriptions/seamless/authorization/simulate
Use this API to update the status of the authorisation from INITIALIZED to SUCCESS or FAILED. Provide the authID and the payment status. This is applicable only in the test environment.
# Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription-postman-collection
Download the ready-made Postman collection for the legacy Subscriptions v1 APIs and start testing mandate, charge, and refund calls in minutes.
Get started quickly with Cashfree's Subscription APIs by downloading the collection and importing it in Postman.
Download Cashfree Subscription Postman Collection
# Create Subscription Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription-refund/create-subscription-refund
post /api/v2/subscriptions/create-refund
Use this API to create a refund for the payment of a Subscription. Only one of paymentId or merchantTxnId should be passed. If both are passed then the request will be rejected.
# Get Subscription Refund Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription-refund/get-subscription-refund-details
get /api/v2/subscriptions/refund-details
Use this API to fetch the status of the refund of a Subscription. Only one of paymentId or merchantRefundId should be passed as query parameter. If both are passed then the request will be rejected.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription-refund/refund-apis-overview
Use the Cashfree Subscriptions v1 APIs to initiate, retrieve, and reconcile refunds on recurring payments.
## List of subscription refund APIs
| API name | Description |
| :- | :- |
| [Create Refund](/docs/api-reference/payments/previous/subscriptionsv1/subscription-refund/create-subscription-refund) | Use this API to create a refund for the payment of a Subscription. |
| [Get Refund](/docs/api-reference/payments/previous/subscriptionsv1/subscription-refund/get-subscription-refund-details) | Use this API to fetch the status of the refund of a Subscription. |
# Activate Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/activate-subscription
post /api/v2/subscriptions/{subReferenceId}/activate
Use this API to activate a subscription that is in ONHOLD state. For periodic subscriptions, the next charge date is calculated for the next cycle.
# Cancel Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription
post /api/v2/subscriptions/{subReferenceId}/cancel
Use this API to cancel the subscription. After a successful cancellation, the subscription status will move to "CANCELLED", and the customer will no longer be charged. Subscription, once cancelled, cannot be reactivated.
# Cancel Subscription Charge
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription-charge
post /api/v2/subscription/{subReferenceId}/charge/{chargeId}/cancel
Use this API to cancel a transaction that is in the INITIALIZED state.
# Charge Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/charge-subscription
post /api/v2/subscriptions/{subReferenceId}/charge
Charge a specific subscription using the provided subscription reference ID.
# Create a Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/create-a-subscription
post /api/v2/subscriptions/nonSeamless/subscription
Use this API to create a subscription by specifying the plan ID or plan Info and customer details.You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. TPV is applicable only for eNACH and UPI Autopay. The Auth Link received in the response will be redirected to a link hosted on cashfree.com. Once the authorization is complete, your customer will be redirected to returnUrl. Store the subReferenceId as this is the unique ID generated by Cashfree for the subscription and will be required for subsequent operations.
# Create a Subscription Plan
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/create-a-subscription-plan
post /api/v2/subscription-plans
Use this API to create a new plan. Provide the planId, planName, and the plan type(PERIODIC/ON_DEMAND).
# Fetch Payment by Merchant Transaction ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-payment-by-merchant-transaction-id
get /api/v2/subscriptions/payments/merchantTxnId/{merchantTxnId}
Fetch details of a specific payment associated with a given merchant transaction ID.
# Fetch Single Subscription Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-single-subscription-payment
get /api/v2/subscriptions/{subReferenceId}/payments/{paymentId}
Fetch details of a specific payment associated with a subscription reference ID.
# Fetch Subscription Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-subscription-payments
get /api/v2/subscriptions/{subReferenceId}/payments
Fetch all payments associated with a specific subscription reference ID.
# Generate Transaction Return Summary
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/generate-transaction-return-summary
post /api/v2/subscriptions/charge/{paymentId}/transaction-return-summary/generate
Use this API to generate transaction return summary for failed transactions (insufficient balance). You will have to hit the API again to check the status of the transaction return summary, or go to the [Merchant Dashboard](https://merchant.cashfree.com/merchants) and download the same.
# Get Subscription Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/get-subscription-details
get /api/v2/subscriptions/{subReferenceId}
Fetch the details of a subscription for a specific subscription reference ID.
# Pause Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/pause-subscription
put /api/v2/subscriptions/{subReferenceId}/pause-subscription
Use this API to temporarily pause a subscription. Once this API is called, the subscription status will be updated to "PAUSED". Only a periodic subscription can be paused. To reactivate the subscription, you can use the Activate Subscription API.
# Port Mandate
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/port-mandate
post /api/v2/subscriptions/mandate/port
Use this API to import an existing mandate into the Cashfree subscription system. This is applicable where mandates are already created with another provider or system. By porting the mandate, you can manage the subscription within Cashfree's ecosystem.
# Retry Subscription Charge
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/retry-subscription-charge
post /api/v2/subscriptions/{subReferenceId}/charge-retry
Applicable only for Periodic Subscriptions. Use this API to retry the last failed payment for a subscription in ON HOLD state. On a successful retry, the subscription gets activated. Use the Retry API when the subscription debit has failed at your customer's end. Only one retry attempt is allowed per day and 3 retry attempts are allowed for a failed transaction within the cycle. Retry is not allowed if the current cycle expires.
# Update Charge Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-charge-status
put /api/v2/subscriptions/charge/{paymentId}/simulate
Use this API to update the status of the charge from PENDING to SUCCESS or FAILED. This is applicable only in the test environment.
# Update Recurring Amount
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-recurring-amount
put /api/v2/subscriptions/{subReferenceId}/recurring-amount
Update the recurring amount for a specific subscription reference ID.
# Upload Physical Mandate File
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/subscription/upload-physical-mandate-file
post /api/v2/subscriptions/physical-mandate-file/upload
Use this API to upload the Physical Nach registration forms that contain your customer’s bank account details and signature. Use the fileId you get in the response in the "Create Auth Seamless PhysicalMandate API".
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/subscriptionsv1/webhooks
Learn how Cashfree sends server callbacks for Subscriptions v1 events so you can react to mandate, charge, and refund status changes in real time.
## Configure webhook
* You can now configure webhooks from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). See [Configure webhooks](/docs/payments/online/webhooks/configure) to know how to add a new webhook.
* Ensure you do not process duplicate events.
Webhooks will be sent to your configured endpoint as a POST request with the body containing the various parameters specifying the details of each event. Each request contains an event parameter that identifies its type.
Below are the various events that can be sent to your webhook endpoint.
* SUBSCRIPTION\_STATUS\_CHANGE
* SUBSCRIPTION\_NEW\_PAYMENT
* SUBSCRIPTION\_PAYMENT\_CANCELLED
* SUBSCRIPTION\_PAYMENT\_DECLINED
* SUBSCRIPTION\_AUTH\_STATUS
* REFUND\_STATUS
## SUBSCRIPTION\_STATUS\_CHANGE
The parameters "cf\_subscriptionId" will be available from 31st July 2023 onwards.
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | This event is triggered whenever the subscription status changes. The value for this event is SUBSCRIPTION\_STATUS\_CHANGE. |
| cf\_subReferenceId | Integer | A unique Id which was generated when the subscription was created. |
| cf\_status | String | The new status of the subscription. See [Subscription lifecycle](/docs/payments/subscription/create#subscription-lifecycle) for information on subscription statuses. |
| cf\_lastStatus | String | The old status of the subscription. See [Subscription lifecycle](/docs/payments/subscription/create#subscription-lifecycle) for information on subscription statuses. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| cf\_subscriptionId | String | The subscription Id passed by the merchant while creating the subscription |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information. |
***
## SUBSCRIPTION\_NEW\_PAYMENT
The parameters "cf\_subscriptionId" and "cf\_merchantTxnId" will be available from 31st July 2023 onwards.
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | This event is triggered whenever there is a successful new payment for an authorised subscription. The value for this event is SUBSCRIPTION\_NEW\_PAYMENT. |
| cf\_subReferenceId | Integer | A unique Id which was generated when the subscription was created. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| cf\_orderId | String | The unique order ID against which the payment is made. |
| cf\_paymentId | Integer | The unique paymentId for the payment. |
| cf\_amount | Float | The amount charged for payment. |
| cf\_subscriptionId | String | The subscription Id passed by the merchant while creating the subscription |
| cf\_merchantTxnId | String | An id unique to the transaction that merchant passed while raising a transaction for a subscription. |
| cf\_referenceId | Integer | The unique txnId for the payment. |
| cf\_retryAttempts | Integer | The number of payment retries. This is applicable for failed payments. |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information. |
***
## SUBSCRIPTION\_PAYMENT\_CANCELLED
The parameters "cf\_subscriptionId" and "cf\_merchantTxnId" will be available from 31st July 2023 onwards.
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | This webhook is triggered when the charge is cancelled. The value for this event is PAYMENT\_CANCELLED\_WEBHOOK. |
| cf\_subReferenceId | Integer | A unique ID which was generated when the subscription was created. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| orderId | String | The unique order ID against which the payment is made. |
| paymentId | Integer | The unique paymentId for the payment. |
| amount | Float | The amount charged for payment. |
| subscriptionId | String | The subscription Id passed by the merchant while creating the subscription |
| merchantTxnId | String | An id unique to the transaction that the merchant passed while raising a transaction for a subscription. |
| referenceId | Integer | The unique txnId for the payment. |
| retryAttempts | Integer | The number of payment retries. This is applicable for failed payments. |
| reasons | String | Failure reason |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information. |
***
## SUBSCRIPTION\_PAYMENT\_DECLINED
The parameters "cf\_subscriptionId" and "cf\_merchantTxnId" will be available from 31st July 2023 onwards.
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | This event is triggered whenever a payment fails for an authorised subscription. The value for this event is SUBSCRIPTION\_PAYMENT\_DECLINED. |
| cf\_subReferenceId | Integer | A unique Id which was generated when the subscription was created. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| cf\_paymentId | Integer | The unique paymentId for the payment. |
| cf\_amount | Float | The amount charged for payment. |
| cf\_subscriptionId | String | The subscription Id passed by the merchant while creating the subscription |
| cf\_merchantTxnId | String | An id unique to the transaction that merchant passed while raising a transaction for a subscription. |
| cf\_referenceId | Integer | The unique txnId for the payment. |
| cf\_retryAttempts | Integer | The number of payment retries. This is applicable for failed payments. |
| cf\_reasons | String | A possible reason for failure. |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information. |
***
## SUBSCRIPTION\_AUTH\_STATUS
The parameters "cf\_subscriptionId" and "cf\_merchantTxnId" will be available from 31st July 2023 onwards.
The event is triggered when the checkout is completed by the customer for success and failed cases.
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | The event is triggered when the checkout fails The value for this event is SUBSCRIPTION\_AUTH\_STATUS. |
| cf\_subReferenceId | Integer | A unique Id which was generated when the subscription was created. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| cf\_subscriptionStatus | String | The status of the subscription. See [Subscription lifecycle](/docs/payments/subscription/create#subscription-lifecycle) for information on subscription statuses. |
| cf\_authStatus | String | Checkout status. Allowed value: FAILED |
| cf\_subscriptionId | String | The subscription Id passed by the merchant while creating the subscription |
| cf\_merchantTxnId | String | An id unique to the transaction that merchant passed while raising a transaction for a subscription. |
| cf\_authTimestamp | String \[format - yyyy-MM-dd HH:mm:ss] | Checkout initiated timestamp. |
| cf\_authFailureReason | String | Possible checkout failure. It will be empty for successFul authStatus change. |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information. |
***
## REFUND\_STATUS
| Parameter | Type | Description |
| :- | :- | :- |
| cf\_event | String | This event is triggered whenever a refundStatus of a transaction will be success or failed or cancelled. The value for this event is REFUND\_STATUS\_WEBHOOK. |
| cf\_subReferenceId | Integer | A unique Id that was generated when the subscription was created. |
| cf\_eventTime | String \[format - yyyy-MM-dd HH:mm:ss] | The time when the event was dispatched. |
| cf\_sub\_refund\_id | String | A unique ID that is generated for every refund at the initialisation of refund state. |
| cf\_payment\_id | Integer | The unique payment ID for the payment. |
| cf\_refund\_amount | BigDecimal | The amount that is to be refunded |
| cf\_refund\_id | Integer | The refund ID is a unique ID generated when processing a refund. |
| cf\_merchant\_refund\_id | String | A unique ID for the transaction that merchant passed while raising a refund. |
| cf\_refund\_status | String | Refund status of the transaction. |
| signature | String | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. See [Verify signature](#verify-signature) for more information |
***
## Verify signature
Verifying the signature (passed along with the POST parameters) is mandatory before you process any response. We also recommend whitelisting only our IP address on your webhook endpoint.
Follow the steps below to calculate & verify the signature on the webhook payload:
1. Please sort the webhook payload in alphabetical order based on fields which are starting with field cf\_.
2. Append the key-value pair w/o using any delimiter and create a string.
3. Hash the string using the secret key which will be provided to you.
4. Encode the hashed string using base64 and generate the signature.
**Example** :
1. Sample web hook payload -
```
{
"cf_retryAttempts":0,
"cf_amount":1,
"cf_event":"SUBSCRIPTION_NEW_PAYMENT",
"cf_eventTime":"2022-01-10 10:03:50",
"cf_paymentId":1,
"cf_referenceId":2,
"cf_subReferenceId":3,
"signature":"tT9pXZkT2LuDzXacYDUaur7EX3dJgNKcITHQng44tns="
}
```
2. Sorted web hook payload -
3. Signature generated using encoding with secret key -
tT9pXZkT2LuDzXacYDUaur7EX3dJgNKcITHQng44tns=
4. Generated signature should match the signature present in the webhook payload.
Following code snippets show you how to generate and verify the signature. This should not be assumed production-ready, kindly consider adding necessary validation before processing.
```java Java theme={"dark"}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.*;
public class SignatureVerification {
private static final String MAC_SHA256_ALGO = "HmacSHA256";
private static final String SECRET_KEY = "ac7960e7995536f0177fd210f3b3937fc2d974a4"; // Merchant secret key
public boolean verifySignature(Map payload) {
String signature = String.valueOf(payload.get("signature"));
String computedSignature = generateSignature(payload);
return signature != null && signature.equals(computedSignature);
}
public String generateSignature(Map payload) {
try {
StringBuilder data = new StringBuilder();
SortedSet keys = new TreeSet<>(payload.keySet());
for (String key : keys) {
if (key.startsWith("cf_")) {
data.append(key).append(String.valueOf(payload.get(key)));
}
}
Mac mac = Mac.getInstance(MAC_SHA256_ALGO);
SecretKeySpec secretKeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), MAC_SHA256_ALGO);
mac.init(secretKeySpec);
byte[] encrypted = mac.doFinal(data.toString().getBytes());
return Base64.getEncoder().encodeToString(encrypted);
} catch (Exception ex) {
// handle
}
}
}
```
```php PHP theme={"dark"}
generateSignature($payload);
return !empty($signature) && $signature === $computedSignature;
}
public function generateSignature(array $payload): string {
try {
$data = '';
ksort($payload);
foreach ($payload as $key => $value) {
if (strpos($key, 'cf_') === 0) {
$data .= $key . strval($value);
}
}
$hmac = hash_hmac(self::MAC_SHA256_ALGO, $data, self::SECRET_KEY, true);
return base64_encode($hmac);
} catch (Exception $ex) {
// Handle exception (log it, throw error, etc.)
return '';
}
}
}
?>
```
```python Python theme={"dark"}
import hmac
import hashlib
import base64
from collections import OrderedDict
class SignatureVerification:
MAC_SHA256_ALGO = "sha256"
SECRET_KEY = "ac7960e7995536f0177fd210f3b3937fc2d974a4" # Merchant secret key
def verify_signature(self, payload: dict) -> bool:
signature = str(payload.get("signature", ""))
computed_signature = self.generate_signature(payload)
return signature == computed_signature
def generate_signature(self, payload: dict) -> str:
try:
data = "".join(f"{key}{payload[key]}" for key in sorted(payload.keys()) if key.startswith("cf_"))
mac = hmac.new(self.SECRET_KEY.encode(), data.encode(), hashlib.sha256)
return base64.b64encode(mac.digest()).decode()
except Exception as ex:
print(f"Error generating signature: {ex}")
return ""
```
**Failure Reasons**
| Code | Reason |
| :- | :- |
| AP01 | Account Blocked |
| AP02 | Account Closed |
| AP03 | Account Frozen |
| AP04 | Account Inoperative |
| AP05 | No Such Account |
| AP06 | Not a SBS account number or old account number represent with CBS number |
| AP07 | Refer to the branch KYC not completed |
| AP11 | Authentication Failed |
| AP14 | Invalid user credentials |
| AP15 | Mandate not registered\_ not maintaining required balance |
| AP16 | Mandate not registered\_ minor account |
| AP17 | Mandate not registered\_ NRE Account |
| AP18 | Mandate registration not allowed for CC account |
| AP19 | Mandate registration not allowed for PF account |
| AP20 | Mandate registration not allowed for PPF account |
| AP23 | Transaction rejected or cancelled by customer |
| AP24 | Account not in regular Status |
| AP25 | Withdrawal stopped due to insolvency of account |
| AP28 | Mandate registration failed. Please contact your home branch |
| AP29 | Technical errors or connectivity issues as bank |
| AP30 | Browser closed by customer in mid-transaction |
| AP31 | Mandate registration not allowed for joint account |
| AP32 | Mandate registration not allowed for wallet account |
| AP33 | User rejected the transaction on pre-login page |
| AP34 | Account number not registered with net-banking facility |
| AP35 | Debit card validation failed due to\_ Invalid card number |
| AP36 | Debit card validation failed due to\_ Invalid expiry date |
| AP37 | Debit card validation failed due to\_ Invalid PIN |
| AP38 | Debit card validation failed due to\_ Invalid CVV |
| AP39 | OTP invalid |
| AP40 | Maximum retries exceeded for OTP |
| AP41 | Time expired for OTP |
| AP42 | Debit card not activated |
| AP43 | Debit card blocked |
| AP44 | Debit card hot listed |
| AP45 | Debit card expired |
| AP46 | No response received from customer while performing transaction |
| AP47 | Account number registered for only view rights in net banking facility. |
We send the webhook response in a form data format.
# Get Eligible Cardless EMI
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/eligibility/get-eligible-cardless-emi
openapi/payments/v2022-09-01.yaml post /eligibility/cardlessemi
Use this API to get eligible Cardless EMI Payment Methods available for a customer on an order basis their phone number.
# Get Eligible Offers
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/eligibility/get-eligible-offers
openapi/payments/v2022-09-01.yaml post /eligibility/offers
Use this API to get eligible offers for an order_id or order amount.
# Get Eligible Paylater
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/eligibility/get-eligible-paylater
openapi/payments/v2022-09-01.yaml post /eligibility/paylater
Use this API to get eligible Paylater Payment Methods for a customer on an order.
# Get Eligible Payment Methods
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/eligibility/get-eligible-payment-methods
openapi/payments/v2022-09-01.yaml post /eligibility/payment_methods
Use this API to get eligible Payment Methods
# Create Offer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/offers/create-offer
openapi/payments/v2022-09-01.yaml post /offers
Use this API to create offers with Cashfree from your backend
# Get Offer by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/offers/get-offer-by-id
openapi/payments/v2022-09-01.yaml get /offers/{offer_id}
Use this API to get offer by offer_id
# Create Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/orders/create-order
openapi/payments/v2022-09-01.yaml post /orders
### Order
An order is an entity which has a amount and currency associated with it. It is something for which you want to collect payment for.
Use this API to create orders with Cashfree from your backend to get a `payment_sessions_id`.
You can use the `payment_sessions_id` to create a transaction for the order.
# Get Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/orders/get-order
openapi/payments/v2022-09-01.yaml get /orders/{order_id}
Use this API to fetch the order that was created at Cashfree's using the `order_id`.
## When to use this API
- To check the status of your order
- Once the order is PAID
- Once your customer returns to `return_url`
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/overview
Explore the 2022-09-01 version of the Cashfree Payment Gateway APIs, including orders, payments, refunds, settlements, and reconciliation endpoints.
Use the latest version of our APIs [v2026-01-01](/docs/api-reference/payments/latest/overview) for any new integrations.
## Payment Gateway end points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Latest Version | v3, 2022-09-01 The previous versions were 2021-05-21,2022-01-01 |
## Authentication
All the APIs require authentication, except the /orders/sessions API, which does not require any authentication and can be safely done from the browser as well.
Click [here](/docs/api-reference/authentication) for detailed information on API Authentication for Merchants and Partners.
## Payment Gateway APIs
### Orders
| API | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/previous/v2022-09-01/orders/create-order) | Use this API to create orders with Cashfree from your backend and get the payment link. |
| [Order Pay](/docs/api-reference/payments/previous/v2022-09-01/payments/order-pay) | Use this API when you have already created the orders and want Cashfree to process the payment. |
| [Preauthorization](/docs/api-reference/payments/previous/v2022-09-01/payments/preauthorization) | Use this API to capture or void a preauthorized payment. |
| [Get Order](/docs/api-reference/payments/previous/v2022-09-01/orders/get-order) | Use this API to view all details of an order. |
### Authentication
| API | Description |
| :- | :- |
| [Submit or Resend OTP](/docs/api-reference/payments/previous/v2022-09-01/payments/submit-or-resend-otp) | Use the submit or resend OTP API to send OTP to Cashfree. |
### Payments
| API | Description |
| :- | :- |
| [Get Payments for an Order](/docs/api-reference/payments/previous/v2022-09-01/payments/get-payments-for-an-order) | Use this API to view all payment details for an order. |
| [Get Payment by ID](/docs/api-reference/payments/previous/v2022-09-01/payments/get-payment-by-id) | Use this API to view payment details of an order for a payment ID. |
### Settlements
| API | Description |
| :- | :- |
| [Get Settlements by Order ID](/docs/api-reference/payments/previous/v2022-09-01/settlements/get-settlements-by-order-id) | Use this API to view all the settlements of a particular order. |
| [Get All Settlements](/docs/api-reference/payments/previous/v2022-09-01/settlement-reconciliation/get-all-settlements) | Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range. |
### Payment links
| API | Description |
| :- | :- |
| [Create Payment Link](/docs/api-reference/payments/previous/v2022-09-01/payment-links/create-payment-link) | Use this API to create a new payment link. The created payment link url will be available in the API response parameter link\_url. |
| [Fetch Payment Link Details](/docs/api-reference/payments/previous/v2022-09-01/payment-links/fetch-payment-link-details) | Use this API to view all details and status of a payment link. |
| [Get Orders for a Payment Link](/docs/api-reference/payments/previous/v2022-09-01/payment-links/get-orders-for-a-payment-link) | Use this API to view all order details for a payment link. |
| [Cancel Payment Link](/docs/api-reference/payments/previous/v2022-09-01/payment-links/cancel-payment-link) | Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled. |
### Token vault
| API | Description |
| :- | :- |
| [Fetch All Saved Instruments](/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-all-saved-card-instrument) | Use this API to get all saved instruments for a customer ID. |
| [Fetch Single Saved Instrument](/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-specific-saved-card-instrument) | Use this API to get specific saved instrument for a customer id and instrument ID. |
| [Delete Saved Instrument](/docs/api-reference/payments/previous/v2022-09-01/token-vault/delete-saved-card-instrument) | Use this API to delete a saved instrument for a customer id and instrument ID. |
| [Fetch Cryptogram for Saved Instrument](/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-cryptogram-for-a-saved-card-instrument) | Use this API to get the card network token, token expiry and cryptogram for a saved instrument using instrument ID. |
### Reconciliation
| API | Description |
| :- | :- |
| [Settlement Reconciliation](/docs/api-reference/payments/previous/v2022-09-01/settlement-reconciliation/settlement-reconciliation) | Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range. |
| [PG Reconciliation](/docs/api-reference/payments/previous/v2022-09-01/pg-reconciliation/pg-reconciliation) | Use this API to get the payment gateway reconciliation details with date range. |
# Cancel Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payment-links/cancel-payment-link
openapi/payments/v2022-09-01.yaml post /links/{link_id}/cancel
Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled.
# Create Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payment-links/create-payment-link
openapi/payments/v2022-09-01.yaml post /links
Use this API to create a new payment link. The created payment link url will be available in the API response parameter link_url.
# Fetch Payment Link Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payment-links/fetch-payment-link-details
openapi/payments/v2022-09-01.yaml get /links/{link_id}
Use this API to view all details and status of a payment link.
# Get Orders for a Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payment-links/get-orders-for-a-payment-link
openapi/payments/v2022-09-01.yaml get /links/{link_id}/orders
Use this API to view all order details for a payment link.
# Get Payment by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payments/get-payment-by-id
openapi/payments/v2022-09-01.yaml get /orders/{order_id}/payments/{cf_payment_id}
Use this API to view payment details of an order for a payment ID.
# Get Payments for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payments/get-payments-for-an-order
openapi/payments/v2022-09-01.yaml get /orders/{order_id}/payments
Use this API to view all payment details for an order.
# Order Pay
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payments/order-pay
openapi/payments/v2022-09-01.yaml post /orders/sessions
Use this API when you have already created the orders and want Cashfree to process the payment. To use this API S2S flag needs to be enabled
from the backend. In case you want to use the cards payment option the PCI
DSS flag is required, for more information reach out to us by filling out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1).
# Preauthorization
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payments/preauthorization
openapi/payments/v2022-09-01.yaml post /orders/{order_id}/authorization
Use this API to capture or void a preauthorized payment
# Submit or Resend OTP
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/payments/submit-or-resend-otp
openapi/payments/v2022-09-01.yaml post /orders/pay/authenticate/{cf_payment_id}
If you accept OTP on your own page, you can use the below API to send OTP to Cashfree.
# PG Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/pg-reconciliation/pg-reconciliation
openapi/payments/v2022-09-01.yaml post /recon
- Use this API to get the payment gateway reconciliation details with date range.
- It will have events for your payment account
# Create Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/refunds/create-refund
openapi/payments/v2022-09-01.yaml post /orders/{order_id}/refunds
Use this API to initiate refunds.
# Get All Refunds for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/refunds/get-all-refunds-for-an-order
openapi/payments/v2022-09-01.yaml get /orders/{order_id}/refunds
Use this API to fetch all refunds processed against an order.
# Get Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/refunds/get-refund
openapi/payments/v2022-09-01.yaml get /orders/{order_id}/refunds/{refund_id}
Use this API to fetch a specific refund processed on your Cashfree Account.
# Get All Settlements
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/settlement-reconciliation/get-all-settlements
openapi/payments/v2022-09-01.yaml post /settlements
Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range.
# Settlement Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/settlement-reconciliation/settlement-reconciliation
openapi/payments/v2022-09-01.yaml post /settlement/recon
- Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range.
- This API will return events for the settlement IDs you want
# Get Settlements by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/settlements/get-settlements-by-order-id
openapi/payments/v2022-09-01.yaml get /orders/{order_id}/settlements
Use this API to view all the settlements of a particular order.
# Create Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/softpos/create-terminal
openapi/payments/v2022-09-01.yaml post /terminal
Use this API to create new terminals to use softPOS.
# Create Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/softpos/create-terminal-1
openapi/payments/v2022-09-01.yaml post /terminal/transactions
Use this API to create a new terminal transaction. To use this API you should first create an order using the Create Order API. Also, you need to enter the terminal details while creating the order and pass the same terminal information while creating a transaction using the below mentioned API.
# Fetch Terminal QR Codes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/softpos/fetch-terminal-qr-codes
openapi/payments/v2022-09-01.yaml get /terminal/qrcodes
You can fetch all the StaticQRs corresponding to given terminal id or phone number. Provide either the terminal_phone_no or terminal_id in the request.
# Get terminal status using phone number
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/softpos/get-terminal-status-using-phone-number
openapi/payments/v2022-09-01.yaml get /terminal/{terminal_phone_no}
Use this API to view all details of a terminal.
# Offline Payments Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks
Subscribe to Cashfree softPOS webhooks on the 2022-09-01 API to track terminal onboarding, status, and transaction events for in-person payments.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
Cashfree sends the following webhooks for softPOS:
* [Payment Success](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#payment-success-webhook-version-2022-09-01)
* [Payment Failed](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#payment-failed-webhook-version-2022-09-01)
* [User Dropped](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#user-dropped-webhook-version-2022-09-01)
* [Refunds](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#refund-webhook-version-2022-09-01)
* [Auto Refund](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#auto-refund-webhook-version-2022-09-01)
* [Disputes](/docs/api-reference/payments/previous/v2022-09-01/softpos/softpos-webhooks#dispute-webhooks-version-2022-09-01)
## Payment success webhook version: (2022-09-01)
The new payment success webhook notifies you about the payment, and gives you comprehensive information about successful payments. A notification is sent to your backend from Cashfree when payments are successful. These notifications are useful in cases when the internet connection is unstable or slow while the payment is being processed. This will allow you to reconcile all the successful orders at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request as well as endpoints configured on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
#### Sample payload
```{ theme={"dark"}
"data": {
"order": {
"order_id": "order_OFR_2",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 1453002795,
"payment_status": "SUCCESS",
"payment_amount": 1,
"payment_currency": "INR",
"payment_message": "00::Transaction success",
"payment_time": "2022-12-15T12:20:29+05:30",
"bank_reference": "234928698581",
"auth_id": null,
"payment_method": {
"upi": {
"channel": null,
"upi_id": "9611199227@paytm"
}
},
"payment_group": "upi"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "[miglaniyogesh7@gmail.com]()",
"customer_phone": "9908734801"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1580762800",
"gateway_payment_id": "1453002795",
"gateway_status_code": null
},
"payment_offers": [
{
"offer_id": "0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type": "DISCOUNT",
"offer_meta": {
"offer_title": "50% off on UPI",
"offer_description": "50% off for testing",
"offer_code": "UPI50",
"offer_start_time": "2022-11-09T06:23:25.972Z",
"offer_end_time": "2023-02-27T18:30:00Z"
},
"offer_redemption": {
"redemption_status": "SUCCESS",
"discount_amount": 1,
"cashback_amount": 0
}
}
],
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "PAYMENT_SUCCESS_WEBHOOK"
}
```
## Payment failed webhook version: (2022-09-01)
The payment failed webhook notifies you when transactions fail and we receive a failed response from the bank.
```{ theme={"dark"}
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255"
}
},
"payment": {
"cf_payment_id": 1504280029,
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": null,
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_status_code": null
},
"payment_offers": null,
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-01-06T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
## User dropped webhook version: (2022-09-01)
The User Dropped Webhook notifies you when customers drop out of the payment flow without completing the transaction. It will help you understand if customers attempted to pay or not.
Some common scenarios where the transaction will be marked as USER\_DROPPED are:
* Android UPI Intent Payments - when a user clicks on the back button in the UPI app without making any payment attempt.
* Card Payments - when a user drops out of the payment flow by closing the OTP verification page.
* UPI Collect Transactions - when a user does not enter the UPI PIN and closes the transaction screen
```{ theme={"dark"}
"data": {
"order": {
"order_id": "testspos83",
"order_amount": 1.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 2150264295,
"payment_status": "USER_DROPPED",
"payment_amount": 1.00,
"payment_currency": "INR",
"payment_message": null,
"payment_time": "2023-11-03T12:37:32+05:30",
"bank_reference": null,
"auth_id": null,
"payment_method": {
"upi": {
"channel": null,
"upi_id": "testsuccess@gocash"
}
},
"payment_group": "upi"
},
"customer_details": {
"customer_name": "johndoe",
"customer_id": "9112",
"customer_email": "[johndoe@cashfree.com]()",
"customer_phone": "9876543210"
},
"payment_gateway_details": {
"gateway_name": null,
"gateway_order_id": null,
"gateway_payment_id": null,
"gateway_status_code": null,
"gateway_settlement": null
},
"payment_offers": null,
"terminal_details": {
"cf_terminal_id": 20532321,
"terminal_phone": "9876543210"
}
},
"event_time": "2023-11-03T12:37:44+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
## Refund webhook version: (2022-09-01)
Refund webhooks can be configured to receive automated notifications for refunds when either they are successfully processed or are cancelled. Merchants can build their own downstream systems like auto-updating their refund status, and sending a communication to customers by consuming refund webhooks.
The webhook notification will be sent on all the URLs added and enabled under the refund webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
#### Sample payload
```
{
"data": {
"refund": {
"cf_refund_id": 11325632,
"cf_payment_id": 789727431,
"refund_id": "refund_sampleorder0413",
"order_id": "sampleorder0413",
"refund_amount": 2.00,
"refund_currency": "INR",
"entity": "Refund",
"refund_type": "MERCHANT_INITIATED",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Refund processed successfully",
"created_at": "2022-02-28T12:54:25+05:30",
"processed_at": "2022-02-28T13:04:27+05:30",
"refund_charge": 0,
"refund_note": "Test",
"refund_splits": [
{
"merchantVendorId": "sampleID12345",
"amount": 1,
"percentage": null
},
{
"merchantVendorId": "otherVendor",
"amount": 1,
"percentage": null
}
],
"metadata": null,
"refund_mode": "STANDARD",
"terminal_details": {
"cf_terminal_id": 911876,
"terminal_phone": "9876543210"
}
}
},
"event_time": "2022-02-28T13:04:28+05:30",
"type": "REFUND_STATUS_WEBHOOK"
}
```
#### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| cf\_refund\_id | Cashfree ID for a refund. | 11325632 |
| cf\_payment\_id | Cashfree ID of the payment for which refund is initiated. | 789727431 |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 21345 |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 |
| refund\_id | Merchant’s refund ID of the refund | refund\_sampleorder0413 |
| order\_id | Merchant’s order Id of the order for which refund is initiated. | sampleorder0413 |
| refund\_amount | Amount that was refunded | 2.00 |
| refund\_currency | Currency of the refund amount. | INR |
| entity | Type of object (refund always) | Refund |
| refund\_type | Type of refund (for webhook it will always be MERCHANT\_INITIATED) | MERCHANT\_INITIATED |
| refund\_arn | The bank reference number for refund | 205907014017 |
| refund\_status | Status of the refund (either SUCCESS or CANCELLED in refund webhook) | SUCCESS |
| status\_description | Description of refund status | Refund processed successfully |
| created\_at | Time of refund creation | 2022-02-28T12:54:25+05:30 |
| processed\_at | Time when refund was processed successfully | 2022-02-28T13:04:27+05:30 |
| refund\_charge | Charges in INR for processing refund | 0 |
| refund\_note | Note added by merchant for the refund | Cancelled Order |
| refund\_splits | Refund split details | \[] |
| metadata | Additional refund metadata | null |
| refund\_mode | Method or speed of processing refund (INSTANT or STANDARD) | STANDARD |
| event\_time | Time at which refund webhook was initiated. | 2022-02-28T13:04:28+05:30 |
| type | Type of webhook. REFUND\_STATUS\_WEBHOOK always | REFUND\_STATUS\_WEBHOOK |
## Auto refund webhook version: (2022-09-01)
Auto-refund webhooks can be configured to receive automated notifications when auto-refunds are initiated, processed and delayed. Auto-refunds are refunds triggered automatically for unsuccessful payments, disputes, duplicate payments; or instances where payments are received directly to your VPA, regardless of whether an order has been generated.
Cashfree sends webhook notifications to every URL added and enabled under **Auto-refund Webhooks**. You can add new URLs and enable or disable existing ones for auto-refund webhooks at any point in time. The changes take effect immediately.
#### Sample payload
```Text Auto-Refund Webhook Sample Payload theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
Find the description for each field of the payload below:
| Field | Description | Example |
| - | - | - |
| cf\_refund\_id | It represents the ID created by Cashfree to identify the refund. | 1243460973 |
| cf\_payment\_id | It represents the ID created by Cashfree to identify the payment for the initiated refund. | 2148333968 |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 21345 |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 |
| order\_id | It represents the ID created by you to identify the order for which the refund is initiated. | sampleorder0413 |
| bank\_reference | It represents the bank reference number for the transaction. | 234928698581 |
| refund\_currency | It represents the currency of the refund amount. | INR |
| refund\_amount | It represents the refunded amount. | 2 |
| refund\_type | It represents the refund type. The value will always be PAYMENT\_AUTO\_REFUND. | PAYMENT\_AUTO\_REFUND |
| refund\_arn | It represents the bank reference number for the refund. | 205907014017 |
| refund\_status | It represents the status of the refund (either SUCCESS or INITIATED). | SUCCESS |
| status\_description | It represents the description of the refund status. (Two possible values: Auto-Refund initiated successfully or Auto-Refund processed successfully). | Auto-Refund initiated successfully |
| created\_at | It represents the time of auto-refund creation. | 2022-02-28T12:54:25+05:30 |
| processed\_at | It represents when the auto-refund was processed successfully. | 2022-02-28T13:04:27+05:30 |
| refund\_reason | It represents the reason of initiation of Auto-refund. (Possible values: Credit was received for an incomplete payment. Refunded to customer for Dispute. Payment made directly to your VPA without order creation. Multiple payments were performed against same order. Payment details (amount, bank, etc.) do not match with created order or the payment was made after TTL.) | Multiple payments were performed against same order |
| refund\_charge | It represents the charges for processing refund in INR. | 0 |
| refund\_splits | It represents the refund split details. | \[] |
| metadata | It represents the additional metadata. | null |
| event\_time | It represents when the refund webhook was initiated. | 2022-02-28T13:04:28+05:30 |
| type | It represents the webhook type. The value will always be AUTO\_REFUND\_STATUS\_WEBHOOK. | AUTO\_REFUND\_STATUS\_WEBHOOK |
## Dispute webhooks version: (2022-09-01)
Dispute webhooks can be configured to receive automated notifications when disputes are created, updated and closed.
The webhook notification will be sent on all the URLs added and enabled under the dispute webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
| Webhook | Description |
| :- | :- |
| DISPUTE\_CREATED | Dispute\_created webhook will be triggered when a new dispute is created. |
| DISPUTE\_UPDATED | Dispute\_updated webhook will be triggered when a dispute is updated, for example when a comment is added by the Cashfree team, when the dispute moves into further stages like Pre-arbitration, Arbitration, or when the status of the dispute changes. |
| DISPUTE\_CLOSED | This webhook will be triggered when a dispute is closed. |
#### Dispute created
**Sample Payload**
```{ theme={"dark"}
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": "DISPUTE_CREATED",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21: 50: 04+05: 30",
"type": "DISPUTE_CREATED"
}
```
#### Dispute updated
**Sample Payload**
```{ theme={"dark"}
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
#### Dispute closed
**Sample Payload**
```{ theme={"dark"}
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
#### Payload field description
| Field | Description | Example | Type |
| - | - | - | - |
| dispute\_id | Cashfree’s unique ID to identify a dispute. | 433475257 | Long |
| dispute\_type | Type of dispute created. Possible values:
- DISPUTE - RETRIEVAL - CHARGEBACK - PRE\_ARBITRATION - ARBITRATION | Chargeback | String |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 989876 | Long |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 | String |
| reason\_code | Condition for which the customer is filing the case. See [dispute reason codes](/docs/payments/manage/disputes/reason-codes) to know more. | 13.6 | String |
| reason\_description | Description of the reason code. Codes for Chargeback cases are specified by Card networks/NPCI. | Credit not processed | String |
| dispute\_amount | The amount for which the dispute has been created. | 4500 | BigDecimal |
| created\_at | Time on which the dispute was registered on Cashfree’s system. | 2023-06-15T21:16:03+05:30 | LocalDateTime |
| updated\_at | Time on which the dispute was updated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| respond\_by | Time by which the merchant is expected to respond to the dispute. | 2023-06-18T00:00:00+05:30 | LocalDateTime |
| dispute\_status | Status of Dispute. All possible values are listed in the table below. | CHARGEBACK\_CREATED | String |
| cf\_dispute\_remarks | Any remarks specified by Cashfree on the dispute. | Please submit documents. | String |
| dispute\_update | Specifies what has been updated on the dispute. Possible Values:
- STATUS\_UPDATE - TYPE\_UPDATE - COMMENT\_UPDATE | TYPE\_UPDATE | String |
| dispute\_action\_on | Specifies whether the action is on Cashfree or Merchant at a time. Possible Values:
- MERCHANT - CASHFREE | MERCHANT | String |
| resolved\_at | Time on which the dispute was resolved/closed. | 2023-06-15T21:16:51.682836678+05:30 | LocalDateTime |
| event\_time | Time at which dispute webhook was initiated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| type | Type of webhook. Possible Values:
- DISPUTE\_CREATED - DISPUTE\_UPDATED - DISPUTE\_CLOSED | DISPUTE\_CREATED | String |
# Delete Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/token-vault/delete-saved-card-instrument
openapi/payments/v2022-09-01.yaml delete /customers/{customer_id}/instruments/{instrument_id}
Use this API to delete a saved card instrument for a customer_id and instrument_id
# Fetch All Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-all-saved-card-instrument
openapi/payments/v2022-09-01.yaml get /customers/{customer_id}/instruments
Use this API to fetch saved cards for a customer_id
# Fetch cryptogram for a saved card instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-cryptogram-for-a-saved-card-instrument
openapi/payments/v2022-09-01.yaml get /customers/{customer_id}/instruments/{instrument_id}/cryptogram
Use this API To get the card network token, token expiry and cryptogram for a saved card instrument using instrument id
# Fetch Specific Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2022-09-01/token-vault/fetch-specific-saved-card-instrument
openapi/payments/v2022-09-01.yaml get /customers/{customer_id}/instruments/{instrument_id}
Use this API to fetch a single specific saved card for a customer_id by it's instrument_id
# Create Customer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/customers/create
openapi/payments/v2023-08-01.yaml post /customers
Create Customer at Cashfree
# Accept Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/dispute-accept
openapi/payments/v2023-08-01.yaml put /disputes/{dispute_id}/accept
Use this API to get accept the Dispute by specifying the Dispute ID.
# Submit Evidence to contest the Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/dispute-submission
openapi/payments/v2023-08-01.yaml post /disputes/{dispute_id}/documents
Use this API to Submit the Evidences to contest the Dispute by specifying the Dispute ID.
# Dispute Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/dispute-webhooks
Subscribe to Cashfree dispute webhooks to receive asynchronous updates whenever a chargeback or pre-arbitration changes state on your account.
Dispute webhooks can be configured to receive automated notifications when disputes are created, updated and closed.
The webhook notification will be sent on all the URLs added and enabled under the dispute webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
| Webhook | Description |
| :- | :- |
| DISPUTE\_CREATED | Dispute\_created webhook will be triggered when a new dispute is created. |
| DISPUTE\_UPDATED | Dispute\_updated webhook will be triggered when a dispute is updated, for example when a comment is added by the Cashfree team, when the dispute moves into further stages like Pre-arbitration, Arbitration, or when the status of the dispute changes. |
| DISPUTE\_CLOSED | This webhook will be triggered when a dispute is closed. |
Click [here](/docs/payments/online/webhooks/overview) to know how to configure webhooks.
## Dispute created
**Sample Payload**
```json theme={"dark"}
"{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": ""DISPUTE_CREATED"",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": ""2023-06-15T21:50:04+05:30",
"type": "DISPUTE_CREATED"
}"
```
## Dispute updated
**Sample Payload**
```json theme={"dark"}
"{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}"
```
## Dispute closed
**Sample Payload**
```json theme={"dark"}
"{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}"
```
## Payload field description
| Field | Description | Example | Type |
| - | - | - | - |
| dispute\_id | Cashfree’s unique ID to identify a dispute. | 433475257 | Long |
| dispute\_type | Type of dispute created. Possible values: - DISPUTE - RETRIEVAL - CHARGEBACK - PRE\_ARBITRATION - ARBITRATION | Chargeback | String |
| reason\_code | Condition for which the customer is filing the case. See [dispute reason codes](/docs/payments/manage/disputes/reason-codes) to know more. | 13.6 | String |
| reason\_description | Description of the reason code. Codes for Chargeback cases are specified by Card networks/NPCI. | Credit not processed | String |
| dispute\_amount | The amount for which the dispute has been created. | 4500 | BigDecimal |
| created\_at | Time on which the dispute was registered on Cashfree’s system. | 2023-06-15T21:16:03+05:30 | LocalDateTime |
| updated\_at | Time on which the dispute was updated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| respond\_by | Time by which the merchant is expected to respond to the dispute. | 2023-06-18T00:00:00+05:30 | LocalDateTime |
| dispute\_status | Status of Dispute. All possible values are listed in the table below. | CHARGEBACK\_CREATED | String |
| cf\_dispute\_remarks | Any remarks specified by Cashfree on the dispute. | Please submit documents. | String |
| dispute\_update | Specifies what has been updated on the dispute. Possible Values: - STATUS\_UPDATE - TYPE\_UPDATE - COMMENT\_UPDATE | TYPE\_UPDATE | String |
| dispute\_action\_on | Specifies whether the action is on Cashfree or Merchant at a time. Possible Values: - MERCHANT - CASHFREE | MERCHANT | String |
| resolved\_at | Time on which the dispute was resolved/closed. | 2023-06-15T21:16:51.682836678+05:30 | LocalDateTime |
| event\_time | Time at which dispute webhook was initiated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| type | Type of webhook. Possible Values: - DISPUTE\_CREATED - DISPUTE\_UPDATED - DISPUTE\_CLOSED | DISPUTE\_CREATED | String |
| List of dispute status |
| :- |
| DISPUTE\_CREATED |
| DISPUTE\_DOCS\_RECEIVED |
| DISPUTE\_UNDER\_REVIEW |
| DISPUTE\_MERCHANT\_WON |
| DISPUTE\_MERCHANT\_LOST |
| DISPUTE\_MERCHANT\_ACCEPTED |
| DISPUTE\_INSUFFICIENT\_EVIDENCE |
| RETRIEVAL\_CREATED |
| RETRIEVAL\_DOCS\_RECEIVED |
| RETRIEVAL\_UNDER\_REVIEW |
| RETRIEVAL\_MERCHANT\_WON |
| RETRIEVAL\_MERCHANT\_LOST |
| RETRIEVAL\_MERCHANT\_ACCEPTED |
| RETRIEVAL\_INSUFFICIENT\_EVIDENCE |
| CHARGEBACK\_CREATED |
| CHARGEBACK\_DOCS\_RECEIVED |
| CHARGEBACK\_UNDER\_REVIEW |
| CHARGEBACK\_MERCHANT\_WON |
| CHARGEBACK\_MERCHANT\_LOST |
| CHARGEBACK\_MERCHANT\_ACCEPTED |
| CHARGEBACK\_INSUFFICIENT\_EVIDENCE |
| PRE\_ARBITRATION\_CREATED |
| PRE\_ARBITRATION\_DOCS\_RECEIVED |
| PRE\_ARBITRATION\_UNDER\_REVIEW |
| PRE\_ARBITRATION\_MERCHANT\_WON |
| PRE\_ARBITRATION\_MERCHANT\_LOST |
| PRE\_ARBITRATION\_MERCHANT\_ACCEPTED |
| PRE\_ARBITRATION\_INSUFFICIENT\_EVIDENCE |
| ARBITRATION\_CREATED |
| ARBITRATION\_DOCS\_RECEIVED |
| ARBITRATION\_UNDER\_REVIEW |
| ARBITRATION\_MERCHANT\_WON |
| ARBITRATION\_MERCHANT\_LOST |
| ARBITRATION\_MERCHANT\_ACCEPTED |
| ARBITRATION\_INSUFFICIENT\_EVIDENCE |
## Compute Signature and Verify
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload. Timestamp is present in the header x-webhook-timestamp
````bash theme={"dark"}
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));```
````
## Sample code
### Verify Signature using SDK
```node Node (express) theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```go Go theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute Signature and Verify manually
```node Node (express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Get Disputes by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/disputes
openapi/payments/v2023-08-01.yaml get /disputes/{dispute_id}
Use this API to get Dispute details by specifying the Dispute ID.
# Get Disputes by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/disputes-for-order
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/disputes
Use this API to get all Dispute details by specifying the Order ID.
# Get Disputes by Payment ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/dispute/disputes-for-payment
openapi/payments/v2023-08-01.yaml get /payments/{cf_payment_id}/disputes
Use this API to get all Dispute details by specifying the Payment ID.
# Get Import Settlement Details for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-details
openapi/cb-imports/merchant-spec.json get /import/orders/{order_id}/settlements
This API is used to get ICA settlement details using PG Order ID.
# Get Import Settlement Recon Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-recon-details
openapi/cb-imports/merchant-spec.json post /import/settlements/recon
This API is used to fetch all events happened for provided Settlement IDs.
# Get Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-payment-verification-details
get /import/transactions/{cf_payment_id}
Use this API to get the status of the payment verification.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/import-settlement-apis-overview
Browse the Cashfree Collect from India settlement APIs that fetch import settlement details and run reconciliation reports for cross-border payments.
This page is the parent folder for all the APIs required for obtaining ICA settlement details related to orders that have been remitted.
* [Get Import Settlement Details for an Order](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-details) - Use this to fetch ICA settlements.
* [Get Import Settlement Recon Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-recon-details) - Use this to fetch recon events of ICA settlements.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/import-verification-apis-overview
Browse the Cashfree Collect from India verification APIs used to upload and fetch payment documents required for cross-border compliance checks.
This page is the parent folder for all the APIs required for processing the transactions need to be remitted abroad.
* [Upload Payment Verification Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/upload-payment-verification-details) - Use this to submit verification details
* [Get Payment Verification Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-payment-verification-details) - Use this to fetch payment verification details
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/import-webhooks
Enable merchants, payment aggregators, and marketplaces outside India to accept payments from customers in India, covering import webhooks, event types, payloads, and signature verification.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
Click [here](/docs/payments/online/webhooks/configure) to know how to configure webhooks.
## Payment Verification details webhook version 1 (2022-09-01)
The payment verification details update webhook notifies you about the payment details verification, and it give you comprehensive information about verification details update.
A notification is sent to your backend from cashfree when there is any new update for payment verification. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the payment verification update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"cf_payment_id": 5114910634577,
"payment_status": "SUCCESS",
"payment_verification_status": "ACTION_REQUIRED",
"payment_verification_expiry": "2024-07-12T15:19:42+05:30",
"remarks": null,
"required_details": [
{
"doc_name": "shop_or_brand_name",
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "partner_order_number",
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "goods_description",
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "invoice_number",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_name",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_address",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "country_of_origin",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "invoice_file",
"doc_type": "DOCUMENT",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "ecommerce_order_serial_number", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "hs_code", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "shipment_date", //Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "port_of_loading",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "awb_number",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
}
]
},
"event_time": "2024-07-12T13:39:42+05:30",
"type": "PAYMENT_VERIFICATION_UPDATE"
}
```
## ICA Settlement details webhook version 1 (2022-09-01)
The ICA Settlement Details Update webhook notifies you about the ica settlement.
A notification is sent to your backend from cashfree when there is any new update for ica settlement. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the ica settlement update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"adjustment_amount_inr": -347641.22,
"collection_amount_inr": 604854.0,
"initiated_on": null,
"payment_from": "2024-09-26T15:43:55",
"payment_till": "2024-09-26T16:43:13",
"service_charge_inr": null,
"service_tax_inr": 2068.59,
"settled_on": null,
"settlement_amount_inr": 243651.95,
"settlement_charges_inr": 0.0,
"settlement_foreign_currency_details": {
"settlement_amount_fcy": null,
"settlement_currency": "USD",
"settlement_forex_rate": null
},
"settlement_id": 12,
"settlement_tax_inr": 0.0,
"settlement_utr": null,
"status": "NOT_INITIATED"
},
"event_time": "2024-10-03T13:27:36+05:30",
"type": "ICA_SETTLEMENT_UPDATE"
}
```
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));
```
## Sample code
### Verify Signature using SDK
```node Node(express) theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
```go Go theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute Signature and Verify manually
```node Node(express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/overview
Use the Collect from India APIs to accept payments from customers in India, designed for overseas merchants, aggregators, and marketplaces.
**Getting Started**
Follow the steps mentioned below to get started with Collect from India APIs
* Fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) for onboarding assistance
* If you are a Merchant, generate your keys using this method [Link](/docs/api-reference/authentication#generate-api-keys)
* Register your webhook URL for updates and subscribe to the required events. For more information, refer to the [Webhook documentation](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/import-webhooks).
Once these setup is completed, we can use the below mentioned collection of APIs to create import transactions
**Collect from India - List of APIs**
| API name | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/previous/v2023-08-01/orders/create) | This API will create a order to collect payment |
| [Order Pay](/docs/api-reference/payments/previous/v2023-08-01/payments/pay) | This API is used to pay the created payment |
| [Get Payment by ID](/docs/api-reference/payments/previous/v2023-08-01/payments/get) | This API is used to double verify the payment status |
| [Upload Payment Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/upload-payment-verification-details) | This API is used to upload the required payment verification details |
| [Payment Verification Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-payment-verification-details) | This API is used to Get the verification status of the payment |
| [Payment Settlement Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-details) | This API is used to get ICA settlement details using PG Order ID |
| [Payment Settlement Recon Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/get-import-settlement-recon-details) | This API is used to fetch all events happened for provided Settlement IDs |
# Upload Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/collect-from-india/upload-payment-verification-details
openapi/cb-imports/merchant-spec.json post /import/transactions/{cf_payment_id}
This API is used to upload the required payment details for theverification.
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/endpoints
Review the production and sandbox base URLs and authentication headers you need to call the Cashfree Global Collections APIs for cross-border payouts.
## Global Collections Gateway End Points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/](https://sandbox.cashfree.com/) |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/overview
Use Cashfree Global Collections to receive international payments into virtual accounts in multiple currencies and settle funds to your Indian bank account.
**Getting Started**
To start using Global Collection APIs,
You can generate your API credentials using the below steps, as applicable.
***
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
**Global Collections List of APIs**
| API name | Description |
| :- | :- |
| [Get Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-get-token) | This API generates a new token. |
| [Verify Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-verify-token) | Verify the authentication token generated. The response will be ‘Token is not valid’ if the token does not exist, invalid or has been expired. |
| [Get Collection Accounts](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-collection-accounts) | This API fetches all the virtual accounts that are linked with this account. |
| [Get Transactions](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-transactions) | Use this API to get all the transaction details within a time interval. |
| [Add Transaction Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/add-transaction-details) | Use this API to add transaction details to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount. |
| [Simulate Transaction](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/simulate-transaction) | Use this API to simulate funding to any of the virtual accounts of your merchants. |
# Add Transaction Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/add-transaction-details
post /gc/transactions/{referenceId}/invoice-details
Use this API to input invoice details for a specific transaction. You have the flexibility to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-get-token
post /gc/authorize
Use this API to authenticate with the Cashfree system and obtain the authorization bearer token.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-overview
Learn how Cashfree partners authenticate against the Global Collections APIs by exchanging credentials for a short-lived bearer token before each call.
* [Get Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-get-token) - Use the Get Token API to authenticate with the Cashfree system and obtain the authorisation bearer token, call the authorize API.
* [Verify Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-verify-token) - Verify the authentication token generated. The response will be ‘Token is not valid’ if the token does not exist, invalid or has been expired.
# Verify Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-verify-token
get /gc/token/verify
Verify the authentication token generated by the user.
# Get Collection Accounts
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-collection-accounts
get /gc/virtual-accounts
This API fetches all the virtual accounts that is linked with the given merchant ID.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Transactions
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-transactions
get /gc/transactions
Use this API to get all the transaction details within a time interval.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/overview
Browse the Cashfree Global Collections partner APIs that fetch virtual accounts, list transactions, simulate funding, and manage invoice details at scale.
* [Get All Transactions Details](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-transactions) - Use this to fetch all the transactions for a particular merchant.
* [Emulate Funding](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/simulate-transaction) - Use this to emulate a transaction for a specific merchant.
* [Get All Collection Accounts for Partner Merchants](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/get-collection-accounts) - Use this to get all VAs for a specific merchant.
* [Add Invoice Details for Partner Merchants](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/add-transaction-details) - Use this API to input invoice details for a specific transaction for a specific merchant.
* [Merchant Webhook Configs](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/webhooks) - Use this document to understand the webhooks payload events and verification.
# Simulate Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/simulate-transaction
post /gc/transactions/emulate
Use this API to simulate a funding in test environment.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Webhook - Partner
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/webhooks
Subscribe to Cashfree Global Collections partner webhooks to receive real-time updates whenever international funds arrive in a merchant virtual account.
### Guide to Subscribe Webhook Events
1. Visit [https://partner.cashfree.com](https://partner.cashfree.com) login with your partner credentials
2. On the landing page click on developers section and select webhook, you will be redirected to a page to add webhook URL and subscribe events or once logged in you can use this URL [Webhook Page](https://partner.cashfree.com/partner-ui/dashboard/developers/webhook)
3. Add your webhook URL and subscribe events Global Collect Transaction, Global Collect Settlement & Global Collect Virtual Account
4. To validate the webhook signature follow [Adding webhook and signature verification guide](/docs/api-reference/platforms/latest/merchant-onboarding/webhooks#verify-signature)
### Screenshots:
Landing page to add the webhook URL and subscribe the events
We can add multiple webhook URLs for the different type of events. For testing, Switch to test and follow the same step in sandbox environment.
## Transaction status
Active Event needs to be subscribed: **Global Collect Transaction**
```json Json theme={"dark"}
{
"amount": "4.50",
"currency": "GBP",
"cmsProfileId": 123,
"event": "INTERNATIONAL_PAYMENT_COLLECTED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2022-12-29 13:42:54",
"referenceId": 63,
"remarks": "",
"remitterAccount": "1223456789",
"remitterAddress": "Dummy Address",
"remitterBic": "TRWIBEB1XXX",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"status": "COMPLETED",
"utr": "5347f52a-9851-4fe9-8618-32eb085590ce",
"updatedStatusTime": "2022-12-29 13:50:35",
"vAccountId": "97836",
"vAccountNumber": "GB38TCCL12345687997836"
}
```
### Possible Events and Corresponding Transaction Status Mapping
| Event name | Payment status | Description |
| :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_COLLECTED | COMPLETED | Received payment |
| INTERNATIONAL\_PAYMENT\_BLOCKED | BLOCKED | The transaction has been blocked due to the specified reason in the designated field. |
| INTERNATIONAL\_PAYMENT\_AWAITING\_DETAILS | COMPLETED | Waiting for the details of the transaction |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of supported currencies [here](/docs/payments/global-collections/collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| reason | Reason regarding the transaction being blocked. | Transaction value below the allowed limit |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED, AWAITING\_DETAILS |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was done. | GB38TCCL12345687997836 |
| merchant | Object contains merchant\_id used while creating merchant | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
***
## Reversal status
```Text JSON theme={"dark"}
{
"amount": "1000000.00",
"cmsProfileId": 123,
"currency": "USD",
"event": "INTERNATIONAL_PAYMENT_REVERSAL_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2024-02-28 16:17:48",
"referenceId": 63,
"remitterAccount": "9919391193",
"remitterAddress": "Dummy Address",
"remarks": "",
"remitterBic": "",
"remitterCountry": "IN",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"reversal": {
"reason": "Transaction value higher than the compliant limit",
"status": "INITIATED"
},
"signature": "F8raBNGcGjMUvbh2t/7t/9C4zU0Snqa/iXf9XzvOq0Y=",
"status": "REVERSAL_INITIATED",
"updatedStatusTime": "2024-02-28 16:17:54",
"utr": "IF-20240228-KT9ZFA",
"vAccountId": "GB75T",
"vAccountNumber": "GB75TCCL12345654108280"
}
```
### Possible Events and Corresponding Transaction Status Mapping
| Event name | Reversal status | Transaction status | Description |
| :- | :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_INITIATED | INITIATED | REVERSAL\_INITIATED | Reversal for the transaction is initiated. |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_DONE | DONE | REVERSAL\_DONE | Reversal for the transaction is completed. The funds have been successfully returned to the sender. |
### Payload field description
***
## Settlement status
Active Event needs to be subscribed: **Global Collect Settlement**
```json theme={"dark"}
{
"amount": "3500.00",
"cmsProfileId": 23853384,
"currency": "USD",
"event": "INR_SETTLEMENT_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentRail": "ACH",
"paymentTime": "2024-02-06 11:11:42",
"referenceId": 312620,
"remarks": "EMULATE GC INCOMING FUNDS",
"remitterAccount": "7337377781",
"remitterAddress": "Dummy Address",
"remitterBic": "TLG0123",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"settlement": {
"expectedSettlementDate": "2024-02-06",
"id": "f16581f5-344c-40e8-be4b-e63cb5714a88",
"inrAmount": 16219.65,
"status": "INITIATED"
},
"status": "SETTLED",
"updatedStatusTime": "2024-02-05 18:39:42",
"utr": "f185d0f5-abf5-492b-9149-d45eacfeaca7",
"vAccountId": "03314",
"vAccountNumber": "0331496070"
}
```
The firaFileDownloadUrl field will only be included in the webhook response
after it has been updated.
### Possible Events and Corresponding Settlement Status Mapping
| Event name | Settlement status | Description |
| :- | :- | :- |
| INR\_SETTLEMENT\_INITIATED | INITIATED | The settlement is initiated. |
| INR\_SETTLEMENT\_APPROVED | SETTLED | The settlement is settled. |
| INR\_SETTLEMENT\_REJECTED | REJECTED | The settlement is rejected. |
| FIRA\_FILE\_RECEIVED | SETTLED | FIRA file received for the settlement. |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of [supported currencies](/docs/payments/international-payments/global-collections/collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was made. | GB38TCCL12345687997836 |
| paymentRail | Payment Network used to make the payment | ACH,EFT,FPS,SEPA,SWIFT,FEDWIRE |
| settlement.id | Unique reference ID for the settlement since the payment can have multiple settlements. | b84a7c4c-2ce0-48ca-9b86-2a2c9ad5a35d |
| settlement.firafileDownloadUrl | Download link to FIRA file | fileDownloadUrl |
| settlement.expectedSettlementDate | Expected date of settlement. | 2023-08-30 |
| settlement.inrAmount | Settlement amount in rupees (INR). | 16219.65 |
| settlement.status | Current status of the settlement. | INITIATED |
***
## Virtual account details
Active Event needs to be subscribed: **Global Collect Virtual Account**
```json Json theme={"dark"}
{
"cmsProfileId": 260559,
"event": "VIRTUAL_ACCOUNT_DETAILS",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"vAccounts": [
{
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "AUD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
},
{
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "BHD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
}
]
}
```
### Possible Events and Corresponding Virtual Account Mapping
| Event name | Virtual account status | Description |
| - | - | - |
| VIRTUAL\_ACCOUNTS\_ACTIVATED | ACTIVE | Virtual account is activated |
| VIRTUAL\_ACCOUNTS\_CREATED | INACTIVE / ACTIVE | If all the business required details are passed in the first go, VAs are created in ACTIVE state or INACTIVE |
| VIRTUAL\_ACCOUNT\_DETAILS | ACTIVE | Will contain all the details of the VA |
#### Description
Sometimes there is mere might be a slight delay in creating some virtual accounts during onboarding and as a result, some of them might be missing in the Get All Collection Accounts API. Hence, when these missing account details are added, this webhook is triggered with all virtual account details (including the ones that were present before). This webhook contains information for all virtual account associated with a merchant along with cmsProfileId , signature and event.
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook Event | VIRTUAL\_ACCOUNT\_DETAILS |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| vAccounts.accountNumber | Account Number | GB11TCCL12345638242754 |
| vAccounts.accountType | Account Type | iban |
| vAccounts.paymentType | Type of Payment | priority |
| vAccounts.bankName | Bank Name | The Currency Cloud Limited |
| vAccounts.bankAddress | Bank Address | 12 Steward Street, The Steward Building, London, E1 6FQ, GB |
| vAccounts.bankCountry | Bank Country | GB |
| vAccounts.currency | Currency Code | BHD |
| vAccounts.routingCode | Routing Code | TCCLGB3L |
| vAccounts.routingCodeType | Routing Code Type | bic\_swift |
| vAccounts.addedOn | The time when this virtual account was created | 2023-03-28 14:43:30 |
| vAccounts.vaccountId | Virtual Account Id | GB11T |
# Purpose Codes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/purpose-codes
Look up the FEMA purpose codes accepted by Cashfree Global Collections so you can classify each cross-border receipt against the correct business reason.
| Purpose code | Description |
| - | - |
| P0103 | Advance receipts against export contracts, which will be covered later by GR/PP/SOFTEX/ SDF - other than Nepal and Bhutan |
| P1004 | Legal services |
| P1005 | Accounting, auditing, bookkeeping services |
| P1006 | Business and management consultancy and public relations |
| P1007 | Advertising, trade fair service |
| P1008 | Research & Development services |
| P1009 | Architectural services |
| P0802 | Software consultancy / implementation (other than those covered in SOFTEX form) |
| P0807 | For Export of Software covered under softex (advance payment) |
| P1020 | Wholesale and retailing trade services |
| P1002 | Trade related services - commission on exports / imports |
| P1104 | Entertainment services |
| P1099 | Other services not included elsewhere, for export of services |
| P1015 | Tax consulting services |
| P1016 | Market research and public opinion polling service |
| P1017 | Publishing and printing services |
| P1019 | Commission agent services |
| P1107 | Educational services |
| P1109 | Other Personal, Cultural & Recreational services |
| P1701 | Receipts on account of processing of goods |
| P0301 | Purchases towards travel (Includes purchases of foreign TCs, currency notes etc over the counter, by hotels, Emporiums, institutions etc. as well as amount received by TT/SWIFT transfers or debit to Non-Resident account). |
| P0302 | Business travel |
| P0304 | Travel for medical treatment including TC purchased by hospitals |
| P0305 | Travel for education including TCs purchased by educational institutions |
| P0306 | Other travel receipts |
| P0801 | Hardware consultancy/implementation |
| P0803 | Data base, data processing charges |
| P0804 | Repair and maintenance of computer and software |
| P0805 | News agency services |
| P0806 | Other information services- Subscription to newspapers, periodicals, etc. |
| P0808 | Telecommunication services including electronic mail services and voice mail services |
| P1013 | Environmental Services |
| P1014 | Engineering Services |
| P1101 | Audio-visual & related service:Motion picture & video tape production, distribution & projection service |
| P1103 | Radio & TV production,distribution & transmission service |
| P1105 | Museums, library and archival services |
| P1106 | Recreation and sporting activity services |
| P1108 | Health Service provided by Indian hospitals,doctors,nurses,paramedical remotely/on-site) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/international-payments/overview
Discover the Cashfree APIs that power international payments, from accepting payments from India to collecting through global virtual accounts.
You can use the Cashfree API in test mode, which doesn't affect your live data or interact with the banking networks. The API key you use to authenticate the request determines whether the request is live mode or test mode.
For overseas businesses to collect payments from Indian customers
For Indian businesses to collect payments from customers worldwide
# Create Offer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/offers/create
openapi/payments/v2023-08-01.yaml post /offers
Use this API to create offers with Cashfree from your backend
# Get Offer by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/offers/get
openapi/payments/v2023-08-01.yaml get /offers/{offer_id}
Use this API to get offer by offer_id
# Create Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/orders/create
openapi/payments/v2023-08-01.yaml post /orders
### Order
An order is an entity which has a amount and currency associated with it. It is something for which you want to collect payment for.
Use this API to create orders with Cashfree from your backend to get a `payment_sessions_id`.
You can use the `payment_sessions_id` to create a transaction for the order.
# Get Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/orders/get
openapi/payments/v2023-08-01.yaml get /orders/{order_id}
Use this API to fetch the order that was created at Cashfree's using the `order_id`.
## When to use this API
- To check the status of your order
- Once the order is PAID
- Once your customer returns to `return_url`
# Get Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/orders/get-order-extended
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/extended
Use this API to fetch the order related data like address,cart,offers,customer details etc using the Cashfree's `order_id`.
## When to use Get Order Extended API
- To get the extended data associated with order.
- Once the order is PAID
- Once your customer returns to `return_url`
This API allows you to retrieve payment data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Terminate Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/orders/terminate
openapi/payments/v2023-08-01.yaml patch /orders/{order_id}
Use this API to terminate the order that was created at Cashfree's using the `order_id`.
# Update Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/orders/update-order-extended
openapi/payments/v2023-08-01.yaml put /orders/{order_id}/extended
Use this api to update the order related data like shipment details,order delivery status etc.
## When to use this API
- To provide/update the shipment details or order delivery status.
- Once the order is PAID.
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/overview
Review the production and sandbox base URLs and the authentication headers you need to call the 2023-08-01 Cashfree API endpoints.
Use the latest version of our APIs [v2026-01-01](/docs/api-reference/payments/latest/overview) for any new integrations.
## Payment Gateway end points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Latest Version | v4, 2023-08-01 The previous versions were 2021-05-21, 2022-01-01, 2022-09-01 |
## Authentication
All the APIs require authentication, except the /orders/sessions API, which does not require any authentication and can be safely done from the browser as well.
Click [here](/docs/api-reference/authentication) for detailed information on API Authentication for Merchants and Partners.
***
## Payment Gateway APIs
### Orders
| API | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/previous/v2023-08-01/orders/create) | Use this API to create orders with Cashfree from your backend and get the payment link. |
| [Order Pay](/docs/api-reference/payments/previous/v2023-08-01/payments/pay) | Use this API when you have already created the orders and want Cashfree to process the payment. |
| [Preauthorization](/docs/api-reference/payments/previous/v2023-08-01/payments/authorize) | Use this API to capture or void a preauthorized payment. |
| [Get Order](/docs/api-reference/payments/previous/v2023-08-01/orders/get) | Use this API to view all details of an order. |
***
### Authentication
| API | Description |
| :- | :- |
| [Submit or Resend OTP](/docs/api-reference/payments/previous/v2023-08-01/payments/authenticate) | Use the submit or resend OTP API to send OTP to Cashfree. |
***
### Payments
| API | Description |
| :- | :- |
| [Get Payments for an Order](/docs/api-reference/payments/previous/v2023-08-01/payments/get-payments-for-order) | Use this API to view all payment details for an order. |
| [Get Payment by ID](/docs/api-reference/payments/previous/v2023-08-01/payments/get) | Use this API to view payment details of an order for a payment ID. |
***
### Settlements
| API | Description |
| :- | :- |
| [Get Settlements by Order ID](/docs/api-reference/payments/previous/v2023-08-01/settlements/settlements-for-order) | Use this API to view all the settlements of a particular order. |
| [Get All Settlements](/docs/api-reference/payments/previous/v2023-08-01/settlements/settlements) | Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range. |
***
### Payment links
| API | Description |
| :- | :- |
| [Create Payment Link](/docs/api-reference/payments/previous/v2023-08-01/payment-links/create) | Use this API to create a new payment link. The created payment link url will be available in the API response parameter link\_url. |
| [Fetch Payment Link Details](/docs/api-reference/payments/previous/v2023-08-01/payment-links/get) | Use this API to view all details and status of a payment link. |
| [Get Orders for a Payment Link](/docs/api-reference/payments/previous/v2023-08-01/payment-links/get-orders-for-link) | Use this API to view all order details for a payment link. |
| [Cancel Payment Link](/docs/api-reference/payments/previous/v2023-08-01/payment-links/cancel) | Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled. |
### Token vault
| API | Description |
| :- | :- |
| [Fetch All Saved Instruments](/docs/api-reference/payments/previous/v2023-08-01/token-vault/get-all) | Use this API to get all saved instruments for a customer ID. |
| [Fetch Single Saved Instrument](/docs/api-reference/payments/previous/v2023-08-01/token-vault/fetch-specific-saved-card-instrument) | Use this API to get specific saved instrument for a customer id and instrument ID. |
| [Delete Saved Instrument](/docs/api-reference/payments/previous/v2023-08-01/token-vault/delete) | Use this API to delete a saved instrument for a customer id and instrument ID. |
| [Fetch Cryptogram for Saved Instrument](/docs/api-reference/payments/previous/v2023-08-01/token-vault/generate-cryptogram) | Use this API to get the card network token, token expiry and cryptogram for a saved instrument using instrument ID. |
***
### Reconciliation
| API | Description |
| :- | :- |
| [Settlement Reconciliation](/docs/api-reference/payments/previous/v2023-08-01/settlements/settlement-reconciliation) | Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range. |
| [PG Reconciliation](/docs/api-reference/payments/previous/v2023-08-01/settlements/reconcile) | Use this API to get the payment gateway reconciliation details with date range. |
# Create Pre-Activated Vpas for partner
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/partners/create-pre-activated-vpas-for-partner
openapi/payments/v2023-08-01.yaml post /partners/merchant/qrcodes
Use this API to create a pre-activated vpa for partner.
# Get Pre-Activated Vpas for partner
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/partners/get-pre-activated-vpas-for-partner
openapi/payments/v2023-08-01.yaml get /partners/merchant/qrcodes
Use this API to get a pre-activated vpa for partner.
# Cancel Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-links/cancel
openapi/payments/v2023-08-01.yaml post /links/{link_id}/cancel
Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled.
# Create Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-links/create
openapi/payments/v2023-08-01.yaml post /links
Use this API to create a new payment link. The created payment link url will be available in the API response parameter link_url.
# Get Orders for a Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-links/get
openapi/payments/v2023-08-01.yaml get /links/{link_id}/orders
Use this API to view all order details for a payment link.
# Fetch Payment Link Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-links/get-orders-for-link
openapi/payments/v2023-08-01.yaml get /links/{link_id}
Use this API to view all details and status of a payment link.
# Payment Link Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-links/webhooks
Subscribe to Cashfree Payment Link webhooks so your server is notified whenever a link is paid, expires, or moves to a new status in real time.
## Webhook Schema
Payment Link webhook will be triggered when your customer makes a complete or partial payment using the payment link you shared. You will also be notified via the same webhook when the payment link gets cancelled or expired.
```json theme={"dark"}
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Payment for order 10",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9000000000",
"customer_email": "john@gmail.com",
"customer_name": "John "
},
"link_meta": {
"notify_url": "https://ee08e626ecd88c61c85f5c69c0418cb5.m.pipedream.net"
},
"link_url": "https://payments-test.cashfree.com/links//U1mgll3c0e9g",
"link_expiry_time": "2021-11-28T21:46:20",
"link_notes": {
"note_key_1": "note_value_1"
},
"link_auto_reminders": true,
"link_notify": {
"send_sms": true,
"send_email": true
},
"order": {
"order_amount": "22.00",
"order_id": "CFPay_U1mgll3c0e9g_ehdcjjbtckf",
"order_expiry_time": "2021-08-18T07:34:50",
"order_hash": "Gb2gC7z0tILhGbZUIeds",
"transaction_id": 1021206,
"transaction_status": "SUCCESS"
}
},
"type": "PAYMENT_LINK_EVENT",
"version": 1,
"event_time": "2021-08-18T12:55:06+05:30"
}
```
***
## Payload
| Field | Description | Example |
| :- | :- | :- |
| `cf_link_id` | Unique Identifier (generated by Cashfree) for this Link. | 1543566 |
| `link_id` | Unique Identifier (provided by merchant) for the Link. Only for merchant reference. | payment\_1psw |
| `link_status` | Current status of the payment link. Possible values: PAID, PARTIALLY\_PAID, EXPIRED, CANCELLED. | PARTIALLY\_PAID |
| `link_currency` | Default is INR. International currencies are supported. | INR |
| `link_amount` | The amount which merchant wants to collect for the order. | 500.00 |
| `link_amount_paid` | The amount paid by the customer. | 250.00 |
| `link_partial_payments` | Indicates if partial payments are allowed or not. Default value is false. | true |
| `link_minimum_partial_amount` | The minimum amount which must be paid by customer as the first payment. | 200.00 |
| `link_purpose` | A brief description for which payment must be collected. This is shown to the customer. | Payment for order 10 |
| `link_created_at` | Time at which the link was created. | 2021-08-18T07:13:41 |
| `customer_details` | Customer object, it contains customer details. | |
| `customer_name` | Name of the customer | John |
| `customer_phone` | Phone number of the customer | 9000000000 |
| `customer_email` | Email ID of the customer | [john@gmail.com](mailto:john@gmail.com) |
| `notify_url` | Payment notification URL | [https://payment1notify.net](https://payment1notify.net) |
| `link_url` | Payment link URL | [https://website.com/payments](https://website.com/payments) |
| `link_expiry_time` | The date till which the link will be valid, and then it will be expired. Default is 30 days. | 2021-11-28T21:46:20 |
| `link_notes` | Link notes object where you can provide any key-value pairs for your internal reference. | |
| `note_key_1` | | note\_value\_1 |
| `link_auto_reminders` | Default is false. Reminders will be sent to customers based on defined settings. | true |
| `link_notify` | Link notify object, used to notify customers via SMS or an email. | |
| `send_sms` | Default is true. If true, Cashfree will send the link to customer via SMS. | true |
| `send_email` | Default is true. If true and `customer_email` is provided, Cashfree will send the link via Email. | true |
| `order` | Order object, contains the order details. Will be null for cancelled and expired link statuses. | |
| `order_amount` | Order amount that the customer must pay. | 700 |
| `order_id` | The order ID generated. | order\_10 |
| `order_expiry_time` | The date till which the order will be valid. Default is 30 days. | 2021-08-18T07:34:50 |
| `transaction_id` | Transaction ID | id45466ye |
| `transaction_status` | Status of the transaction. Possible values: SUCCESS. | SUCCESS |
| `type` | Type of the webhook. `PAYMENT_LINK_EVENT` | PAYMENT\_LINK\_EVENT |
| `version` | The version of webhook. Build parsing logic with respect to this version. | 1 |
| `event_time` | Time when this webhook was created. | 2021-08-18T12:55:06+05:30 |
***
## Signature generation
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree Payment Gateway secret key along with the payload.
```javascript theme={"dark"}
// The payload here refers to the raw request sent by
// Cashfree to your endpoint. No modifications need to be made to this payload.
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Hello my friend how are you",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9905736722",
"customer_email": "customer@example.com",
"customer_name": "Supal "
},
"link_meta": { ... }
}
}
```
We send the webhook response in a form data format.
# Get Eligible Cardless EMI Payment Methods for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-methods/get-emi-for-customer-order
openapi/payments/v2023-08-01.yaml post /eligibility/cardlessemi
Use this API to get eligible Cardless EMI Payment Methods available for a customer on an order basis their phone number.
# Get Eligible Offers for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-methods/get-offers-for-order
openapi/payments/v2023-08-01.yaml post /eligibility/offers
Use this API to get eligible offers for an order_id or order amount.
# Get Eligible Paylater for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-methods/get-paylater-for-customer-order
openapi/payments/v2023-08-01.yaml post /eligibility/paylater
Use this API to get eligible Paylater Payment Methods for a customer on an order.
# Get eligible Payment Methods
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payment-methods/get-payment-methods
openapi/payments/v2023-08-01.yaml post /eligibility/payment_methods
Use this API to get eligible Payment Methods
# Submit or Resend OTP
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/authenticate
openapi/payments/v2023-08-01.yaml post /orders/pay/authenticate/{cf_payment_id}
If you accept OTP on your own page, you can use the below API to send OTP to Cashfree.
# Preauthorization
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/authorize
openapi/payments/v2023-08-01.yaml post /orders/{order_id}/authorization
Use this API to capture or void a preauthorized payment
# Get Payment by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/get
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/payments/{cf_payment_id}
Use this API to view payment details of an order for a payment ID.
# Get Payments for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/get-payments-for-order
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/payments
Use this API to view all payment details for an order.
# Order Pay
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/pay
openapi/payments/v2023-08-01.yaml post /orders/sessions
Use this API when you have already created the orders and want Cashfree to process the payment. To use this API S2S flag needs to be enabled
from the backend. In case you want to use the cards payment option the PCI
DSS flag is required, reach out to us by filling out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1)".
# Payment Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks
Subscribe to Cashfree payment webhooks to receive asynchronous events for successful, failed, and user-dropped payment attempts on your orders.
Webhooks are server callbacks to your server from Cashfree. Cashfree sends webhooks for the following events for a `payment`:
* [Payment success webhook](/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks#payment-success-webhook)
* [Payment failed webhook](/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks#payment-failed-webhook)
* [Payment user dropped webhook](/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks#payment-user-dropped-webhook)
* [Payment charges webhook](/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks#payment-charges-webhook)
## Payment success webhook
A payment success webhook is triggered when a payment is successfully completed. You can use this for: Updating order status, triggering fulfilment, send confirmation to customer.
Some parameters in the API response may return null values depending on the flow type. In the Flowwise flow, all actual parameter values are returned. However, in other flows, some fields in the response may contain null.
```javascript Version (2023-08-01) theme={"dark"}
{
"data": {
"order": {
"order_id": "order_OFR_2",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "1453002795",
"payment_status": "SUCCESS",
"payment_amount": 1,
"payment_currency": "INR",
"payment_message": "00::Transaction success",
"payment_time": "2022-12-15T12:20:29+05:30",
"bank_reference": "234928698581",
"auth_id": null,
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "suhasg6@ybl"
}
},
"payment_group": "upi"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9908734801"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_order_reference_id": "abc_124",
"gateway_settlement": "CASHFREE",
"gateway_status_code": null
},
"payment_offers": [
{
"offer_id": "0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type": "DISCOUNT",
"offer_meta": {
"offer_title": "50% off on UPI",
"offer_description": "50% off for testing",
"offer_code": "UPI50",
"offer_start_time": "2022-11-09T06:23:25.972Z",
"offer_end_time": "2023-02-27T18:30:00Z"
},
"offer_redemption": {
"redemption_status": "SUCCESS",
"discount_amount": 1,
"cashback_amount": 0
}
}
]
},
"event_time": "2023-08-01T11:16:10+05:30",
"type": "PAYMENT_SUCCESS_WEBHOOK"
}
```
## Payment failed webhook
The payment failed webhook notifies you when a payment attempt fails and we receive a failed response from the bank. Use case: Update order status, notify customer, initiate retry flow
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_d8bjgga36hmg_gc2pgapl4t",
"order_amount": 1924,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "6420634"
}
},
"payment": {
"cf_payment_id": "5114917126974",
"payment_status": "FAILED",
"payment_amount": 1924,
"payment_currency": "INR",
"payment_message": "Internal Server Error",
"payment_time": "2025-04-03T14:57:38+05:30",
"bank_reference": null,
"auth_id": null,
"payment_method": {
"cardless_emi": {
"channel": null,
"provider": "flexmoney",
"phone": "+919611199227",
"emi_details": null
}
},
"payment_group": "cardless_emi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": null,
"customer_phone": "+919611199227"
},
"error_details": {
"error_code": "TRANSACTION_DECLINED",
"error_description": "payment has been declined",
"error_reason": "debit_failed",
"error_source": "bank",
"error_code_raw": null,
"error_description_raw": null,
"error_subcode_raw": null
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "2191827274",
"gateway_payment_id": "5114917126974",
"gateway_status_code": null,
"gateway_order_reference_id": "null",
"gateway_settlement": null,
"gateway_reference_name": null
},
"payment_offers": null
},
"event_time": "2025-04-03T14:57:38+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
## Payment user dropped webhook
The User Dropped Webhook notifies you when your customer abandons the payment flow. It will help you understand if customers attempted to pay or not. Some common scenarios where the transaction will be marked as USER\_DROPPED are:
* User was redirected to the bank's OTP page, but never entered the OTP.
* User was redirected to open the UPI app, but never entered the UPI PIN.
* User was shown the 3ds OTP modal, but did not enter the OTP.
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
## Payment charges webhook
A payment charges webhook is triggered after a successful payment when Cashfree finalises the Transaction Discount Rate (TDR) and related charges for that payment. The event time can be later than the payment time. Use this webhook to reconcile per-payment charges and the net settlement amount.
To receive this event, subscribe to **Success Payment TDR** when you [configure webhooks](/docs/payments/online/webhooks/configure) in the Merchant Dashboard. The webhook `type` in the payload is `PAYMENT_CHARGES_WEBHOOK`.
The `payment_method` object in this webhook can be empty (`{}`). This is expected for the payment charges event.
For background on TDR, see [What is TDR?](/docs/help/account/pricing#what-is-tdr).
### `charges_details` fields
| Field | Description | Example |
| - | - | - |
| `service_charge` | Service charge (TDR) applicable for the payment. | `0.12` |
| `service_tax` | Service tax applicable on the service charge. | `0.02` |
| `settlement_amount` | Net amount for the payment after deducting the service charge and service tax. | `5.86` |
| `settlement_currency` | Currency of the settlement amount. | `INR` |
| `service_charge_discount` | Discount applied on the service charge, if any. Returns `null` when no discount applies. | `null` |
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
## Sample payload by payment method
The instrument used for making a payment will vary by the payment methods used by the customer. Details of the payload by payment method are documented for reference.
```javascript theme={"dark"}
{
...,
"payment_method": {
"card": {
"channel": null,
"card_number": "470613XXXXXX2123",
"card_network": "visa",
"card_type": "credit_card",
"card_sub_type": "C",
"card_country": "IN",
"card_bank_name": "TEST Bank" ,
"card_network_reference_id": "100212023061200000001014824849"
}
},
"payment_group": "credit_card",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"netbanking": {
"channel":null,
"netbanking_bank_code":"3022",
"netbanking_bank_name":"ICICI Bank"
}
},
"payment_group":"net_banking",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "suhasg6@ybl",
}
},
"payment_group":"upi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"app": {
"channel":"AmazonPay",
"upi_id":null
}
},
"payment_group":"wallet",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"credit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
}
}
},
"payment_group":"credit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"debit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
}
}
},
"payment_group":"debit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"cardless_emi":{
"channel":null,
"provider":"flexmoney",
"phone":"9731117102",
"emi_details":null
}
},
"payment_group":"cardless_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"pay_later":{
"channel":null,
"provider":"olapostpaid",
"phone":"9731117102"
}
},
"payment_group":"pay_later",
...
}
```
# Create VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/create-vba
openapi/pgvba/pgvba.yaml post /pg/vba
Use this API to create a virtual bank account. It allows you to receive payments just like a regular bank account.
# Create VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/create-vba-notification-group
openapi/pgvba/pgvba.yaml post /pg/vba/notificationgroup
Use this API to create a notification group. The recipients in the group will receive notifications regarding the payment details.
# Edit VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/edit-vba
openapi/pgvba/pgvba.yaml put /pg/vba/{virtual_account_id}
Use this API to edit the details of the created virtual bank account.
# Edit VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/edit-vba-notification-group
openapi/pgvba/pgvba.yaml put /pg/vba/notificationgroup/{notification_group_name}
Use this API to edit the details of the created notification group.
# Get VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/get-vba
openapi/pgvba/pgvba.yaml get /pg/vba/{virtual_account_id}
Use this API to get the details of the created virtual bank account by entering the virtual account ID.
# Get VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/get-vba-notification-group
openapi/pgvba/pgvba.yaml get /pg/vba/notificationgroup/{notification_group_name}
Use this API to get the details of the created notification group.
# Get VBA Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/get-vba-payments
openapi/pgvba/pgvba.yaml get /pg/vba/{virtual_account_id}
Use this API to get the details of the created virtual bank account by entering the virtual account ID.
# Get VBA Payments By UTR
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/get-vba-payments-by-utr
openapi/pgvba/pgvba.yaml get /pg/vba/payments/{utr}
Use this API to get the payment details by entering the unique transaction reference (UTR).
# Manage VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/manage-vba
openapi/pgvba/pgvba.yaml patch /pg/vba/{virtual_account_id}
Use this API to manage the status of the created virtual bank account.
# Manage VBA Notification Group Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/pgvba/manage-vba-notification-group-status
openapi/pgvba/pgvba.yaml patch /pg/vba/notificationgroup/{notification_group_name}
Use this API to modify the status of the created notification group.
# Create Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/refunds/create
openapi/payments/v2023-08-01.yaml post /orders/{order_id}/refunds
Use this API to initiate refunds.
# Get Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/refunds/get
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/refunds/{refund_id}
Use this API to fetch a specific refund processed on your Cashfree Account.
# Get All Refunds for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/refunds/get-refunds-for-order
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/refunds
Use this API to fetch all refunds processed against an order.
# Refund Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/refunds/webhooks
Subscribe to Cashfree refund webhooks to track when a refund is initiated, succeeds, or fails so you can keep your records and customers in sync.
Webhooks are server callbacks to your server from Cashfree. We send refund webhooks for three different events for a payment.
1. Refund is successfully processed
2. Refund is cancelled by Cashfree - we were unable to successfully refund to customer even after multiple attempts.
3. For successful Auto-refunds - Read more about Auto-Refunds [here](/docs/payments/manage/refunds/overview#auto-refunds)
## Refund Webhook Payload
```javascript Refund Webhook Payload theme={"dark"}
{
"data":{
"refund":{
"cf_refund_id":11325632,
"cf_payment_id":789727431,
"refund_id":"refund_sampleorder0413",
"order_id":"sampleorder0413",
"refund_amount":2.00,
"refund_currency":"INR",
"entity":"Refund",
"refund_type":"MERCHANT_INITIATED",
"refund_arn":"205907014017",
"refund_status":"SUCCESS",
"status_description":"Refund processed successfully",
"created_at":"2022-02-28T12:54:25+05:30",
"processed_at":"2022-02-28T13:04:27+05:30",
"refund_charge":0,
"refund_note":"Test",
"refund_splits":[
{
"merchantVendorId":"sampleID12345",
"amount":1,
"percentage":null
},
{
"merchantVendorId":"otherVendor",
"amount":1,
"percentage":null
}
],
"metadata":null,
"refund_mode":"STANDARD"
}
},
"event_time":"2022-02-28T13:04:28+05:30",
"type":"REFUND_STATUS_WEBHOOK"
}
```
## Auto Refund Webhook Payload
Auto-refund webhooks differ from standard refund webhooks because they handle refunds that occur automatically (like failed payment attempts) rather than manual refunds tied to specific orders. Since these automatic refunds may happen before an order is created, they don't contain the usual order-related data fields that are mandatory in standard refund webhooks,
```javascript Auto-refund webhook payload theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
# Release Notes for v2023-08-01
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/release-notes
Explore key changes in the Cashfree API version 2023-08-01 release, covering breaking updates, new headers, and entity changes.
Following are the key changes made in the version 2023-08-01:
New header "x-deprecated-at" is added in the API response which will let you
know the date when the used version is going to get deprecated.
All cashfree IDs like `cf_order_id`, `cf_payment_id`, `cf_refund_id` etc are
now in **string** format instead of **integer** (in older versions).
1. We have removed payments, refunds, settlements urls from order entity. 2.
`customer_uid` part of customer\_details in order entity. This is the unique
identifier of the customer created at Cashfree. You can create customer at
cashfree using [Create Customer API](/docs/api-reference/payments/previous/v2023-08-01/customers/create) 3.
`order_status` can have two more values - "TERMINATED" and
"TERMINATION\_REQUESTED". Find the complete list of order statuses
[here](/docs/payments/online/resources/payment-lifecycle#order-states) 4. No longer
support for `notify_url` in Create Order API. You can [configure
webhooks](/docs/api-reference/payments/previous/v2023-08-01/payments/webhooks) from dashboard instead.
We have released a new API to terminate an Order. Find API details - [Order
Termination API.](/docs/v4/reference/pgterminateorder)
We have released Customer APIs to let merchants create and manager their
customers. Find more about this here - [Customer
Management](/docs/api-reference/payments/previous/v2023-08-01/customers/create)
Find newly released [SPOS APIs](/docs/api-reference/payments/previous/v2023-08-01/softpos/create-terminal-transaction)
Earlier cf\_refund\_id used to start with a prefix "refund\_". In this
version, you will not get that prefix and cf\_refund\_id will be directly be
the id without any prefix. Example - OLD cf\_refund\_id = "refund\_41805719" ,
NEW cf\_refund\_id = "41805719"
# Mark Order For Settlement
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/mark-order-for-settlement
openapi/payments/v2023-08-01.yaml post /orders/settlements
Use this API to pass the CBRICS ID to Cashfree and mark an order for settlement.
# PG Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/reconcile
openapi/payments/v2023-08-01.yaml post /recon
- Use this API to get the payment gateway reconciliation details with date range.
- It will have events for your payment account
# Settlement Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/settlement-reconciliation
openapi/payments/v2023-08-01.yaml post /settlement/recon
- Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range.
- This API will return events for the settlement IDs you want
# Settlement Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/settlement-webhooks
Subscribe to Cashfree settlement webhooks so your reconciliation system is alerted whenever a payout to your merchant or vendor account completes.
We broadly send two types of notifications when a payout happens.
1. Payout to Merchant account
2. Payout to Vendor account (if you are using Easy Split)
## Settlement Webhook
This webhook is triggered whenever there is a payout to your merchant account. The settlement webhooks will notify you about instant settlements in addition to the standard settlement webhooks. We send webhooks for four different events for a `settlement`.
| Webhook event | Description |
| - | - |
| SETTLEMENT\_INITIATED | This webhook will be triggered when a settlement is initiated. |
| SETTLEMENT\_SUCCESS | This webhook will be triggered when a settlement is successful. |
| SETTLEMENT\_FAILED | This webhook will be triggered when a settlement has failed. |
| SETTLEMENT\_REVERSED | This webhook will be triggered when a settlement has been reversed. |
The following webhook is sent for other types of settlements as well: instant settlement or an on-demand settlement.
```javascript Settlement webhook theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 97.94,
"payment_amount": 100,
"payment_from": "2022-02-14 12:00:00",
"payment_till": "2022-02-14 12:15:00",
"reason": null,
"service_charge": 1.75,
"service_tax": 0.31,
"settled_on": "2022-02-14T12:35:19+05:30",
"settlement_type": "STANDARD", //settlement type //
"settlement_amount": 97.94,
"settlement_id": 738,
"settlement_initiated_on": "2022-02-14T12:35:17+05:30",
"status": "SUCCESS",
"utr": 1644822317781212,
"settlement_charge": 0, // applicable for instant settlement //
"settlement_tax": 0, // applicable for instant settlement //
"remarks": null. // applicable for instant settlement //
}
},
"event_time": "2022-02-08T13:37:34+05:30",
"type": "SETTLEMENT_SUCCESS"
}
```
## Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | Sum of refunds, disputes, and chargebacks included in this settlement. | 0 |
| amount\_settled | Total amount settled in this schedule. | 15 |
| payment\_amount | Total transaction amount considered for settlement. | 15 |
| payment\_from | Start date and time from which payments are considered for settlement. | 2022-02-14 12:00:00 |
| payment\_till | End date and time till which payments are considered for settlement. | 2022-02-23 12:00:00 |
| reason | Reason for failed or reversed settlements. | Transfer mode not valid for beneficiary. |
| service\_charge | Service charges applicable to the payments included in this settlement. | 2 |
| service\_tax | Service tax applicable to the payments included in this settlement. | 0 |
| settled\_on | Date and time when the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_type | Type of settlement (e.g., INSTANT). | INSTANT |
| settlement\_amount | Net settlement amount for the payments included in this settlement. | 13 |
| settlement\_id | Unique settlement ID generated by Cashfree. | 1155353 |
| settlement\_initiated\_on | Date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (INITIATED, SUCCESS, FAILED, or REVERSED). | SUCCESS |
| utr | Unique transaction reference number provided by the bank for the settlement. | N076221079016329 |
| settlement\_charge | Additional charge applicable for instant settlement. | 10.10 |
| settlement\_tax | Settlement tax applicable for instant settlement. | 01.97 |
| remarks | Any remarks specified by the merchant. | Settlement Initiated |
| event\_time | Time when the settlement webhook was triggered. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook event (SETTLEMENT\_INITIATED, SETTLEMENT\_SUCCESS, SETTLEMENT\_FAILED, or SETTLEMENT\_REVERSED). | SETTLEMENT\_SUCCESS |
## Vendor Settlement Webhook
This section only applies to merchants using our Easy Split product
These settlement webhooks automate notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
| Webhook event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
```javascript Vendor Settlement Webhook theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 10,
"payment_amount": null,
"payment_from": "2022-05-26",
"payment_till": "2022-05-26",
"reason": null,
"service_charge": 0.05,
"service_tax": 0.01,
"settled_on": "2022-05-26T15: 06: 14+05: 30",
"settled_orders_count": null,
"settlement_amount": 10,
"settlement_id": 6151,
"settlement_initiated_on": "2022-05-26T15: 06: 09+05: 30",
"settlement_type": null,
"status": "CREATED",
"utr": null,
"vendor_id": IS_1hour_Upi,
"vendor_transaction_amount": 10
},
"event_time": "2022-05-26T15:06:15+05:30",
"type": "VENDOR_SETTLEMENT_INITIATED"
}
}
```
# Get All Settlements
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/settlements
openapi/payments/v2023-08-01.yaml post /settlements
Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range.
# Get Settlements by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/settlements/settlements-for-order
openapi/payments/v2023-08-01.yaml get /orders/{order_id}/settlements
Use this API to view all the settlements of a particular order.
# Fetch Simulation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/simulation/fetch-simulation
openapi/payments/v2023-08-01.yaml get /simulate/{simulation_id}
Use this API to fetch simulated payment details.
# Simulate Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/simulation/simulate-payment
openapi/payments/v2023-08-01.yaml post /simulate
Use this API to simulate payment. To use this API you should first create an order using the Create Order API. Also, you need to create a payment with the same order.
# Create Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/create-terminal
openapi/payments/v2023-08-01.yaml post /terminal
Use this API to create new terminals to use softPOS.
# Create Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/create-terminal-transaction
openapi/payments/v2023-08-01.yaml post /terminal/transactions
Use this API to create a new terminal transaction. To use this API you should first create an order using the Create Order API. Also, you need to enter the terminal details while creating the order and pass the same terminal information while creating a transaction using the below mentioned API.
# Demap Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/demap-soundbox-vpa
openapi/payments/v2023-08-01.yaml post /terminal/demap/soundbox
Use this API to demap a device from soundbox.
# Fetch Terminal QR Codes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/fetch-terminal-qr-codes
openapi/payments/v2023-08-01.yaml get /terminal/qrcodes
You can fetch all the StaticQRs corresponding to given terminal id or phone number. Provide either the terminal_phone_no or terminal_id in the request.
# Fetch Terminal Soundbox vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/fetch-terminal-soundbox-vpa
openapi/payments/v2023-08-01.yaml get /terminal/soundbox/qrcodes
You can fetch all the active and mapped SoundboxVpa corresponding to given terminal id or deviceSerialNo. Provide either the device_serial_no or cf_terminal_id in the request.
# Get Terminal Status using Phone Number
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/get-terminal-status-using-phone-number
openapi/payments/v2023-08-01.yaml get /terminal/{terminal_phone_no}
Use this API to view all details of a terminal.
# Get Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/get-terminal-transaction
openapi/payments/v2023-08-01.yaml get /terminal/{cf_terminal_id}/payments
Use this API to get terminal transaction.
# Onboard Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/onboard-soundbox-vpa
openapi/payments/v2023-08-01.yaml post /terminal/soundbox
Use this API to onboard a terminal Vpa to soundbox.
# Offline Payments Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks
Subscribe to Cashfree softPOS webhooks to track terminal onboarding, status, and transaction events for in-person card and UPI payments in real time.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
Cashfree sends the following webhooks for softPOS:
* [Payment Success](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#payment-success-webhook-version-2022-09-01)
* [Payment Failed](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#payment-failed-webhook-version-2022-09-01)
* [User Dropped](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#user-dropped-webhook-version-2022-09-01)
* [Refunds](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#refund-webhook-version-2022-09-01)
* [Auto Refund](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#auto-refund-webhook-version-2022-09-01)
* [Disputes](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#dispute-created)
* [Settlements](/docs/payments/split/webhooks)
* [Terminal](/docs/api-reference/payments/previous/v2023-08-01/softpos/softpos-webhooks#terminal-status-update-webhook-version-2022-09-01)
***
## Payment Success Webhook Version: (2022-09-01)
The new payment success webhook notifies you about the payment, and gives you comprehensive information about successful payments. A notification is sent to your backend from Cashfree when payments are successful. These notifications are useful in cases when the internet connection is unstable or slow while the payment is being processed. This will allow you to reconcile all the successful orders at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request as well as endpoints configured on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
### Sample payload
```java theme={"dark"}
{
"data": {
"order": {
"order_id": "order_OFR_2",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 1453002795,
"payment_status": "SUCCESS",
"payment_amount": 1,
"payment_currency": "INR",
"payment_message": "00::Transaction success",
"payment_time": "2022-12-15T12:20:29+05:30",
"bank_reference": "234928698581",
"auth_id": null,
"payment_method": {
"upi": {
"channel": null,
"upi_id": "9611199227@paytm"
}
},
"payment_group": "upi"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "[miglaniyogesh7@gmail.com]()",
"customer_phone": "9908734801"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1580762800",
"gateway_payment_id": "1453002795",
"gateway_status_code": null
},
"payment_offers": [
{
"offer_id": "0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type": "DISCOUNT",
"offer_meta": {
"offer_title": "50% off on UPI",
"offer_description": "50% off for testing",
"offer_code": "UPI50",
"offer_start_time": "2022-11-09T06:23:25.972Z",
"offer_end_time": "2023-02-27T18:30:00Z"
},
"offer_redemption": {
"redemption_status": "SUCCESS",
"discount_amount": 1,
"cashback_amount": 0
}
}
],
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "PAYMENT_SUCCESS_WEBHOOK"
}
```
***
## Payment Failed Webhook Version: (2022-09-01)
The payment failed webhook notifies you when transactions fail and we receive a failed response from the bank.
```java theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255"
}
},
"payment": {
"cf_payment_id": 1504280029,
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": null,
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_status_code": null
},
"payment_offers": null,
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-01-06T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
***
## User Dropped Webhook Version: (2022-09-01)
The User Dropped Webhook notifies you when customers drop out of the payment flow without completing the transaction. It will help you understand if customers attempted to pay or not.
Some common scenarios where the transaction will be marked as USER\_DROPPED are:
* Android UPI Intent Payments - when a user clicks on the back button in the UPI app without making any payment attempt.
* Card Payments - when a user drops out of the payment flow by closing the OTP verification page.
* UPI Collect Transactions - when a user does not enter the UPI PIN and closes the transaction screen
```java theme={"dark"}
{
"data": {
"order": {
"order_id": "testspos83",
"order_amount": 1.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 2150264295,
"payment_status": "USER_DROPPED",
"payment_amount": 1.00,
"payment_currency": "INR",
"payment_message": null,
"payment_time": "2023-11-03T12:37:32+05:30",
"bank_reference": null,
"auth_id": null,
"payment_method": {
"upi": {
"channel": null,
"upi_id": "testsuccess@gocash"
}
},
"payment_group": "upi"
},
"customer_details": {
"customer_name": "johndoe",
"customer_id": "9112",
"customer_email": "[johndoe@cashfree.com]()",
"customer_phone": "9876543210"
},
"payment_gateway_details": {
"gateway_name": null,
"gateway_order_id": null,
"gateway_payment_id": null,
"gateway_status_code": null,
"gateway_settlement": null
},
"payment_offers": null,
"terminal_details": {
"cf_terminal_id": 20532321,
"terminal_phone": "9876543210"
}
},
"event_time": "2023-11-03T12:37:44+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
***
## Refund Webhook Version: (2022-09-01)
Refund webhooks can be configured to receive automated notifications for refunds when either they are successfully processed or are cancelled. Merchants can build their own downstream systems like auto-updating their refund status, and sending a communication to customers by consuming refund webhooks.
The webhook notification will be sent on all the URLs added and enabled under the refund webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
### Sample payload
```java theme={"dark"}
{
"data": {
"refund": {
"cf_refund_id": 11325632,
"cf_payment_id": 789727431,
"refund_id": "refund_sampleorder0413",
"order_id": "sampleorder0413",
"refund_amount": 2.00,
"refund_currency": "INR",
"entity": "Refund",
"refund_type": "MERCHANT_INITIATED",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Refund processed successfully",
"created_at": "2022-02-28T12:54:25+05:30",
"processed_at": "2022-02-28T13:04:27+05:30",
"refund_charge": 0,
"refund_note": "Test",
"refund_splits": [
{
"merchantVendorId": "sampleID12345",
"amount": 1,
"percentage": null
},
{
"merchantVendorId": "otherVendor",
"amount": 1,
"percentage": null
}
],
"metadata": null,
"refund_mode": "STANDARD",
"terminal_details": {
"cf_terminal_id": 911876,
"terminal_phone": "9876543210"
}
}
},
"event_time": "2022-02-28T13:04:28+05:30",
"type": "REFUND_STATUS_WEBHOOK"
}
```
### Payload field description
| Field | Description | Example |
| - | - | - |
| cf\_refund\_id | Cashfree ID for a refund. | 11325632 |
| cf\_payment\_id | Cashfree ID of the payment for which refund is initiated. | 789727431 |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 21345 |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 |
| refund\_id | Merchant’s refund ID of the refund | refund\_sampleorder0413 |
| order\_id | Merchant’s order ID of the order for which refund is initiated. | sampleorder0413 |
| refund\_amount | Amount that was refunded | 2.00 |
| refund\_currency | Currency of the refund amount. | INR |
| entity | Type of object (refund always) | Refund |
| refund\_type | Type of refund (for webhook it will always be MERCHANT\_INITIATED) | MERCHANT\_INITIATED |
| refund\_arn | The bank reference number for refund | 205907014017 |
| refund\_status | Status of the refund (either SUCCESS or CANCELLED in refund webhook) | SUCCESS |
| status\_description | Description of refund status | Refund processed successfully |
| created\_at | Time of refund creation | 2022-02-28T12:54:25+05:30 |
| processed\_at | Time when refund was processed successfully | 2022-02-28T13:04:27+05:30 |
| refund\_charge | Charges in INR for processing refund | 0 |
| refund\_note | Note added by merchant for the refund | Cancelled Order |
| refund\_splits | Refund split details | \[] |
| metadata | Additional refund metadata | null |
| refund\_mode | Method or speed of processing refund (INSTANT or STANDARD) | STANDARD |
| event\_time | Time at which refund webhook was initiated. | 2022-02-28T13:04:28+05:30 |
| type | Type of webhook. REFUND\_STATUS\_WEBHOOK always | REFUND\_STATUS\_WEBHOOK |
***
## Auto Refund Webhook Version: (2022-09-01)
Auto-refund webhooks can be configured to receive automated notifications when auto-refunds are initiated, processed and delayed. Auto-refunds are refunds triggered automatically for unsuccessful payments, disputes, duplicate payments; or instances where payments are received directly to your VPA, regardless of whether an order has been generated.
Webhook notifications are sent to every URL added and enabled under **Auto-refund Webhooks**. Merchants can add new URLs and enable or disable existing ones for auto-refund webhooks at any point in time. The changes are reflected instantaneously.
### Sample payload
###
```java theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9773769999"
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
Find the description for each field of the payload below:
| Field | Description | Example |
| - | - | - |
| cf\_refund\_id | It represents the ID created by Cashfree to identify the refund. | 1243460973 |
| cf\_payment\_id | It represents the ID created by Cashfree to identify the payment for the initiated refund. | 2148333968 |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 21345 |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 |
| order\_id | It represents the ID created by you to identify the order for which the refund is initiated. | sampleorder0413 |
| bank\_reference | It represents the bank reference number for the transaction. | 234928698581 |
| refund\_currency | It represents the currency of the refund amount. | INR |
| refund\_amount | It represents the refunded amount. | 2 |
| refund\_type | It represents the refund type. The value will always be PAYMENT\_AUTO\_REFUND. | PAYMENT\_AUTO\_REFUND |
| refund\_arn | It represents the bank reference number for the refund. | 205907014017 |
| refund\_status | It represents the status of the refund (either SUCCESS or INITIATED) | SUCCESS |
| status\_description | It represents the description of the refund status (Two possible values: Auto-Refund initiated successfully or Auto-Refund processed successfully). | Auto-Refund initiated successfully |
| created\_at | It represents the time of auto-refund creation. | 2022-02-28T12:54:25+05:30 |
| processed\_at | It represents when the auto-refund was processed successfully. | 2022-02-28T13:04:27+05:30 |
| refund\_reason | It represents the reason of initiation of Auto-refund (Possible values: Credit was received for an incomplete payment. Refunded to customer for Dispute. Payment made directly to your VPA without order creation. Multiple payments were performed against same order. Payment details (amount, bank, etc.) do not match with created order or the payment was made after TTL.) | Multiple payments were performed against same order |
| refund\_charge | It represents the charges for processing refund in INR. | 0 |
| refund\_splits | It represents the refund split details. | \[] |
| metadata | It represents the additional metadata. | null |
| event\_time | It represents when the refund webhook was initiated. | 2022-02-28T13:04:28+05:30 |
| type | It represents the webhook type. The value will always be AUTO\_REFUND\_STATUS\_WEBHOOK. | AUTO\_REFUND\_STATUS\_WEBHOOK |
***
## Terminal Status Update Webhook Version: (2022-09-01)
The new terminal status update webhook notifies you about the terminal status update, and gives you comprehensive information about terminal updates.
```java theme={"dark"}
{
"data":{
"added_on":string"2024-03-07 15:11:02"
"cf_terminal_id":int1234
"last_updated_on":string"2024-04-26 12:16:08"
"terminal_id":int1233
"terminal_name":string"ABC"
"terminal_phone":string"9696969696"
"terminal_status":string"PROVISIONALLY_ACTIVE"
"terminal_type":string"STOREFRONT"
"review_remarks":string"approved"
}
"event_time":string"2024-04-26T12:16:08+05:30"
"type":string"TERMINAL_STATUS_UPDATE"
}
```
***
## Dispute Webhooks Version: (2022-09-01)
Dispute webhooks can be configured to receive automated notifications when disputes are created, updated and closed.
The webhook notification will be sent on all the URLs added and enabled under the dispute webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
| Webhook | Description |
| :- | :- |
| DISPUTE\_CREATED | Dispute\_created webhook will be triggered when a new dispute is created. |
| DISPUTE\_UPDATED | Dispute\_updated webhook will be triggered when a dispute is updated, for example when a comment is added by the Cashfree team, when the dispute moves into further stages like Pre-arbitration, Arbitration, or when the status of the dispute changes. |
| DISPUTE\_CLOSED | This webhook will be triggered when a dispute is closed. |
### Dispute created
**Sample Payload**
```java theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": "DISPUTE_CREATED",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21: 50: 04+05: 30",
"type": "DISPUTE_CREATED"
}
```
***
### Dispute updated
**Sample Payload**
```java theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
***
### Dispute closed
**Sample Payload**
```java theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
},
"terminal_details": {
"cf_terminal_id": 989876,
"terminal_phone": "9876543212"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
### Payload field description
| Field | Description | Example | Type |
| - | - | - | - |
| dispute\_id | Cashfree’s unique ID to identify a dispute. | 433475257 | Long |
| dispute\_type | Type of dispute created. Possible values: \n- DISPUTE \n- RETRIEVAL \n- CHARGEBACK \n- PRE\_ARBITRATION \n- ARBITRATION | Chargeback | String |
| cf\_terminal\_id | Cashfree Terminal ID of the payment for which refund is initiated. | 989876 | Long |
| terminal\_phone | The phone number of the corresponding terminal. | 9876543212 | String |
| reason\_code | Condition for which the customer is filing the case. See [dispute reason codes](/docs/payments/manage/disputes/reason-codes) to know more. | 13.6 | String |
| reason\_description | Description of the reason code. Codes for Chargeback cases are specified by Card networks/NPCI. | Credit not processed | String |
| dispute\_amount | The amount for which the dispute has been created. | 4500 | BigDecimal |
| created\_at | Time on which the dispute was registered on Cashfree’s system. | 2023-06-15T21:16:03+05:30 | LocalDateTime |
| updated\_at | Time on which the dispute was updated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| respond\_by | Time by which the merchant is expected to respond to the dispute. | 2023-06-18T00:00:00+05:30 | LocalDateTime |
| dispute\_status | Status of Dispute. All possible values are listed in the table below. | CHARGEBACK\_CREATED | String |
| cf\_dispute\_remarks | Any remarks specified by Cashfree on the dispute. | Please submit documents. | String |
| dispute\_update | Specifies what has been updated on the dispute. Possible Values: \n- STATUS\_UPDATE \n- TYPE\_UPDATE \n- COMMENT\_UPDATE | TYPE\_UPDATE | String |
| dispute\_action\_on | Specifies whether the action is on Cashfree or Merchant at a time. Possible Values: \n- MERCHANT \n- CASHFREE | MERCHANT | String |
| resolved\_at | Time on which the dispute was resolved/closed. | 2023-06-15T21:16:51.682836678+05:30 | LocalDateTime |
| event\_time | Time at which dispute webhook was initiated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| type | Type of webhook. Possible Values: DISPUTE\_CREATED, DISPUTE\_UPDATED, and DISPUTE\_CLOSED | DISPUTE\_CREATED | String |
# Update Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/update-soundbox-vpa
openapi/payments/v2023-08-01.yaml patch /terminal/{cf_terminal_id}/soundbox
Use this API to update a terminal Vpa to soundbox.
# Update Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/update-terminal
openapi/payments/v2023-08-01.yaml patch /terminal/{cf_terminal_id}
Use this API to update the terminal details. Email, Phone Number, and Terminal Meta are updatable for "Storefront". Only account status change is possible in case of "Agent".
# Update Terminal Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/update-terminal-status
openapi/payments/v2023-08-01.yaml patch /terminal/{cf_terminal_id}/status
Use this API to update the terminal status.
# Upload Terminal Docs
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/softpos/upload-terminal-docs
openapi/payments/v2023-08-01.yaml post /terminal/{cf_terminal_id}/docs
Use this API to upload the terminal documents.
# Get Vendor Balance Transfer Charges
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/billing/balance-transfer-charges
openapi/payments/v2023-08-01.yaml get /easy-split/amount/{amount}/charges
This API returns the applicable service charge and service tax for a vendor balance transfer, based on the provided amount and rate type.
# Create Adjustment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/configuration/create-adjustment
openapi/payments/v2023-08-01.yaml post /easy-split/vendors/{vendor_id}/adjustment
The Create Adjustment API will create a adjustment request either from vendor to the merchant or from merchant to the vendor.
# Split After Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/configuration/split-after-payment
openapi/payments/v2023-08-01.yaml post /easy-split/orders/{order_id}/split
Split After Payment API splits the payments to vendors after successful payment from the customers.
# Create Static Split Configuration
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/configuration/static-split
openapi/payments/v2023-08-01.yaml post /easy-split/static-split
This API will create a static split scheme wherein you can define the split type and the vendor-wise split percentage.
# Easy Split Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/easy-split-overview
Use Cashfree Easy Split to share each customer payment between vendors at checkout, automate vendor settlements, and reconcile splits from one place.
Easy Split automates the splitting of payments with vendors and partners on time. Collect payments from customers, and set up a flexible schedule options to disburse payments to your vendors. Get detailed reports on the transactions, settlements, refunds, vendor payments and adjustments.
**How does Easy Split Work?**
**You can perform the following tasks using Easy Split:**
* Add and manage all your vendors efficiently
* Split payments and settle them into multiple vendor accounts using the available schedule options cycles
* Check on-demand vendor balance and settle the money into the vendor accounts instantly
* Vendor reconciliation
The table below provides the list of Easy Split APIs along with their description:
**Vendor APIs**
| API name | Description |
| :- | :- |
| [Create Vendor](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/create) | Create Vendor API creates a new vendor in your Easy Split account. |
| [Update Vendor Details](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/update) | Update Vendor Details API updates the existing vendor details. |
| [Get Specific Vendor Details](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/download-documents) | Get Specific Vendor Details API gets the details of a specific vendor. |
| [Get All Vendor Details](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get) | Get All Vendor Details API gets the details of all the vendors associated with that Easy Split account. |
| [Transfer Vendor Balance](/docs/api-reference/payments/previous/v2023-08-01/split/configuration/create-adjustment) | Transfer Vendor Balance API adjusts the vendor balances. |
| [Create Refund](/docs/api-reference/payments/previous/v2023-08-01/refunds/create) | Create Refund API creates a new refund. |
**Split Order APIs**
| API name | Description |
| :- | :- |
| [Split at Order Level](/docs/api-reference/payments/previous/v2023-08-01/split/configuration/create-adjustment) | Use this API to create a split at order level. |
| [Split After Payment](/docs/api-reference/payments/previous/v2023-08-01/split/configuration/split-after-payment) | Split After Payment API created a split after the payment is completed. |
| [Get Split and Settlement Details by OrderId](/docs/api-reference/payments/previous/v2023-08-01/split/settlements/get-split-and-settlement-details) | Get Split and Settlement Details by OrderId API gets details of the split, settled and unsettled transactions of each vendor using the OrderID. |
**Settlement APIs**
| API name | Description |
| :- | :- |
| [Get Settlement Cycle Details]() | Get Settlement Cycle Details API gets the schedule option details. |
| [Get All Vendor Settlement Details]() | Get All Vendor Settlement Details API gets all the vendor settlement details. |
| [Get Vendor Settlement Details by Settlement ID]() | Get Vendor Settlement Details by Settlement ID API gets the Vendor Settlement of each vendor by SettlementID. |
**On Demand Settlement APIs**
| API name | Description |
| :- | :- |
| [Get On Demand Vendor Balance]() | Get On Demand Vendor Balance API gets the on-demand vendor balance. |
| [Settle On Demand Vendor Balance]() | Settle On Demand Vendor Balance API settles the balance to a vendor on-demand immediately. |
| [Get On Demand Settlement Status]() | Get On Demand Settlement Status API gets the on-demand settlement status. |
**Deferred Settlement APIs**
| API name | Description |
| :- | :- |
| [Set Vendor Settlement Eligibility Date for Orders]() | Set Vendor Settlement Eligibility Date for Orders API assigns a settlement eligibility date for an order and vendor combination. |
**Reconciliation APIs**
| API name | Description |
| :- | :- |
| [View Split Order Details Using Settlement ID]() | View Split Order Details Using Settlement ID API gets the details of the split order processed in a settlement using Settlement ID. |
| [Vendor Recon for a Time Period]() | Vendor Recon for a Time Period API gets the on demand settlement status by providing the on-demand request ID. |
| [Vendor Recon Using Vendor ID & Time Interval]() | Vendor Recon Using Vendor ID & Time Interval API gets the details of all events for a specific vendor within an interval. |
# Easy Split - Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/easy-split-postman-collection
Download the ready-made Postman collection for the Cashfree Easy Split APIs to test vendor, split, and settlement endpoints with sample requests.
Get started quickly with Cashfree's Easy Split APIs by downloading the collection and importing it in Postman.
Download Cashfree Easy Split Postman Collection
Watch the video below to learn how to setup API
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/end-points
Review the production and sandbox base URLs and authentication headers you need to call the Cashfree Easy Split APIs for vendor and split operations.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you can see your AppId and SecretKey.
Cashfree expects the API key to be included in all API requests to the server. Use the endpoint /api/v1/credentials/verify to verify your credentials.
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
| Test | [https://test.cashfree.com/](https://test.cashfree.com/) |
**Auto Collect End Points**
For Auto Collect pass the Authorization token. Use the [Authorize API](/docs/api-reference/payouts/v1/authorize) to generate the token for Auto Collect APIs.
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
| Test | [https://sandbox.cashfree.com/](https://sandbox.cashfree.com/) |
# Vendor Reconciliation API
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/reconciliation/vendor-recon
openapi/payments/v2023-08-01.yaml post /recon/vendor
This API allows users to fetch vendor reconciliation details using different filters. Use the appropriate filters based on your requirements.
- **View Split Order Details Using Settlement ID**: Retrieve details of split orders within a settlement by Settlement ID.
- **Vendor Recon for a Time Period**: Fetch reconciliation details for all vendors within a specific time interval.
- **Vendor Recon Using Vendor ID & Time Interval**: Get reconciliation details for a specific vendor within a given time interval.
# Get Split and Settlement Details by OrderID v2.0
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/settlements/get-split-and-settlement-details
openapi/payments/v2023-08-01.yaml post /split/order/vendor/recon
Use this API to get all the split details, settled and unsettled transactions details of each vendor who were part of a particular order by providing order Id or start date and end date.
# Create On Demand Balance Transfer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/settlements/on-demand-transfer
openapi/payments/v2023-08-01.yaml post /easy-split/vendors/{vendor_id}/transfer
The Create On Demand Transfer API will create a new on-demand request either from the merchant ledger or from the vendor ledger to the vendor bank account.
# Settlements Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/settlements/overview
Explore the Cashfree Easy Split settlement APIs that fetch payout details for vendors, run on-demand transfers, and reconcile each settled order.
Once you have created an order and your customer pays for the order, the amount is received by Cashfree and processes the settlement into your bank account.
With the settlement APIs, you can fetch the settlement details by providing the Order ID.
Apart from this, you can settle the payments instantly using the On-demand settlements option. This option allows you to receive the unsettled amount to your bank account instantly 24x7 including holidays.
#### Settlement APIs
| API name | Description |
| :- | :- |
| [Create On Demand Balance Transfer](/docs/api-reference/payments/previous/v2023-08-01/split/settlements/on-demand-transfer) | Create a new on-demand request either from the merchant ledger or from the vendor ledger to the vendor bank account. |
| [Get Split and Settlement Details by OrderID](/docs/api-reference/payments/previous/v2023-08-01/split/settlements/split-details) | Get all the split details, settled and unsettled transactions details of each vendor. |
| [Get Split and Settlement Details by OrderID v2.0](/docs/api-reference/payments/previous/v2023-08-01/split/settlements/get-split-and-settlement-details) | Get all the split details, settled and unsettled transactions details of each vendor. |
# Get Split and Settlement Details by OrderID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/settlements/split-details
openapi/payments/v2023-08-01.yaml get /easy-split/orders/{order_id}
Use this API to get all the split details, settled and unsettled transactions details of each vendor who were part of a particular order by providing order Id or start date and end date.
# Upload Vendor Docs
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/add-document
openapi/payments/v2023-08-01.yaml post /easy-split/vendor-docs/{vendor_id}
Use this API to upload KYC documents of a specific vendor.
# Create vendor
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/create
openapi/payments/v2023-08-01.yaml post /easy-split/vendors
Use this API to create a new vendor to your EasySplit account along with the KYC details. Provide KYC details such as account_type, business_type, gst, cin, pan, passport number and so on.
# Download Vendor Documents
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/download-documents
openapi/payments/v2023-08-01.yaml get /easy-split/vendor-docs/{vendor_id}/download/{doc_type}
Use this API to download the uploaded KYC documents of that particular vendor. Provide the document type. Click the link from the sample request to download the KYC document.
# Get Vendor All Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get
openapi/payments/v2023-08-01.yaml get /easy-split/vendors/{vendor_id}
Use this API to get the details of a specific vendor associated with your Easy Split account.
# Get Vendor All Documents Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get-document
openapi/payments/v2023-08-01.yaml get /easy-split/vendor-docs/{vendor_id}
Use this API to fetch the details of all the KYC details of a particular vendor.
# Get On Demand Balance
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get-on-demand-balance
openapi/payments/v2023-08-01.yaml get /easy-split/vendors/{vendor_id}/balances
This API fetches the available amount with the merchant, vendor, and the unsettled amount for the merchant as well as the vendor.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/overview
Browse every Cashfree Easy Split vendor API, including endpoints to onboard a vendor, upload KYC documents, fetch balances, and update vendor details.
This section consists of the new set of Vendor KYC APIs. Use these APIs to perform actions such as creating a vendor, updating vendor details, get vendor details, upload vendor KYC documents, get all vendor documents and so on.
**Vendors 2.0 APIs**
| API name | Description |
| :- | :- |
| [Create Vendor v2.0](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/create) | This API creates a new vendor in Cashfree system. |
| [Update Vendor Details v2.0](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/update) | This API updates the existing vendor details such as name, email, phone number, UPI details, and any of the KYC details. |
| [Get Vendor All Details](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get) | This API fetches all the details of a specific vendor by sharing the vendor ID. |
| [Upload Vendor Docs](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/add-document) | This API uploads the vendor KYC docs. |
| [Get Vendor All Document Status](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/get-document) | This API fetches the submitted vendor KYC document status. |
| [Get Vendor Document Download URL](/docs/api-reference/payments/previous/v2023-08-01/split/vendors/download-documents) | This API downloads the uploaded KYC documents. Provide the vendor ID and the document type. |
# Update vendor Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/vendors/update
openapi/payments/v2023-08-01.yaml patch /easy-split/vendors/{vendor_id}
Use this API to edit the existing vendor details added to your EasySplit account. You can edit vendor details such as name, email, phone number, upi details, and any of the KYC details.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/webhooks/overview
Subscribe to Cashfree Easy Split webhooks so your platform is notified whenever a vendor is updated or a vendor settlement is paid out by Cashfree.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events happen.
The table below lists the various webhook events:
| Webhook name | Description |
| :- | :- |
| [Vendor Settlement Webhook](/docs/api-reference/payments/previous/v2023-08-01/split/webhooks/vendor-settlement-webhooks) | Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed. |
| [Vendor Status Change Webhook](/docs/api-reference/payments/previous/v2023-08-01/split/webhooks/vendor-status-change-webhooks) | Configure vendor status change webhooks to receive automated notifications when vendor status is changed. |
# Vendor Settlement Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/webhooks/vendor-settlement-webhooks
Receive a Cashfree webhook every time a vendor settlement payout is processed, so you can reconcile vendor balances and notify partners in real time.
Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
The webhook notifications are sent on all the URLs added and enabled in the settlement webhook. You can add new URLs and enable or disable existing URLs for settlement webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for settlements.
| Webhook event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
***
### Vendor settlement initiated
SETTLEMENT\_INITIATED webhook is triggered when a settlement has been initiated by Cashfree.
```json theme={"dark"}
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "CREATED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settled_on": "null",
"reason": null,
"adjustment": 100.0,
"settlement_amount": 600.0,
"service_charge": 0.5,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"settlement_type": null,
"remarks": null,
"settlement_charge": null,
"settlement_tax": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_INITIATED"
}
```
### Vendor settlement success
```json theme={"dark"}
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "SUCCESS",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settled_on": "2023-06-08T15:10:37+05:30",
"reason": null,
"adjustment": 100.0,
"settlement_amount": 600.0,
"service_charge": 0.5,
"service_tax": 0.09,
"amount_settled": 600.0,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"settlement_type": null,
"remarks": null,
"settlement_charge": null,
"settlement_tax": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_SUCCESS"
}
```
***
### Vendor settlement failed
```json theme={"dark"}
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "FAILED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settled_on": "null",
"reason": null,
"adjustment": 100.0,
"settlement_amount": 600.0,
"service_charge": 0.5,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"settlement_type": null,
"remarks": null,
"settlement_charge": null,
"settlement_tax": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_FAILED"
}
```
***
### Vendor settlement reversed
```json theme={"dark"}
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "REVERSED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settled_on": "null",
"reason": Failed from bank end,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"settlement_type": null,
"remarks": null,
"settlement_charge": null,
"settlement_tax": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_REVERSED"
}
```
***
### Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | The sum of refunds, disputes, and chargeback part of this settlement is displayed here. | 0 |
| amount\_settled | The total amount that is settled in this schedule option. | 50 |
| payment\_amount | Total transaction amount considered for settlement. | 100 |
| payment\_from | Start date from which the payments are considered for settlement. | 2022-03-15 |
| payment\_till | End date till which the payments are considered for settlement. | 2022-03-23 |
| reason | Reason for failed and reversed settlements. Click [here](/docs/payments/split/webhooks#reasons-for-failed-and-reversed-settlements) to know more. | Transfer mode is not valid for beneficiary. |
| service\_charge | Service charges are applicable for the payments that are included in this settlement. | 2 |
| service\_tax | Service tax is applicable for the payments that are included in this settlement. | 0.50 |
| settled\_on | Date and time at which the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_amount | The sum of net settlement amount for the payments part of this settlement. | 13 |
| settlement\_id | Cashfree settlement ID | 1155353 |
| settlement\_initiated\_on | The date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (either INITIATED, SUCCESS, FAILED, or REVERSED) | SUCCESS |
| utr | The unique transaction reference number is given by the bank for the settlement. | N076221079016329 |
| vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| vendor\_transaction\_amount | Transaction amount split of vendor | 50 |
| event\_time | Time at which settlement webhook was initiated. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook - VENDOR\_SETTLEMENT\_INITIATED, VENDOR\_SETTLEMENT\_SUCCESS, VENDOR\_SETTLEMENT\_FAILED, or VENDOR\_SETTLEMENT\_REVERSED. | VENDOR\_SETTLEMENT\_SUCCESS |
### Reasons for failed and reversed settlements
| Reason | Category | Description |
| :- | :- | :- |
| BANK\_GATEWAY\_ERROR | Bank | Technical error at the bank |
| BENE\_BANK\_DECLINED | Bank | Rejected by Beneficiary bank due to business reasons |
| FAILED | Bank | No explicit failure reason from the bank |
| INVALID\_IFSC\_FAIL | Customer | Invalid ifsc code provided for bank account |
| INVALID\_ACCOUNT\_FAIL | Customer | Bank account is invalid |
| RETURNED\_FROM\_BENEFICIARY | Bank | Immediate reversal from the beneficiary bank |
| INSUFFICIENT\_BALANCE | Vendor | Your balance is exhausted, need to add funds |
| IMPS\_MODE\_FAIL | Bank | IMPS mode not supported for the beneficiary |
| RTGS\_MODE\_FAIL | Bank | RTGS mode not supported (only for RTGS) |
| REINITIALIZE\_TRANSFER\_LATER | Bank | Technical error at the bank, retry later |
| NRE\_ACCOUNT\_FAIL | Customer | Customer bank account is an NRE account |
| ACCOUNT\_BLOCKED | Customer | Customer bank account is blocked |
| DEST\_LIMIT\_REACHED | Bank | Transfer limit to beneficiary exceeded |
| INVALID\_MODE\_FAIL | Bank | Transfer mode not valid for beneficiary |
| NPCI\_UNAVAILABLE | Bank | NPCI in unavailable |
| BENEFICIARY\_BANK\_OFFLINE | Bank | Beneficiary bank is offline |
| INVALID\_AMOUNT\_FAIL | Vendor | Amount is invalid for the given transfer mode |
| SUSPECTED\_TRANSFER | Customer | Suspicious transfer identified |
| BENE\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| DISABLED\_MODE | Vendor | Transfer mode not enabled for the account |
| AMAZON\_AMOUNT\_EXCEED | Vendor | Amount should be less than 10000 for Amazon Pay mode |
| BENEFICIARY\_BLACKLISTED | Vendor | Beneficiary is blacklisted |
| PAYOUT\_INACTIVE | Vendor | Payout account is not active |
| INVALID\_TRANSFER\_AMOUNT | Vendor | Transfer amount is invalid |
| BENEFICIARY\_NOT\_EXIST | Vendor | Beneficiary does not exist |
| BENEFICIARY\_INVALID\_MODE | Vendor | Mode Not valid for Beneficiary |
| INVALID\_BENE\_ACCOUNT\_OR\_IFSC | Vendor | Invalid bank account number or ifsc provided |
| BENEFICIARY\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| ANY\_OTHER\_REASON | Bank | No reason provided for the failure/reversal |
| INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Customer | Invalid account |
***
### Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```json theme={"dark"}
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
# Vendor Status Change Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/split/webhooks/vendor-status-change-webhooks
Receive a Cashfree webhook whenever a vendor's KYC or activation status changes, so your platform always shows accurate Easy Split vendor states.
Configure vendor status change webhooks to receive automated notifications when vendor status is changed.
The webhook notifications are sent on all the URLs added and enabled in the vendor status change webhook. You can add new URLs and enable or disable existing URLs for vendor status change webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for vendor status change.
| Webhook event | Description |
| :- | :- |
| VENDOR\_STATUS\_UPDATE | This webhook will be triggered whenever there is a change in the status of the vendor. |
## Vendor status update
```json theme={"dark"}
{
"data": {
"merchant_vendor_id": "status002",
"email": "john.doe@cashfree.com",
"updated_status": "ACTION_REQUIRED",
"past_status": "IN_BENE_CREATION",
"account_holder": "JOHN DOE",
"phone": "9876554927",
"name": "BOB HOPE",
"product_type": "PG",
"max_split": 100,
"account_number": "890289871772",
"ifsc": "SCBL0036078",
"dashboard_access": false,
"vpa": "success@upi",
"account_type": "Individual",
"business_type": "Travel and Hospitality",
"updated_by": "AUTOMATED",
"document_status": {
"PAN": "VERIFIED",
"GSTIN": "ACTION_REQUIRED"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_STATUS_UPDATE"
}
```
***
## Payload field description
| Field | Description | Example |
| - | - | - |
| merchant\_vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| email | Email of the vendor. | [test@gmail.com](mailto:test@gmail.com) |
| updated\_status | Current status of the vendor. | ACTIVE |
| past\_status | Previous status of the vendor. | ACTION\_REQUIRED |
| account\_holder | Name of the account holder associated with the vendor. | John Doe |
| phone | Contact phone number of the vendor. | 9876554927 |
| name | Name of the vendor. | BOB HOPE |
| product\_type | Type of product offered to the vendor | PG |
| max\_split | The maximum percentage of the amount shared with a vendor in any order. | 100 |
| account\_number | Vendor's bank account number. | 12345678909 |
| ifsc | IFSC (Indian Financial System Code) associated with the vendor's bank. | SBIN1231935 |
| dashboard\_access | Access level to the dashboard for the vendor (if applicable). | FALSE |
| vpa | VPA of the vendor for UPI transactions. | success\@upi |
| account\_type | Type of the vendor's account. | Individual |
| business\_type | Type of business conducted by the vendor. | Travel and Hospitality |
| updated\_by | Entity or process that initiated the status update. | AUTOMATED |
| document\_status | Status of any associated documents for the vendor. | "PAN": "VERIFIED" "GSTIN": "ACTION\_REQUIRED" |
***
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```json theme={"dark"}
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/endpoints
Review the production and sandbox base URLs and authentication headers you need to call the v2023-08-01 Cashfree Subscriptions API endpoints.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you will see your AppId and SecretKey.
Cashfree expects the API key to be included in all API requests to the server. Use the endpoint **/api/v1/credentials/verify** to verify your credentials.
All API responses are in JSON format. POST requests should include ContentType: application/json
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
| Test | [https://test.cashfree.com/](https://test.cashfree.com/) |
# Create Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/create
openapi/payments/v2023-08-01.yaml post /subscriptions
Use this API to create a new subscription.
# Fetch Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/fetch
openapi/payments/v2023-08-01.yaml get /subscriptions/{subscription_id}
Use this API to fetch subscription details.
# Generate Transaction Return Summary
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/generate-transaction-summary
openapi/payments/v2023-08-01.yaml post /subscriptions/charge/{payment_id}/transaction-return-summary/generate
Use this API to generate transaction return summary for failed transactions (insufficient balance).
# Manage a subscription.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/manage
openapi/payments/v2023-08-01.yaml post /subscriptions/{subscription_id}/manage
Use this API to manage subscriptions. You can cancel, pause, activate, or change the plan associated with a subscription. To update the recurring amount for a periodic subscription, create a new plan with the revised amount, and then use the Manage Subscription API to associate the subscription with the new plan. Include the CHANGE_PLAN action and the new plan ID in the request body. Customers will not be notified about the restructuring. The charge amount cannot exceed the maximum amount defined in the original plan.Please note that the CHANGE_PLAN and PAUSE actions are not supported for On-Demand Subscriptions.
# API to get all the payment method details available for subscription payments.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/payment-methods
openapi/payments/v2023-08-01.yaml post /subscriptions/eligibility/payment_methods
Use this API to check if a payment method is enabled for your account.
# API to upload file for Physical Nach Authorization.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/physical-nach-mandate
openapi/payments/v2023-08-01.yaml post /subscriptions/pay/documents/{payment_id}
Use this API to upload file for Physical Nach Authorization.
# Fetch details of a single payment.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/payment/fetch
openapi/payments/v2023-08-01.yaml get /subscriptions/{subscription_id}/payments/{payment_id}
Use this API to fetch details of a single payment of a subscription.
# Fetch details of all payments of a subscription.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/payment/fetch-payments-for-mandate
openapi/payments/v2023-08-01.yaml get /subscriptions/{subscription_id}/payments
Use this API to fetch all payments of a subscription.
# Manage a single payment.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/payment/manage
openapi/payments/v2023-08-01.yaml post /subscriptions/{subscription_id}/payments/{payment_id}/manage
Use this API to manage a payment of a subscription. A payment can be cancelled or retried with this API.
# Raise a charge or create an auth.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/payment/raise
openapi/payments/v2023-08-01.yaml post /subscriptions/pay
Use this API to create an auth or to raise a charge.
# Physical Mandates
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/physical-mandates
Create, authorise, and manage NACH physical mandates using Cashfree Subscriptions APIs, covering customer signatures and bank details.
Physical mandate is the process of authorisation where the customer requires only their signature and bank account details. There is no requirement to have a Debit Card or Netbanking enabled to set up the mandate. Read more about [Physical Mandates](/docs/payments/subscription/payment-modes#bank-account-physical-mandate).
List of Physical Mandates APIs
| API name | Description |
| :- | :- |
| [Create Seamless Subscription API](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | Use this API to create a subscription by providing a custom payment experience to your customers by specifying the plan ID and the customer details. You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. TPV is applicable only for eNACH and UPI. |
| [Upload File](/docs/api-reference/payments/previous/subscriptionsv1/subscription/upload-physical-mandate-file) | Use this API to upload the Physical Nach registration forms that contain your customer’s bank account details and signature. Use the fileId you get in the response in the "Create Auth Seamless PhysicalMandate API". |
| [Create Auth Seamless Physical Mandate](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-authorization-request) | Use this API to create an Authorization request for your customer. For Physical mandates, this API lets Cashfree know that the nach form is to be raised to the bank for successfully registering the mandate in production. |
| [Update Authorisation Status](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/update-authorization-status) | Use this API to update the status of the authorisation from INITIALIZED to SUCCESS or FAILED. Provide the authID and the payment status. This is applicable only in the test environment. |
# Create a plan.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/plans/create
openapi/payments/v2023-08-01.yaml post /plans
A plan allows your customer to identify the features you offer along with your pricing. You can create plans as per the pricing you support for your services. For each plan, you can set a pre-decided frequency and amount with which they’ll be charged.
Example: Netflix Plans - Premium, Basic, Standard, Mobile. Each plan differs and caters for a particular set of audiences.
# Fetch Plan
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/plans/fetch
openapi/payments/v2023-08-01.yaml get /plans/{plan_id}
Use this API to fetch plan details.
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/rate-limits
Understand the per-minute rate limits on Cashfree Subscriptions APIs and how to handle throttling on recurring payments.
The rate limit value shows the number of API calls that were made in a minute. For example, if the rate limit is 400 - it means you can call a maximum of 400 API calls in a minute.
**Rate Limits in Sandbox & Production:**\
We use rate limiting for all endpoints. Rate limiting is based on your IP and your account Id. By default, the following rate limits are applied per minute.
| API | Rate limit value per minute | Rate limit type |
| :- | :- | :- |
| [Create Plan](/docs/api-reference/payments/previous/v2023-08-01/subscription/plans/create) | 60 | Account |
| [Create Subscription](/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/create) | 60 | Account |
| [Create Seamless Subscription](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | 60 | Account |
| [Get Subscription Details](/docs/api-reference/payments/previous/v2023-08-01/subscription/mandate/fetch) | 60 | Account |
| [Get All Subscription Payments](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-subscription-payments) | 60 | Account |
| [Get Single Subscription Payment](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-single-subscription-payment) | 60 | Account |
| [Cancel Charge](/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription) | 60 | Account |
| [Charge Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/charge-subscription) | 60 | Account |
| [Charge Retry](/docs/api-reference/payments/previous/subscriptionsv1/subscription/retry-subscription-charge) | 60 | Account |
| [Activate Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/activate-subscription) | 60 | Account |
| [Get Payment Details using Merchant Txn ID](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-payment-by-merchant-transaction-id) | 60 | Account |
| [Update Recurring-amount](/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-recurring-amount) | 60 | Account |
# Redirection Payload After Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/redirection-payload-after-authorization
Understand the POST parameters Cashfree sends to your subscription returnUrl after the customer authorises the payment on the Subscriptions API.
## Request configuration
| Method | Parameter type | URL |
| - | - | - |
| cf\_subReferenceId | Long | Unique Id which was generated when the subscription was created (Numeric) |
| cf\_subscriptionId | String | Checksum used to authenticate the transaction |
| cf\_authAmount | Float | The money that was charged to authorise the subscription |
| cf\_referenceId | Long | The referenceId/transactionId of authorisation in PG |
| cf\_status | String | Status of the subscription. In the returnUrl, the response should be ACTIVE or BANK\_APPROVAL\_PENDING if the authorisation was successful or INITIALIZED if the authorisation failed. |
| cf\_message | String | A brief note about the payment. |
| signature | String | The hash of all parameters in the request generated using secretKey. |
| cf\_umrn | String | The unique identifier associated with a mandate. Applicable if the payment mode is eMandate. |
| cf\_checkoutStatus | String | The subscription checkout status. The status can be SUCCESS, FAILED, SUCCESS\_DEBIT\_PENDING, SUCCESS\_TOKENIZATION\_PENDING. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_mode | String | The checkout payment mode. Modes - NPCI\_SBC, SBC\_UPI, SBC\_CREDIT\_CARD, SBC\_DEBIT\_CARD. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_subscriptionPaymentId | String | The subscription payment ID. (This parameter will be sent from the 1st of November onwards, by default. It is available in the test environment.) |
| cf\_umn | String | The unique identifier is associated with a mandate. This is applicable if the payment mode is **UPI**. |
🚧 **Return URL**
Once your customer has completed the checkout on the OTP page, we will redirect them back to your `return_url`. This will be a link-based redirection, so if you have provided a return\_url of the format - `https://b8af79f41056.eu.ngrok.io?order_id={order_id}` - your customer will be redirected to the URL - `https://b8af79f41056.eu.ngrok.io?order_id=order_271vfuhh1o4h6bQIigqyOx74YiJ1T`.
# Create a refund.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/refund/create
openapi/payments/v2023-08-01.yaml post /subscriptions/{subscription_id}/refunds
This API allows you to create refund on a successful payment. Refund amount can be partial or the full amount of the payment.
# Fetch details of a refund.
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/refund/fetch
openapi/payments/v2023-08-01.yaml get /subscriptions/{subscription_id}/refunds/{refund_id}
Use this API to fetch details of a refund of a subscription payment.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/refund/refund-apis-overview
Manage subscription refunds through Cashfree APIs, covering how to initiate, fetch, and reconcile refunds on recurring payments.
# List of Subscription Refund APIs
| API name | Description |
| :- | :- |
| [Create Refund](/docs/api-reference/payments/previous/v2023-08-01/subscription/refund/create) | Use this API to create a refund for the payment of a Subscription. |
| [Get Refund](/docs/api-reference/payments/previous/v2023-08-01/subscription/refund/fetch) | Use this API to fetch the status of the refund of a Subscription. |
# Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/subscription-postman-collection
Download the ready-made Postman collection for the v2023-08-01 Cashfree Subscriptions APIs and start testing mandate and charge calls in minutes.
Get started quickly with Cashfree's Subscription APIs by downloading the collection and importing it in Postman.
Download Cashfree Subscription Postman Collection
# Subscription Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/subscription/webhooks
Subscribe to Cashfree Subscription webhooks so your server reacts whenever a mandate is authorised, a charge succeeds, or a refund is processed.
Below are the various events that can be sent to your webhook endpoint. These webhooks will be triggered if the merchant has integrated our newer Subscription API.
If the merchant added the webhook under the 2023-08-01 version, they will receive the same version of the webhook for older subscriptions as well.
* `SUBSCRIPTION_STATUS_CHANGE`
* `SUBSCRIPTION_AUTH_STATUS`
* `SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED`
* `SUBSCRIPTION_PAYMENT_SUCCESS`
* `SUBSCRIPTION_PAYMENT_FAILED`
* `SUBSCRIPTION_PAYMENT_CANCELLED`
* `SUBSCRIPTION_REFUND_STATUS`
## `SUBSCRIPTION_STATUS_CHANGE`
Whenever a subscription is created it goes to initialised state and customer is expected to authorise it. The list of statuses where this webhook will get triggered are:
* ACTIVE
* ON\_HOLD
* COMPLETED
* CUSTOMER\_CANCELLED
* CUSTOMER\_PAUSED
* EXPIRED
* LINK\_EXPIRED
* BANK\_APPROVAL\_PENDING
```javascript theme={"dark"}
{
"data": {
"subscription_details": {
"cf_subscription_id": "123456",
"subscription_id": "Demo_Subscription",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2024-01-14T23:00:08+05:30",
"subscription_first_charge_time": "2024-01-10T23:00:08+05:30"
},
"customer_details": {
"customer_name": "john",
"customer_email": "john@dummy.com",
"customer_phone": "9908730221"
},
"plan_details": {
"plan_id": "plan12345",
"plan_name": "Plan Name",
"plan_type": "ON_DEMAND",
"plan_max_cycles": 10,
"plan_recurring_amount": 100.00,
"plan_max_amount": 1000.00,
"plan_currency": "INR",
"plan_note": "Note",
"plan_status": "ACTIVE"
},
"authorization_details": {
"authorizationAmount": 100,
"authorizationAmountRefund": true,
"approveByTime": "2022-02-09T18:04:34+05:30",
"authorizationReference": "6595231908096894505959",
"authorizationTime": "2022-08-03T16:09:51",
"authorizationStatus": "SUCCESS",
"paymentId": "123",
"paymentMethod": "DEBIT_CARD",
"instrumentId": "hsdg9"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_plan_id": "plan12345",
"gateway_auth_id": "6595231908096894505959"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_STATUS_CHANGE"
}
```
## SUBSCRIPTION\_AUTH\_STATUS
The event is triggered when the checkout is completed by the customer for success and failed cases.
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": 98765,
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200.75,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
## SUBSCRIPTION\_PAYMENT\_NOTIFICATION\_INITIATED
This webhook is used to inform the merchant that we have sent a notification of payment to the customer.
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": 98765,
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "PENDING",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
## SUBSCRIPTION\_PAYMENT\_SUCCESS
This notification is sent whenever a successful payment is processed for an active subscription.
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": 98765,
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
## SUBSCRIPTION\_PAYMENT\_FAILED
This notification is sent whenever payment processing fails for an active subscription.
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": 98765,
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Insufficient balance"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
## SUBSCRIPTION\_PAYMENT\_CANCELLED
This notification is sent whenever payment processing is cancelled by user for an active subscription.
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": 98765,
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Subscription is not active"
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
## SUBSCRIPTION\_REFUND\_STATUS
This event is triggered whenever a refund status of a transaction will be success, failed, or cancelled.
```javascript theme={"dark"}
{
"data": {
"payment_id": "pay8643",
"cf_payment_id": "863782648",
"refund_id": "refund2",
"cf_refund_id": "ref_212",
"refund_amount": 100,
"refund_note": "test",
"refund_speed": "INSTANT",
"refund_status": "SUCCESS",
"failure_details": null,
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_payment_id": "pay8643",
"gateway_refund_id": "refund2"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_REFUND_STATUS"
}
```
# Delete Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/token-vault/delete
openapi/payments/v2023-08-01.yaml delete /customers/{customer_id}/instruments/{instrument_id}
Use this API to delete a saved card instrument for a customer_id and instrument_id
# Fetch Specific Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/token-vault/fetch-specific-saved-card-instrument
openapi/payments/v2023-08-01.yaml get /customers/{customer_id}/instruments/{instrument_id}
Use this API to fetch a single specific saved card for a customer_id by it's instrument_id
# Fetch cryptogram for a saved card instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/token-vault/generate-cryptogram
openapi/payments/v2023-08-01.yaml get /customers/{customer_id}/instruments/{instrument_id}/cryptogram
Use this API To get the card network token, token expiry and cryptogram for a saved card instrument using instrument id
# Fetch All Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/token-vault/get-all
openapi/payments/v2023-08-01.yaml get /customers/{customer_id}/instruments
Use this API to fetch saved cards for a customer_id
# Card Token Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2023-08-01/token-vault/webhooks
Subscribe to Cashfree card token webhooks to receive asynchronous notifications whenever a saved card instrument is created, updated, or deleted.
| Event | Description |
| - | - |
| INSTRUMENT\_ACTIVE\_WEBHOOK | This webhook is triggered when the card is successfully tokenised. |
| INSTRUMENT\_FAILED\_WEBHOOK | This webhook is triggered when the card tokenisation fails. |
## Instrument active webhook
An instrument active webhook is triggered when a card is tokenised successfully from the networks like visa, mastercard, etc.
```javascript Instrument Active Webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "ACTIVE",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": "50012ADWQZJKHCLXLT61QTYD5QNX1",
"card_token_details": null
}
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_ACTIVE_WEBHOOK"
}
```
## Instrument failed webhook
An instrument failed webhook is triggered when a card was not tokenised from the networks like visa, mastercard, etc.
```javascript Instrument Failed Webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "FAILED",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": null,
"card_token_details": null
}
},
"error_details": {
"error_code": "NETWORK_ERROR",
"error_description": "Error while processing the request",
"error_source": "NETWORK"
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_FAILED_WEBHOOK"
}
```
## Payload field description
| Field | Description | Example |
| :- | :- | :- |
| customer\_id (String) | The customer ID associated with the save instrument request. It is sent by the merchant as a part of create order request in the customer ID field. | user199721 |
| afa\_reference (String) | cf\_payment\_id of the successful transaction done while saving instrument. | 887316963 |
| instrument\_id (String) | The reference ID of the saved instrument. Unique for a save instrument request but not unique for a particular instrument like card number. | af250dc5-e5e5-4e7d-a7cf-3f446741fa54 |
| instrument\_type (String) | Type of instrument - card | card |
| instrument\_uid (String) | Unique identifier for the instrument. For example, if a same card is saved by 2 different customers the instrument\_uid would be same for both the cards. | 680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660 |
| instrument\_display (String) | The display text for the saved instrument. For example, in case of saved cards the first 12 digits would be masked and only the last 4 digits would be visible in the instrument display string. It can be displayed to the customer for selecting a saved instrument for payment. | XXXXXXXXXXXX6854 |
| instrument\_status (String) | The status of saved instrument - INACTIVE, ACTIVE | ACTIVE |
| added\_at (String) | Timestamp at which instrument was saved. | 2022-04-14T10:42:59+05:30 |
| card\_network (String) | The card network to which the saved card belongs. Visa, Mastercard, Rupay, etc. | visa |
| card\_bank\_name (String) | Card issuing bank name. | HDFC BANK |
| card\_country (String) | Card issuing country code. | IN |
| card\_type (String) | debit, credit, prepaid, etc. | debit |
| card\_token\_details (Object) | Additional card token details like card token expiry, card token would be passed in this object. Note: Currently, the field is always passed as null. | null |
| event\_time (String) | Time at which webhook was initiated. | 2022-02-28T13:04:28+05:30 |
| type (String) | Type of the instrument webhook. | INSTRUMENT\_ACTIVE\_WEBHOOK |
# Order Pay Authorise Only
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/apple-pay/payments/authorize-payment-for-an-order
post /orders/sessions/authorize
Use this API when an order has already been created and you want Cashfree to process the payment for authorisation only. To use this API, the 'AUTHORIZE_ONLY' flag must be enabled for your account. Submit [Support Form](https://merchant.cashfree.com/auth/login) to enable this feature.
# Create Customer at Cashfree
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/customers/create
openapi/payments/v2025-01-01.yaml post /customers
Use this API to register a customer in Cashfree's system before initiating payments, subscriptions, tokenisation, or other customer-linked actions. It creates a reusable *customer profile* and returns a unique identifier for future transactions.
# Accept Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/accept-dispute-by-dispute-id
openapi/payments/v2025-01-01.yaml put /disputes/{dispute_id}/accept
Use this API to get accept the Dispute by specifying the Dispute ID.
# Contest Arbitration by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/contest-arbitration-by-dispute-id
openapi/payments/v2025-01-01.yaml put /disputes/{dispute_id}/contest-arbitration
Use this API to contest an ARBITRATION dispute without uploading documents.
NPCI (National Payments Corporation of India) does not allow document upload at the `ARBITRATION` stage. Cashfree forwards the evidence you submitted at the pre-arbitration stage to the card network or NPCI for a final decision.
To contest a dispute at an earlier stage by uploading documents, use the [Submit Evidence API](/docs/api-reference/payments/previous/v2025-01-01/disputes/submit-evidence-to-contest-the-dispute-by-dispute-id) instead.
Use this API only when `dispute_type` is `ARBITRATION` and `dispute_status` is one of the following:
* `ARBITRATION_CREATED`
* `ARBITRATION_DOCS_RECEIVED`
* `ARBITRATION_INSUFFICIENT_EVIDENCE`
# Dispute Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/dispute-webhooks
Learn in detail about dispute webhooks.
Dispute webhooks can be configured to receive automated notifications when disputes are created, updated and closed.
The webhook notification will be sent on all the URLs added and enabled under the dispute webhook. Merchants can add new URLs and enable or disable existing URLs for refund webhook at any point in time and it will be reflected instantaneously.
| Webhook | Description |
| :- | :- |
| DISPUTE\_CREATED | Dispute\_created webhook will be triggered when a new dispute is created. |
| DISPUTE\_UPDATED | Dispute\_updated webhook will be triggered when a dispute is updated, for example when a comment is added by the Cashfree team, when the dispute moves into further stages like Pre-arbitration, Arbitration, or when the status of the dispute changes. |
| DISPUTE\_CLOSED | This webhook will be triggered when a dispute is closed. |
Click [here](/docs/payments/online/webhooks/overview) to know how to configure webhooks.
## Dispute created
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": ""DISPUTE_CREATED"",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:50:04+05:30",
"type": "DISPUTE_CREATED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475258",
"dispute_type": "DISPUTE",
"reason_code": "1402",
"reason_description": "Duplicate Processing",
"dispute_amount": 3,
"created_at": "2023-06-15T21:49:48+05:30",
"updated_at": "2023-06-15T21:49:48+05:30",
"respond_by": "2023-06-18T23:59:59+05:30",
"dispute_status": ""DISPUTE_CREATED"",
"cf_dispute_remarks": "Dispute is created, please take action",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392DR1kMTFYdIf8bI2awAcC3i9FTa",
"order_amount": 3,
"order_currency": "INR",
"cf_payment_id": 885473311,
"payment_amount": 3,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": ""2023-06-15T21:50:04+05:30",
"type": "DISPUTE_CREATED"
}
```
## Dispute updated
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "PRE_ARBITRATION",
"reason_code": "13.1",
"reason_description": "Merchandise / Services Not Received",
"dispute_amount": 40000,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:19:15+05:30",
"respond_by": "2023-06-19T23:59:59+05:30",
"dispute_status": "PRE_ARBITRATION_CREATED",
"cf_dispute_remarks": "Pre Arbitration request has been raised for this case.\nTarget Date :: 2023-06-18T00:00 -> 2023-06-19T23:59:59.",
"dispute_update": "TYPE_UPDATE",
"dispute_action_on": "MERCHANT"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 40000,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 40000,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:20:24+05:30",
"type": "DISPUTE_UPDATED"
}
```
## Dispute closed
**Sample Payload**
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant",
"dispute_amount_currency": "INR"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"dispute": {
"dispute_id": "433475257",
"dispute_type": "CHARGEBACK",
"reason_code": "4855",
"reason_description": "Goods or Services Not Provided",
"dispute_amount": 4500,
"created_at": "2023-06-15T21:16:03+05:30",
"updated_at": "2023-06-15T21:16:51+05:30",
"respond_by": "2023-06-18T00:00:00+05:30",
"resolved_at": "2023-06-15T21:16:51.682836678+05:30",
"dispute_status": "CHARGEBACK_MERCHANT_WON",
"cf_dispute_remarks": "Chargeback won by merchant"
},
"order_details": {
"order_id": "order_1944392D4jHtCeVPPdTXkaUwg5cfnujQe",
"order_amount": 4500,
"order_currency": "INR",
"cf_payment_id": 885457437,
"payment_amount": 4500,
"payment_currency": "INR"
},
"customer_details": {
"customer_name": "Dileep Kumar s",
"customer_phone": "8000000000",
"customer_email": "dileep@gmail.com"
}
},
"event_time": "2023-06-15T21:17:14+05:30",
"type": "DISPUTE_CLOSED"
}
```
## Payload field description
| Field | Description | Example | Type |
| - | - | - | - |
| dispute\_id | Cashfree’s unique ID to identify a dispute. | 433475257 | Long |
| dispute\_type | Type of dispute created. Possible values: - DISPUTE - RETRIEVAL - CHARGEBACK - PRE\_ARBITRATION - ARBITRATION | Chargeback | String |
| reason\_code | Condition for which the customer is filing the case. Click [here]() to know more about dispute reason codes. | 13.6 | String |
| reason\_description | Description of the reason code. Codes for Chargeback cases are specified by Card networks/NPCI. | Credit not processed | String |
| dispute\_amount | The amount for which the dispute has been created. | 4500 | BigDecimal |
| created\_at | Time on which the dispute was registered on Cashfree’s system. | 2023-06-15T21:16:03+05:30 | LocalDateTime |
| updated\_at | Time on which the dispute was updated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| respond\_by | Time by which the merchant is expected to respond to the dispute. | 2023-06-18T00:00:00+05:30 | LocalDateTime |
| dispute\_status | Status of Dispute. All possible values are listed in the table below. | CHARGEBACK\_CREATED | String |
| cf\_dispute\_remarks | Any remarks specified by Cashfree on the dispute. | Please submit documents. | String |
| dispute\_update | Specifies what has been updated on the dispute. Possible Values: - STATUS\_UPDATE - TYPE\_UPDATE - COMMENT\_UPDATE | TYPE\_UPDATE | String |
| dispute\_action\_on | Specifies whether the action is on Cashfree or Merchant at a time. Possible Values: - MERCHANT - CASHFREE | MERCHANT | String |
| resolved\_at | Time on which the dispute was resolved/closed. | 2023-06-15T21:16:51.682836678+05:30 | LocalDateTime |
| event\_time | Time at which dispute webhook was initiated. | 2023-06-15T21:16:51+05:30 | LocalDateTime |
| type | Type of webhook. Possible Values: - DISPUTE\_CREATED - DISPUTE\_UPDATED - DISPUTE\_CLOSED | DISPUTE\_CREATED | String |
| List of Dispute Status |
| :- |
| DISPUTE\_CREATED |
| DISPUTE\_DOCS\_RECEIVED |
| DISPUTE\_UNDER\_REVIEW |
| DISPUTE\_MERCHANT\_WON |
| DISPUTE\_MERCHANT\_LOST |
| DISPUTE\_MERCHANT\_ACCEPTED |
| DISPUTE\_INSUFFICIENT\_EVIDENCE |
| RETRIEVAL\_CREATED |
| RETRIEVAL\_DOCS\_RECEIVED |
| RETRIEVAL\_UNDER\_REVIEW |
| RETRIEVAL\_MERCHANT\_WON |
| RETRIEVAL\_MERCHANT\_LOST |
| RETRIEVAL\_MERCHANT\_ACCEPTED |
| RETRIEVAL\_INSUFFICIENT\_EVIDENCE |
| CHARGEBACK\_CREATED |
| CHARGEBACK\_DOCS\_RECEIVED |
| CHARGEBACK\_UNDER\_REVIEW |
| CHARGEBACK\_MERCHANT\_WON |
| CHARGEBACK\_MERCHANT\_LOST |
| CHARGEBACK\_MERCHANT\_ACCEPTED |
| CHARGEBACK\_INSUFFICIENT\_EVIDENCE |
| PRE\_ARBITRATION\_CREATED |
| PRE\_ARBITRATION\_DOCS\_RECEIVED |
| PRE\_ARBITRATION\_UNDER\_REVIEW |
| PRE\_ARBITRATION\_MERCHANT\_WON |
| PRE\_ARBITRATION\_MERCHANT\_LOST |
| PRE\_ARBITRATION\_MERCHANT\_ACCEPTED |
| PRE\_ARBITRATION\_INSUFFICIENT\_EVIDENCE |
| ARBITRATION\_CREATED |
| ARBITRATION\_DOCS\_RECEIVED |
| ARBITRATION\_CONTEST\_REQUESTED |
| ARBITRATION\_UNDER\_REVIEW |
| ARBITRATION\_MERCHANT\_WON |
| ARBITRATION\_MERCHANT\_LOST |
| ARBITRATION\_MERCHANT\_ACCEPTED |
| ARBITRATION\_INSUFFICIENT\_EVIDENCE |
## Compute signature and verify
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload. Timestamp is present in the header x-webhook-timestamp
````bash theme={"dark"}
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));```
````
## Sample code
### Verify Signature using SDK
```node Node (express) theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```go Go theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute signature and verify manually
```node Node (express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Get Disputes by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/get-disputes-by-dispute-id
openapi/payments/v2025-01-01.yaml get /disputes/{dispute_id}
Use this API to get Dispute details by specifying the Dispute ID.
# Get Disputes by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/get-disputes-by-order-id
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/disputes
Use this API to get all Dispute details by specifying the Order ID.
# Get Disputes by Payment ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/get-disputes-by-payment-id
openapi/payments/v2025-01-01.yaml get /payments/{cf_payment_id}/disputes
Use this API to get all Dispute details by specifying the Payment ID.
# Submit Evidence to contest the Dispute by Dispute ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/disputes/submit-evidence-to-contest-the-dispute-by-dispute-id
openapi/payments/v2025-01-01.yaml post /disputes/{dispute_id}/documents
Use this API to submit evidence to contest a dispute by specifying the dispute ID. This API does not apply to ARBITRATION disputes. Use the [Contest Arbitration API](/docs/api-reference/payments/previous/v2025-01-01/disputes/contest-arbitration-by-dispute-id) instead.
As per NPCI (National Payments Corporation of India) guidelines, document upload is not allowed at the ARBITRATION stage. If the dispute has reached the ARBITRATION stage, use the [Contest Arbitration API](/docs/api-reference/payments/previous/v2025-01-01/disputes/contest-arbitration-by-dispute-id) instead. All evidence submitted during the pre-arbitration stage is automatically carried forward for further processing.
# Get Eligible Cardless EMI Payment Methods for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/eligibility/get-eligible-cardless-emi-payment-methods-for-a-customer-on-an-order
openapi/payments/v2025-01-01.yaml post /eligibility/cardlessemi
Use this API to get eligible Cardless EMI Payment Methods available for a customer on an order basis their phone number.
# Get Eligible Offers for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/eligibility/get-eligible-offers-for-an-order
openapi/payments/v2025-01-01.yaml post /eligibility/offers
Use this API to get eligible offers for an order_id or order amount.
# Get Eligible Paylater for a customer on an order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/eligibility/get-eligible-paylater-for-a-customer-on-an-order
openapi/payments/v2025-01-01.yaml post /eligibility/paylater
Use this API to get eligible Paylater Payment Methods for a customer on an order.
# Get eligible Payment Methods
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/eligibility/get-eligible-payment-methods
openapi/payments/v2025-01-01.yaml post /eligibility/payment_methods
Use this API to get eligible Payment Methods.
Run in Postman: You can also try this API in our Postman Collection.
# Get Import Settlement Details for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-import-settlement-details
openapi/cb-imports/merchant-spec.json get /import/orders/{order_id}/settlements
This API is used to get ICA settlement details using PG Order ID.
# Get Import Settlement Recon Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-import-settlement-recon-details
openapi/cb-imports/merchant-spec.json post /import/settlements/recon
This API is used to fetch all events happened for provided Settlement IDs.
# Get Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-payment-verification-details
get /import/transactions/{cf_payment_id}
Use this API to get the status of the payment verification.
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/import-webhooks
This product helps Merchants/Payment Aggregators/Market Places who are based outside India to collect payments from customers based out of India
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
Click [here](/docs/payments/online/webhooks/configure) to know how to configure webhooks.
## Payment Verification details webhook version (2025-01-01)
The payment verification details update webhook notifies you about the payment details verification, and it give you comprehensive information about verification details update.
A notification is sent to your backend from cashfree when there is any new update for payment verification. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the payment verification update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"order_id": "e145c994-5899-4466-804d-b90c625b2c1b",
"cf_payment_id": 5114910634577,
"payment_status": "SUCCESS",
"payment_verification_status": "ACTION_REQUIRED",
"payment_verification_expiry": "2024-07-12T15:19:42+05:30",
"remarks": null,
"required_details": [
{
"doc_name": "goods_description",
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "invoice_number",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_name",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "importer_address",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "country_of_origin",
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "invoice_file",
"doc_type": "DOCUMENT",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "ecommerce_order_serial_number", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "hs_code", //Required for Physical Goods and Digital Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "shipment_date", //Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "ACTION_REQUIRED",
"remarks": null
},
{
"doc_name": "port_of_loading",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
},
{
"doc_name": "awb_number",//Required for Physical Goods
"doc_type": "VALUE",
"doc_status": "IN_REVIEW",
"remarks": null
}
]
},
"event_time": "2024-07-12T13:39:42+05:30",
"type": "PAYMENT_VERIFICATION_UPDATE"
}
```
## ICA Settlement details webhook version 1 (2022-09-01)
The ICA Settlement Details Update webhook notifies you about the ica settlement.
A notification is sent to your backend from cashfree when there is any new update for ica settlement. These notification are useful in cases when the internet connection is unstable or slow while the payment is getting processed. This will allow you to reconcile all the ica settlement update at your end. Notifications will be sent to **notifyUrl** which is a part of the request parameter specified while creating an order request.
### Sample payload
```json Json theme={"dark"}
{
"data": {
"adjustment_amount_inr": -347641.22,
"collection_amount_inr": 604854.0,
"initiated_on": null,
"payment_from": "2024-09-26T15:43:55",
"payment_till": "2024-09-26T16:43:13",
"service_charge_inr": null,
"service_tax_inr": 2068.59,
"settled_on": null,
"settlement_amount_inr": 243651.95,
"settlement_charges_inr": 0.0,
"settlement_foreign_currency_details": {
"settlement_amount_fcy": null,
"settlement_currency": "USD",
"settlement_forex_rate": null
},
"cf_ica_settlement_id": 12,
"settlement_tax_inr": 0.0,
"settlement_utr": null,
"status": "NOT_INITIATED"
},
"event_time": "2024-10-03T13:27:36+05:30",
"type": "ICA_SETTLEMENT_UPDATE"
}
```
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey));
```
## Sample code
### Verify Signature using SDK
```node Node(express) theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
```go Go theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature'
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```c C# theme={"dark"}
using cashfree_pg.Client;
using cashfree_pg.Model;
[Route("api/[controller]")]
[ApiController]
public class YourController : ControllerBase
{
[HttpPost]
public async Task Post()
{
// Read the raw body of the POST request
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string requestBody = await reader.ReadToEndAsync();
var headers = Request.Headers;
var signature = headers["x-webhook-signature"];
var timestamp = headers["x-webhook-timestamp"];
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
var cashfree = new Cashfree();
try {
var response = cashfree.PGVerifyWebhookSignature(signature, requestBody, timestamp);
} catch(Exception e) {
// Error if signature mis matches
}
}
}
}
```
### Compute signature and verify manually
```node Node(express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Mark Sandbox Settlement Processed
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/mark-sandbox-settlement-processed
put /import/settlements/emulate
This API is used to mark settlement as processed in sandbox environment.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/overview
This product helps Merchants/Payment Aggregators/Market Places who are based outside India to collect payments from customers based out of India
**Getting Started**
Follow the steps mentioned below to get started with Collect from India APIs
* Fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) for onboarding assistance
* If you are a Merchant, generate your keys using this method [Link](/docs/api-reference/authentication#generate-api-keys)
* Register your webhook URL for updates and subscribe to the required events. For more information, refer to the [Webhook documentation](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/import-webhooks).
Once these setup is completed, we can use the below mentioned collection of APIs to create import transactions
**Collect from India - List of APIs**
| API Name | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/previous/v2025-01-01/orders/create) | This API will create a order to collect payment |
| [Order Pay](/docs/api-reference/payments/previous/v2025-01-01/payments/pay) | This API is used to pay the created payment |
| [Get Payment by ID](/docs/api-reference/payments/previous/v2025-01-01/payments/get) | This API is used to view payment details of an order for a payment ID |
| [Upload Payment Verification Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/upload-payment-verification-details) | This API is used to upload the required payment verification details |
| [Get Payment Verification Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-payment-verification-details) | This API is used to Get the verification status of the payment |
| [Get Import Settlement Details for an Order](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-import-settlement-details) | This API is used to get ICA settlement details using PG Order ID |
| [Get Import Settlement Recon Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/get-import-settlement-recon-details) | This API is used to fetch all events happened for provided Settlement IDs |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/sandbox-simulation
Learn how to simulate transaction verification and settlement processes in the sandbox environment for payments from India-based customers to overseas merchants
## Transaction verification simulation
In the sandbox environment, you can simulate transaction verification using predefined test values that are automatically approved. For file-type content, the system approves PDF files while rejecting other file formats.
You can submit verification details either through the [Upload Payment Verification Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/upload-payment-verification-details) or the dashboard.
### Test values for transaction verification
| Field Name | Value |
| - | - |
| importer\_name | John |
| importer\_address | 321 Elm Street, Suite 3, Los Angeles, CA 90401, USA |
| goods\_description | This is a test product for test purpose |
| country\_of\_origin | USA |
| ecommerce\_order\_serial\_number | 123123 |
| invoice\_number | 234234 |
| hs\_code | 3456 |
| shipment\_date | 01/01/2027 |
| port\_of\_loading | Houston |
| importer\_address\_postal\_code | 560034 |
## Settlement simulation
The sandbox environment provides APIs to simulate the settlement process. This includes triggering settlements and updating their status.
### Trigger settlement
Use the [Trigger Settlement API](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/trigger-sandbox-settlement) to initiate a settlement. This is an asynchronous process, with settlement entries typically created within one second.
### Mark settlement as processed
To update a settlement's status to "Processed", use the [Mark Settlement as Processed](/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/mark-sandbox-settlement-processed).
The settlement forex rate shown is notional and may differ from actual foreign exchange rates.
#### Simulating skipped settlements
A settlement will be skipped if the settlement amount is between 0 and 1 INR, or if it is negative, the amount will be adjusted in the next settlement.
Example of how to simulate a skipped settlement:
1. Create a transaction
2. Refund the transaction
3. Trigger settlement using the API
The settlement will be skipped since the total collection amount will be less than 0.
# Trigger Sandbox Settlement
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/trigger-sandbox-settlement
post /import/settlements/emulate
This API is used to trigger settlement in sandbox environment.
# Upload Payment Verification Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/collect-from-india/upload-payment-verification-details
openapi/cb-imports/v2025-01-01.yaml post /import/transactions/{cf_payment_id}
This API is used to upload all the required payment details for the verification
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/endpoints
This document provides you with the Global Collection end points.
## Global collections gateway end points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/](https://sandbox.cashfree.com/) |
| Production | [https://api.cashfree.com/](https://api.cashfree.com/) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/overview
Generate API credentials for Cashfree Global Collections (v2025-01-01) as a partner or merchant, with test and production key setup steps.
To start using Global Collection APIs, generate your API credentials by following these steps:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Go to **Developers**.
3. Click **API Keys** under the respective product card.
4. Select **Generate API Keys** and click **Download**.
In the test environment, keys are auto-generated. In production, click **Generate API Keys** and complete two-factor authentication.
View keys by clicking the icon and selecting **View API Key**.
***
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
**Global Collections List of APIs**
| API Name | Description |
| :- | :- |
| [Get Token](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/auth-get-token) | This API generates a new token. |
| [Verify Token](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/auth-verify-token) | Verify the authentication token generated. The response will be ‘Token is not valid’ if the token does not exist, invalid or has been expired. |
| [Get Collection Accounts](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-collection-accounts) | This API fetches all the virtual accounts that are linked with this account. |
| [Get Transactions](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-transactions) | Use this API to get all the transaction details within a time interval. |
| [Add Transaction Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/add-transaction-details) | Use this API to add transaction details to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount. |
| [Simulate Transaction](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/simulate-transaction) | Use this API to simulate funding to any of the virtual accounts of your merchants. |
# Add Transaction Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/add-transaction-details
post /gc/transactions/{referenceId}/invoice-details
Use this API to input invoice details for a specific transaction. You have the flexibility to upload multiple invoices until the cumulative total of all invoice amounts matches the transaction amount.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/auth-get-token
post /gc/authorize
Use this API to authenticate with the Cashfree system and obtain the authorization bearer token.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/auth-overview
Global Collection APIs
* [Get Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-get-token) - Use the Get Token API to authenticate with the Cashfree system and obtain the authorization bearer token, call the authorize API.
* [Verify Token](/docs/api-reference/payments/previous/v2023-08-01/international-payments/global-collections/partner/auth-verify-token) - Verify the authentication token generated. The response will be ‘Token is not valid’ if the token does not exist, invalid or has been expired.
# Verify Auth Token
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/auth-verify-token
get /gc/token/verify
Verify the authentication token generated by the user.
# Get Collection Accounts
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-collection-accounts
get /gc/virtual-accounts
This API fetches all the virtual accounts that is linked with the given merchant ID.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Get Transactions
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-transactions
get /gc/transactions
Use this API to get all the transaction details within a time interval.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/overview
Global Collection APIs for partners
* [Get All Transactions Details](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-transactions) - Use this to fetch all the transactions for a particular merchant.
* [Emulate Funding](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/simulate-transaction) - Use this to emulate a transaction for a specific merchant.
* [Get All Collection Accounts for Partner Merchants](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/get-collection-accounts) - Use this to get all VAs for a specific merchant.
* [Add Invoice Details for Partner Merchants](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/add-transaction-details) - Use this API to input invoice details for a specific transaction for a specific merchant.
* [Merchant Webhook Configs](/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/webhooks) - Use this document to understand the webhooks payload events and verification.
# Simulate Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/simulate-transaction
post /gc/transactions/emulate
Use this API to simulate a funding in test environment.
Based on who you are, consider the below values in the API requests
| Cashfree Merchant | Cashfree Partner |
| :- | :- |
| x-client-id | x-partner-api-key |
| x-client-secret | x-partner-merchantid |
# Webhook - Partner
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/partner/webhooks
This chapter explains the Global Collections Webhooks.
### Guide to subscribe webhook events
1. Visit [https://partner.cashfree.com](https://partner.cashfree.com) login with your partner credentials
2. On the landing page click on developers section and select webhook, you will be redirected to a page to add webhook URL and subscribe events or once logged in you can use this URL [Webhook Page](https://partner.cashfree.com/partner-ui/dashboard/developers/webhook)
3. Add your webhook URL and subscribe events Global Collect Transaction, Global Collect Settlement & Global Collect Virtual Account
4. To validate the webhook signature follow [Adding webhook and signature verification guide](/docs/api-reference/platforms/latest/merchant-onboarding/webhooks#verify-signature)
### Screenshots:
Landing page to add the webhook URL and subscribe the events
We can add multiple webhook URLs for the different type of events. For testing, Switch to test and follow the same step in sandbox environment.
## Transaction status
Active Event needs to be subscribed: **Global Collect Transaction**
```json Json theme={"dark"}
{
"amount": "4.50",
"currency": "GBP",
"cmsProfileId": 123,
"event": "INTERNATIONAL_PAYMENT_COLLECTED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2022-12-29 13:42:54",
"referenceId": 63,
"remarks": "",
"remitterAccount": "1223456789",
"remitterAddress": "Dummy Address",
"remitterBic": "TRWIBEB1XXX",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"status": "COMPLETED",
"utr": "5347f52a-9851-4fe9-8618-32eb085590ce",
"updatedStatusTime": "2022-12-29 13:50:35",
"vAccountId": "97836",
"vAccountNumber": "GB38TCCL12345687997836"
}
```
### Possible events and corresponding transaction status mapping
| Event Name | Payment Status | Description |
| :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_COLLECTED | COMPLETED | Received payment |
| INTERNATIONAL\_PAYMENT\_BLOCKED | BLOCKED | The transaction has been blocked due to the specified reason in the designated field. |
| INTERNATIONAL\_PAYMENT\_AWAITING\_DETAILS | COMPLETED | Waiting for the details of the transaction |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of supported currencies [here](/docs/payments/global-collections/collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| reason | Reason regarding the transaction being blocked. | Transaction value below the allowed limit |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED, AWAITING\_DETAILS |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was done. | GB38TCCL12345687997836 |
| merchant | Object contains merchant\_id used while creating merchant | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
## Reversal status
```Text JSON theme={"dark"}
{
"amount": "1000000.00",
"cmsProfileId": 123,
"currency": "USD",
"event": "INTERNATIONAL_PAYMENT_REVERSAL_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentTime": "2024-02-28 16:17:48",
"referenceId": 63,
"remitterAccount": "9919391193",
"remitterAddress": "Dummy Address",
"remarks": "",
"remitterBic": "",
"remitterCountry": "IN",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"reversal": {
"reason": "Transaction value higher than the compliant limit",
"status": "INITIATED"
},
"signature": "F8raBNGcGjMUvbh2t/7t/9C4zU0Snqa/iXf9XzvOq0Y=",
"status": "REVERSAL_INITIATED",
"updatedStatusTime": "2024-02-28 16:17:54",
"utr": "IF-20240228-KT9ZFA",
"vAccountId": "GB75T",
"vAccountNumber": "GB75TCCL12345654108280"
}
```
### Possible events and corresponding transaction status mapping
| Event Name | Reversal Status | Transaction Status | Description |
| :- | :- | :- | :- |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_INITIATED | INITIATED | REVERSAL\_INITIATED | Reversal for the transaction is initiated. |
| INTERNATIONAL\_PAYMENT\_REVERSAL\_DONE | DONE | REVERSAL\_DONE | Reversal for the transaction is completed. The funds have been successfully returned to the sender. |
### Payload field description
***
## Settlement status
Active Event needs to be subscribed: **Global Collect Settlement**
```json theme={"dark"}
{
"amount": "3500.00",
"cmsProfileId": 23853384,
"currency": "USD",
"event": "INR_SETTLEMENT_INITIATED",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"paymentRail": "ACH",
"paymentTime": "2024-02-06 11:11:42",
"referenceId": 312620,
"remarks": "EMULATE GC INCOMING FUNDS",
"remitterAccount": "7337377781",
"remitterAddress": "Dummy Address",
"remitterBic": "TLG0123",
"remitterCountry": "GB",
"remitterName": "Dummy Sender",
"remitterRoutingCode": "TLG0123",
"settlement": {
"expectedSettlementDate": "2024-02-06",
"fxRate": 85.12,
"id": "f16581f5-344c-40e8-be4b-e63cb5714a88",
"inrAmount": 16219.65,
"netPartnerCommission": 2106.72,
"settlementCharge": 4213.44,
"settlementChargeTax": 758.42,
"status": "INITIATED"
},
"status": "READY_FOR_SETTLEMENT",
"updatedStatusTime": "2024-02-05 18:39:42",
"utr": "f185d0f5-abf5-492b-9149-d45eacfeaca7",
"vAccountId": "03314",
"vAccountNumber": "0331496070"
}
```
The firaFileDownloadUrl field will only be included in the webhook response
after it has been updated.
### Possible events and corresponding settlement status mapping
| Event Name | Settlement Status | Description |
| :- | :- | :- |
| INR\_SETTLEMENT\_INITIATED | INITIATED | The settlement is initiated. |
| INR\_SETTLEMENT\_APPROVED | SETTLED | The settlement is settled. |
| INR\_SETTLEMENT\_REJECTED | REJECTED | The settlement is rejected. |
| FIRA\_FILE\_RECEIVED | SETTLED | FIRA file received for the settlement. |
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| amount | The foreign currency amount sent | 4.50 |
| currency | Three character ISO code. View list of supported currencies [here](doc:global-collections-collection-accounts#supported-currencies). | GBP |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook event | INTERNATIONAL\_AMOUNT\_COLLECTED |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| paymentTime | The time at which the payment was initiated. | 2022-12-29 13:42:54 |
| referenceId | Cashfree transaction identifier | 63 |
| remarks | Remarks passed by the sender. | Sample Remark |
| remitterAccount | The bank account number of the person who sends the money. | 1223456789 |
| remitterAddress | The address of the person who sends the money. | Dummy Address |
| remitterBic | Bank identifier code for the remitter. | TRWIBEB1XXX |
| remitterCountry | The country from which the money is sent. | GB |
| remitterName | The name of the remitter who is sending the money. | John Doe |
| remitterRoutingCode | The routing code of the remitter's bank. | TLG0123 |
| status | Status of FCY (foreign currency leg) of transaction. | COMPLETED, FAILED |
| updatedStatusTime | The time of the last status update. | 2022-12-29 13:50:35 |
| vAccountId | Identifier of the virtual account. | 97836 |
| vAccountNumber | Account number to which the payment was made. | GB38TCCL12345687997836 |
| paymentRail | Payment Network used to make the payment | ACH,EFT,FPS,SEPA,SWIFT,FEDWIRE |
| settlement.id | Unique reference ID for the settlement since the payment can have multiple settlements. | b84a7c4c-2ce0-48ca-9b86-2a2c9ad5a35d |
| settlement.fxRate | The foreign exchange rate used for currency conversion between the transaction currency and settlement currency | 85.12 |
| settlement.netPartnerCommission | The final commission amount payable to the partner after deducting all applicable fees and charge | 2106.72 |
| settlement.settlementCharge | Service fees charged for facilitating the settlement | 4213.44 |
| settlement.settlementChargeTax | Applicable tax amount levied on the settlement service charges | 758.42 |
| settlement.inrAmount | Settlement amount in rupees (INR). | 16219.65 |
| settlement.firafileDownloadUrl | Download link to FIRA file | fileDownloadUrl |
| settlement.status | Current status of the settlement. | INITIATED |
## Virtual account details
Active Event needs to be subscribed: **Global Collect Virtual Account**
```json Json theme={"dark"}
{
"cmsProfileId": 260559,
"event": "VIRTUAL_ACCOUNT_DETAILS",
"merchant": {
"merchant_id": "CF_7644f46b-ad82-472c-8d97-609d1a429eac"
},
"vAccounts": [
{
"accountName": "John Doe",
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "AUD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
},
{
"accountName": "John Doe",
"accountNumber": "GB11TCCL12345638242754",
"accountType": "iban",
"paymentType": "priority",
"bankName": "The Currency Cloud Limited",
"bankAddress": "12 Steward Street, The Steward Building, London, E1 6FQ, GB",
"bankCountry": "GB",
"currency": "BHD",
"routingCode": "TCCLGB3L",
"routingCodeType": "bic_swift",
"addedOn": "2023-03-28 14:43:30",
"vaccountId": "GB11T"
}
]
}
```
### Possible events and corresponding virtual account mapping
| Event Name | Virtual Account Status | Description |
| - | - | - |
| VIRTUAL\_ACCOUNTS\_ACTIVATED | ACTIVE | Virtual account is activated |
| VIRTUAL\_ACCOUNTS\_CREATED | INACTIVE / ACTIVE | If all the business required details are passed in the first go, VAs are created in ACTIVE state or INACTIVE |
| VIRTUAL\_ACCOUNT\_DETAILS | ACTIVE | Will contain all the details of the VA |
#### Description
Sometimes there is mere might be a slight delay in creating some virtual accounts during onboarding and as a result, some of them might be missing in the Get All Collection Accounts API. Hence, when these missing account details are added, this webhook is triggered with all virtual account details (including the ones that were present before). This webhook contains information for all virtual account associated with a merchant along with cmsProfileId , signature and event.
### Payload field description
| Field | Description | Example |
| :- | :- | :- |
| cmsProfileId | Merchant identifier | 123 |
| event | Webhook Event | VIRTUAL\_ACCOUNT\_DETAILS |
| merchant | Object contains the merchant\_id to map the merchant created. | CF\_7644f46b-ad82-472c-8d97-609d1a429eac |
| vAccounts.accountName | Account Name | John Doe |
| vAccounts.accountNumber | Account Number | GB11TCCL12345638242754 |
| vAccounts.accountType | Account Type | iban |
| vAccounts.paymentType | Type of Payment | priority |
| vAccounts.bankName | Bank Name | The Currency Cloud Limited |
| vAccounts.bankAddress | Bank Address | 12 Steward Street, The Steward Building, London, E1 6FQ, GB |
| vAccounts.bankCountry | Bank Country | GB |
| vAccounts.currency | Currency Code | BHD |
| vAccounts.routingCode | Routing Code | TCCLGB3L |
| vAccounts.routingCodeType | Routing Code Type | bic\_swift |
| vAccounts.addedOn | The time when this virtual account was created | 2023-03-28 14:43:30 |
| vAccounts.vaccountId | Virtual Account Id | GB11T |
# Purpose Codes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/global-collections/purpose-codes
This page contains the purpose codes for Global Collect
| Purpose Code | Description |
| - | - |
| P0103 | Advance receipts against export contracts, which will be covered later by GR/PP/SOFTEX/ SDF - other than Nepal and Bhutan |
| P1004 | Legal services |
| P1005 | Accounting, auditing, bookkeeping services |
| P1006 | Business and management consultancy and public relations |
| P1007 | Advertising, trade fair service |
| P1008 | Research & Development services |
| P1009 | Architectural services |
| P0802 | Software consultancy / implementation (other than those covered in SOFTEX form) |
| P0807 | For Export of Software covered under softex (advance payment) |
| P1020 | Wholesale and retailing trade services |
| P1002 | Trade related services - commission on exports / imports |
| P1104 | Entertainment services |
| P1099 | Other services not included elsewhere, for export of services |
| P1015 | Tax consulting services |
| P1016 | Market research and public opinion polling service |
| P1017 | Publishing and printing services |
| P1019 | Commission agent services |
| P1107 | Educational services |
| P1109 | Other Personal, Cultural & Recreational services |
| P1701 | Receipts on account of processing of goods |
| P0301 | Purchases towards travel (Includes purchases of foreign TCs, currency notes etc over the counter, by hotels, Emporiums, institutions etc. as well as amount received by TT/SWIFT transfers or debit to Non-Resident account). |
| P0302 | Business travel |
| P0304 | Travel for medical treatment including TC purchased by hospitals |
| P0305 | Travel for education including TCs purchased by educational institutions |
| P0306 | Other travel receipts |
| P0801 | Hardware consultancy/implementation |
| P0803 | Data base, data processing charges |
| P0804 | Repair and maintenance of computer and software |
| P0805 | News agency services |
| P0806 | Other information services- Subscription to newspapers, periodicals, etc. |
| P0808 | Telecommunication services including electronic mail services and voice mail services |
| P1013 | Environmental Services |
| P1014 | Engineering Services |
| P1101 | Audio-visual & related service:Motion picture & video tape production, distribution & projection service |
| P1103 | Radio & TV production,distribution & transmission service |
| P1105 | Museums, library and archival services |
| P1106 | Recreation and sporting activity services |
| P1108 | Health Service provided by Indian hospitals,doctors,nurses,paramedical remotely/on-site) |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/international-payments/overview
Learn about Cashfree APIs suitable for International Payments
You can use the Cashfree API in test mode, which doesn't affect your live data or interact with the banking networks. The API key you use to authenticate the request determines whether the request is live mode or test mode.
For overseas businesses to collect payments from Indian customers
For Indian businesses to collect payments from customers worldwide
# Create Offer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/offers/create
openapi/payments/v2025-01-01.yaml post /offers
Use this API to create offers with Cashfree from your backend.
Run in Postman: You can also try this API in our Postman Collection.
# Get Offer by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/offers/get
openapi/payments/v2025-01-01.yaml get /offers/{offer_id}
Use this API to get offer by offer_id.
Run in Postman: You can also try this API in our Postman Collection.
# Create Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/orders/create
openapi/payments/v2025-01-01.yaml post /orders
An order is an entity which has a amount and currency associated with it. It is something for which you want to collect payment for.
Use this API to create orders with Cashfree from your backend to get a `payment_sessions_id`.
You can use the `payment_sessions_id` to create a transaction for the order.
Run in Postman: You can also try this API in our Postman Collection.
# Get Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/orders/get
openapi/payments/v2025-01-01.yaml get /orders/{order_id}
Use this API to fetch the order that was created at Cashfree's using the `order_id`.
## When to use this API
- To check the status of your order
Run in Postman: You can also try this API in our Postman Collection.
This API allows you to retrieve order data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Get Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/orders/get-order-extended
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/extended
Use this API to fetch the order related data like address,cart,offers,customer details etc using the Cashfree's `order_id`.
## When to use this API
- To get the extended data associated with order.
Run in Postman: You can also try this API in our Postman Collection.
This API allows you to retrieve order data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Terminate Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/orders/terminate
openapi/payments/v2025-01-01.yaml patch /orders/{order_id}
Use this API to terminate the order that was created at Cashfree's using the `order_id`.
Run in Postman: You can also try this API in our Postman Collection.
# Update Order Extended
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/orders/update-order-extended
openapi/payments/v2025-01-01.yaml put /orders/{order_id}/extended
Use this api to update the order related data like shipment details,order delivery status etc.
## When to use this API
- To provide/update the shipment details or order delivery status.
- Once the order is PAID.
Run in Postman: You can also try this API in our Postman Collection.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/overview
Learn details about the 2025-01-01 version of our Payment APIs.
Use the latest version of our APIs [v2026-01-01](/docs/api-reference/payments/latest/overview) for any new integrations.
## Payment Gateway end points
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Latest version | v5, 2025-01-01 The previous versions were 2023-08-01, 2021-05-21, 2022-01-01, and 2022-09-01 |
## Authentication
All the APIs require authentication, except the /orders/sessions API, which does not require any authentication and can be safely done from the browser as well.
Click [here](/docs/api-reference/authentication) for detailed information on API Authentication for Merchants and Partners.
## Payment Gateway APIs
### Orders
| API | Description |
| :- | :- |
| [Create Order](/docs/api-reference/payments/previous/v2025-01-01/orders/create) | Use this API to create orders with Cashfree from your backend and get the payment link. |
| [Order Pay](/docs/api-reference/payments/previous/v2025-01-01/payments/pay) | Use this API when you have already created the orders and want Cashfree to process the payment. |
| [Preauthorization](/docs/api-reference/payments/previous/v2025-01-01/payments/authorize) | Use this API to capture or void a preauthorized payment. |
| [Get Order](/docs/api-reference/payments/previous/v2025-01-01/orders/get) | Use this API to view all details of an order. |
### Authentication
| API | Description |
| :- | :- |
| [Submit or Resend OTP](/docs/api-reference/payments/previous/v2025-01-01/payments/authenticate) | Use the submit or resend OTP API to send OTP to Cashfree. |
### Payments
| API | Description |
| :- | :- |
| [Get Payments for an Order](/docs/api-reference/payments/previous/v2025-01-01/payments/get-payments-for-order) | Use this API to view all payment details for an order. |
| [Get Payment by ID](/docs/api-reference/payments/previous/v2025-01-01/payments/get) | Use this API to view payment details of an order for a payment ID. |
### Settlements
| API | Description |
| :- | :- |
| [Get Settlements by Order ID](/docs/api-reference/payments/previous/v2025-01-01/settlements/get-settlements-for-order) | Use this API to view all the settlements of a particular order. |
| [Get All Settlements](/docs/api-reference/payments/previous/v2025-01-01/settlements/get-settlements) | Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range. |
### Payment links
| API | Description |
| :- | :- |
| [Create Payment Link](/docs/api-reference/payments/previous/v2025-01-01/payment-links/create) | Use this API to create a new payment link. The created payment link url will be available in the API response parameter link\_url. |
| [Fetch Payment Link Details](/docs/api-reference/payments/previous/v2025-01-01/payment-links/get) | Use this API to view all details and status of a payment link. |
| [Get Orders for a Payment Link](/docs/api-reference/payments/previous/v2025-01-01/payment-links/get-orders-for-link) | Use this API to view all order details for a payment link. |
| [Cancel Payment Link](/docs/api-reference/payments/previous/v2025-01-01/payment-links/cancel) | Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled. |
### Token vault
| API | Description |
| :- | :- |
| [Fetch All Saved Instruments](/docs/api-reference/payments/previous/v2025-01-01/token-vault/get-all) | Use this API to get all saved instruments for a customer ID. |
| [Fetch Single Saved Instrument](/docs/api-reference/payments/previous/v2025-01-01/token-vault/get) | Use this API to get specific saved instrument for a customer id and instrument ID. |
| [Delete Saved Instrument](/docs/api-reference/payments/previous/v2025-01-01/token-vault/delete) | Use this API to delete a saved instrument for a customer id and instrument ID. |
| [Fetch Cryptogram for Saved Instrument](/docs/api-reference/payments/previous/v2025-01-01/token-vault/generate-cryptogram) | Use this API to get the card network token, token expiry and cryptogram for a saved instrument using instrument ID. |
### Reconciliation
| API | Description |
| :- | :- |
| [Settlement Reconciliation](/docs/api-reference/payments/previous/v2025-01-01/settlements/settlement-reconciliation) | Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range. |
| [PG Reconciliation](/docs/api-reference/payments/previous/v2025-01-01/settlements/reconcile) | Use this API to get the payment gateway reconciliation details with date range. |
# Cancel Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payment-links/cancel
openapi/payments/v2025-01-01.yaml post /links/{link_id}/cancel
Use this API to cancel a payment link. No further payments can be done against a cancelled link. Only a link in ACTIVE status can be cancelled.
Run in Postman: You can also try this API in our Postman Collection.
# Create Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payment-links/create
openapi/payments/v2025-01-01.yaml post /links
Use this API to create a new payment link. The created payment link url will be available in the API response parameter link_url.
Run in Postman: You can also try this API in our Postman Collection.
SMS notifications are sent only in the production environment. In the sandbox environment, only email notifications are sent if enabled.
# Fetch Payment Link Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payment-links/get
openapi/payments/v2025-01-01.yaml get /links/{link_id}
Use this API to view all details and status of a payment link.
Run in Postman: You can also try this API in our Postman Collection.
# Get Orders for a Payment Link
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payment-links/get-orders-for-link
openapi/payments/v2025-01-01.yaml get /links/{link_id}/orders
Use this API to view all order details for a payment link.
# Payment Link Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payment-links/webhooks
Learn about webhooks triggered when payments made through Payment Links.
## Webhook Schema
Payment Link webhook will be triggered when your customer makes a complete or partial payment using the payment link you shared. You will also be notified via the same webhook when the payment link gets cancelled or expired.
```json theme={"dark"}
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Payment for order 10",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9000000000",
"customer_email": "john@gmail.com",
"customer_name": "John "
},
"link_meta": {
"notify_url": "https://ee08e626ecd88c61c85f5c69c0418cb5.m.pipedream.net"
},
"link_url": "https://payments-test.cashfree.com/links//U1mgll3c0e9g",
"link_expiry_time": "2021-11-28T21:46:20",
"link_notes": {
"note_key_1": "note_value_1"
},
"link_auto_reminders": true,
"link_notify": {
"send_sms": true,
"send_email": true
},
"order": {
"order_amount": "22.00",
"order_id": "CFPay_U1mgll3c0e9g_ehdcjjbtckf",
"order_expiry_time": "2021-08-18T07:34:50",
"order_hash": "Gb2gC7z0tILhGbZUIeds",
"transaction_id": 1021206,
"transaction_status": "SUCCESS"
}
},
"type": "PAYMENT_LINK_EVENT",
"version": 1,
"event_time": "2021-08-18T12:55:06+05:30"
}
```
***
## Payload
| Field | Description | Example |
| :- | :- | :- |
| `cf_link_id` | Unique Identifier (generated by Cashfree) for this Link. | 1543566 |
| `link_id` | Unique Identifier (provided by merchant) for the Link. Only for merchant reference. | payment\_1psw |
| `link_status` | Current status of the payment link. Possible values: PAID, PARTIALLY\_PAID, EXPIRED, CANCELLED. | PARTIALLY\_PAID |
| `link_currency` | Default is INR. International currencies are supported. | INR |
| `link_amount` | The amount which merchant wants to collect for the order. | 500.00 |
| `link_amount_paid` | The amount paid by the customer. | 250.00 |
| `link_partial_payments` | Indicates if partial payments are allowed or not. Default value is false. | true |
| `link_minimum_partial_amount` | The minimum amount which must be paid by customer as the first payment. | 200.00 |
| `link_purpose` | A brief description for which payment must be collected. This is shown to the customer. | Payment for order 10 |
| `link_created_at` | Time at which the link was created. | 2021-08-18T07:13:41 |
| `customer_details` | Customer object, it contains customer details. | |
| `customer_name` | Name of the customer | John |
| `customer_phone` | Phone number of the customer | 9000000000 |
| `customer_email` | Email ID of the customer | [john@gmail.com](mailto:john@gmail.com) |
| `notify_url` | Payment notification URL | [https://payment1notify.net](https://payment1notify.net) |
| `link_url` | Payment link URL | [https://website.com/payments](https://website.com/payments) |
| `link_expiry_time` | The date till which the link will be valid, and then it will be expired. Default is 30 days. | 2021-11-28T21:46:20 |
| `link_notes` | Link notes object where you can provide any key-value pairs for your internal reference. | |
| `note_key_1` | | note\_value\_1 |
| `link_auto_reminders` | Default is false. Reminders will be sent to customers based on defined settings. | true |
| `link_notify` | Link notify object, used to notify customers via SMS or an email. | |
| `send_sms` | Default is true. If true, Cashfree will send the link to customer via SMS. | true |
| `send_email` | Default is true. If true and `customer_email` is provided, Cashfree will send the link via Email. | true |
| `order` | Order object, contains the order details. Will be null for cancelled and expired link statuses. | |
| `order_amount` | Order amount that the customer must pay. | 700 |
| `order_id` | The order ID generated. | order\_10 |
| `order_expiry_time` | The date till which the order will be valid. Default is 30 days. | 2021-08-18T07:34:50 |
| `transaction_id` | Transaction ID | id45466ye |
| `transaction_status` | Status of the transaction. Possible values: SUCCESS. | SUCCESS |
| `type` | Type of the webhook. `PAYMENT_LINK_EVENT` | PAYMENT\_LINK\_EVENT |
| `version` | The version of webhook. Build parsing logic with respect to this version. | 1 |
| `event_time` | Time when this webhook was created. | 2021-08-18T12:55:06+05:30 |
***
## Signature generation
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree Payment Gateway secret key along with the payload.
```javascript theme={"dark"}
// The payload here refers to the raw request sent by
// Cashfree to your endpoint. No modifications need to be made to this payload.
{
"data": {
"cf_link_id": 1576977,
"link_id": "payment_ps11",
"link_status": "PARTIALLY_PAID",
"link_currency": "INR",
"link_amount": "200.12",
"link_amount_paid": "55.00",
"link_partial_payments": true,
"link_minimum_partial_amount": "11.00",
"link_purpose": "Hello my friend how are you",
"link_created_at": "2021-08-18T07:13:41",
"customer_details": {
"customer_phone": "9905736722",
"customer_email": "supal.dubey@cashfree.com",
"customer_name": "Supal "
},
"link_meta": { ... }
}
}
```
We send the webhook response in a form data format.
# Submit or Resend OTP
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/authenticate
openapi/payments/v2025-01-01.yaml post /orders/pay/authenticate/{cf_payment_id}
Use this API to submit or resend OTP if you use [Native OTP](https://www.cashfree.com/docs/payments/features/native-otp) for authentication of card payments.
Run in Postman: You can also try this API in our Postman Collection.
Refer to the sample responses below:
Submit OTP Success and Transaction Successful – 200 OK
```json theme={"dark"}
{
"action": "SUBMIT_OTP",
"authenticate_status": "SUCCESS",
"cf_payment_id": "3991872901",
"payment_message": "payment successful"
}
```
Submit OTP Success but Invalid OTP – 200 OK
```json theme={"dark"}
{
"action": "SUBMIT_OTP",
"authenticate_status": "FAILED",
"cf_payment_id": "5114916442998",
"payment_message": "otp is invalid"
}
```
Max OTP Submit Limit Exceeded – 400 Bad Request
```json theme={"dark"}
{
"message": "Exceeded retry attempts. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "invalid_request_error"
}
```
Transaction Already Completed – 400 Bad Request
```json theme={"dark"}
{
"message": "Transaction is already processed. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "invalid_request_error"
}
```
Invalid Request – 404 Not Found
```json theme={"dark"}
{
"message": "transaction not found. Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "payment_not_found",
"type": "invalid_request_error"
}
```
Submit OTP Success but Transaction Failed – 502 Bad Gateway
```json theme={"dark"}
{
"message": "transaction failed",
"code": "bank_processing_failure",
"type": "api_error"
}
```
Submit OTP Success but Transaction Pending – 502 Bad Gateway
```json theme={"dark"}
{
"message": "transaction incomplete",
"code": "bank_processing_failure",
"type": "api_error"
}
```
Resend OTP Success – 200 OK
```json theme={"dark"}
{
"action": "RESEND_OTP",
"authenticate_status": "SUCCESS",
"cf_payment_id": "5114916574918",
"payment_message": "otp sent successfully"
}
```
## Error codes
The following table lists the error codes you may encounter when submitting an OTP:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `action_missing` | The `action` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `cf_payment_id_missing` | The `cf_payment_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
# Preauthorisation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/authorize
openapi/payments/v2025-01-01.yaml post /orders/{order_id}/authorization
Use this API to capture or void a [pre-authorised](/docs/payments/features/pre-authorisation) payment.
Run in Postman: You can also try this API in our Postman Collection.
# Get Payment by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/get
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/payments/{cf_payment_id}
Use this API to view payment details of an order for a payment ID.
Run in Postman: You can also try this API in our Postman Collection.
## Error codes
The following table lists the error codes you may encounter when retrieving payment details for an order using a payment ID:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `order_id_invalid` | The `order_id` field contains a value in an invalid format. Provide a correctly formatted order ID and try again. Value received: `#INVALID` | `invalid_request_error` | 400 |
| `order_id_missing` | The `order_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `version_missing` | The `version` field is required but was not included in the request header. | `invalid_request_error` | 400 |
| `payment_id_invalid` | The `payment_id` field must be a numeric value. Value received: `INVALID` | `invalid_request_error` | 400 |
| `payment_get_failed` | The `payment_id` value is out of the supported integer range and cannot be processed. Value received: `100000000000000000000000000000000000000` | `invalid_request_error` | 400 |
| `payment_id_missing` | The `payment_id` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_not_found` | No transaction was found for the specified payment ID. Verify the payment ID and try again. | `invalid_request_error` | 404 |
| `order_not_found` | No order was found for the specified order reference ID. Verify the order ID and try again. | `invalid_request_error` | 404 |
This API allows you to retrieve payment data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
# Get Payments for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/get-payments-for-order
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/payments
Use this API to view all payment details for an order.
This API allows you to retrieve payment data for the current and previous financial years. To access data older than this period, log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login)
Run in Postman: You can also try this API in our Postman Collection.
# Order Pay
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/pay
openapi/payments/v2025-01-01.yaml post /orders/sessions
Initiate a payment for an order using the Order Pay API with support for multiple payment methods and NPCI-compliant device headers.
Run in Postman: You can also try this API in our Postman Collection.
**S2S enablement required**: To call the Seamless Payment Creation API, make sure the required S2S flag is enabled for your account. To enable it, submit a request through the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
* **S2S card flag**: To enable card payments, share your PCI DSS compliance certificate through the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
* **Main S2S flag for other payment modes**: To enable seamless payments for modes other than cards, submit a GST return showing an annual turnover of more than Rs. 1 crore. After the document is verified, Cashfree enables the seamless flow.
## Client environment headers
Cashfree requires information about the customer's device environment to enforce NPCI rules. You must include the following headers in your Order Pay API and [Get Eligible Payment Methods](/docs/api-reference/payments/latest/eligibility/get-eligible-payment-methods) request:
| Header | Accepted values | Requirement | Description |
| - | - | - | - |
| `x-client-device` | `mobile`, `desktop`, `tablet` | Required | Type of device used by customer |
| `x-client-os` | `android`, `ios`, `windows`, `macos`, `linux`, `others` | Required | Operating system of customer's device |
| `x-client-rendering-type` | `mweb`, `webview`, `native` | Required when `x-client-device` is mobile | Rendering method used for the checkout experience |
| `x-client-browser` | `safari`, `chrome`, `firefox`, `edge`, `others` | Required | Browser used by the customer |
`x-client-rendering-type` is required only when `x-client-device` is set to mobile. For desktop and tablet devices, this header is optional.
## Error codes
The following table lists the error codes, descriptions, and types you may encounter when initiating a payment:
| Code | Description | Type | Status |
| :- | :- | :- | :- |
| `channel_missing` | The `channel` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `phone_invalid` | The `phone` field must contain a valid 10-digit Indian phone number (for example, `9090407368`). Value received: `1234567890` | `invalid_request_error` | 400 |
| `phone_missing` | The `phone` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `provider_missing` | The `provider` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `version_missing` | The `version` field must be one of the following supported values: `2021-05-21`, `2022-01-01`, `2022-09-01`, `2023-08-01`, `2025-01-01`, or `2026-01-01`. | `invalid_request_error` | 400 |
| `card_cvv_invalid` | The `card_cvv` field must be at least 3 characters long. Value received: `12` | `invalid_request_error` | 400 |
| `card_cvv_missing` | The `card_cvv` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_invalid` | The `card` field is invalid. Provide payment details using one of the following: card details, `card_alias`, `instrument_id`, or `cryptogram`. | `invalid_request_error` | 400 |
| `bank_processing_failure` | The transaction could not be created at the banking partner. Retry the request or contact support if the issue persists. | `api_error` | 502 |
| `request_invalid` | Cards issued in India cannot be used for transactions where the order currency is non-INR. Value received: `AUD` | `invalid_request_error` | 400 |
| `orderpay_not_found` | The specified order is no longer active and cannot be used to initiate a payment. | `invalid_request_error` | 404 |
| `card_bank_name_missing` | The `card_bank_name` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_bank_name_invalid` | The `card_bank_name` field contains an unrecognised value. Accepted values are: `hdfc`, `icici`, `kotak`, `rbl`, `bob`, `axis`, `standard chartered`, `au`, `yes`, `indus`, `fed`, `hsbc`, `citi`, `sbi`, `amex`, `onecard`, or `idfc`. Value received: `INVALID$BANK` | `invalid_request_error` | 400 |
| `card_expiry_yy_missing` | The `card_expiry_yy` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_expiry_yy_invalid` | The `card_expiry_yy` field must be at least 2 characters long. Value received: `0` | `invalid_request_error` | 400 |
| `card_expiry_mm_missing` | The `card_expiry_mm` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_expiry_mm_invalid` | The `card_expiry_mm` field must be at least 2 characters long. Value received: `0` | `invalid_request_error` | 400 |
| `card_number_invalid` | The `card_number` field contains an invalid card number. Verify the card number and try again. Value received: `INVALID` | `invalid_request_error` | 400 |
| `card_number_missing` | The `card_number` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `card_not_found` | The card details could not be retrieved. Verify the card information and try again. | `invalid_request_error` | 404 |
| `emi_tenure_missing` | The `emi_tenure` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `order_amount_invalid` | The order amount exceeds the maximum allowed value. The amount must be less than `1,000,000`. | `invalid_request_error` | 400 |
| `netbanking_account_number_invalid` | The `netbanking_account_number` field must be at least 9 characters long. Value received: `test` | `invalid_request_error` | 400 |
| `netbanking_bank_code_invalid` | The `netbanking_bank_code` field contains an invalid value. Provide a supported bank code and try again. | `invalid_request_error` | 400 |
| `netbanking_ifsc_invalid` | The `netbanking_ifsc` field contains an invalid IFSC code. Verify the IFSC and try again. Value received: `INVALID` | `invalid_request_error` | 400 |
| `request_failed` | The selected payment mode is not configured for this account. Enable the payment mode or contact support. | `invalid_request_error` | 400 |
| `currency_invalid` | The `currency` field does not accept `INR` for this request. Use a supported non-INR currency. Value received: `INR` | `invalid_request_error` | 400 |
| `currency_missing` | The `currency` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `risk_data.customer_ip_invalid` | The `risk_data.customer_ip` field contains an invalid IP address. Provide a valid IPv4 or IPv6 address. Value received: `1.1.1` | `invalid_request_error` | 400 |
| `risk_data_ip_address_request_failed` | The IP address could not be resolved. Verify the IP address and try again. | `invalid_request_error` | 400 |
| `order_token_missing` | The `order_token` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_method_invalid` | The `payment_method` field contains an unrecognised value. Provide a valid payment method and try again. | `invalid_request_error` | 400 |
| `payment_method_missing` | The `payment_method` field is required but was not included in the request. | `invalid_request_error` | 400 |
| `payment_method_unsupported` | The specified payment method is not supported for this request. Use a supported payment method and try again. | `invalid_request_error` | 400 |
# Payment Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/payments/webhooks
Read about all asynchronous events initiated by Cashfree for this entity
Webhooks are server callbacks from Cashfree to your server. Cashfree sends webhooks for the following events for a `payment`:
* Payment success webhook
* Payment failed webhook
* Payment user dropped webhook
* Payment charges webhook
## Webhook signature
The merchant will receive the Webhook signature in the Webhook Header part. Below is a sample header that merchants can expect in the Webhook request. For best practices on securing your webhook endpoints, refer to the [Webhook Security Checklist](/docs/payments/online/webhooks/security-checklist).
| Header Name | Header Value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-idempotency-key | n9rn7079wqXcse3GEDEXCYle9ajXmU0SUQY8zrUNAlc= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
| Header Name | Header Value |
| - | :-: |
| content-length | 1002 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 0s9zgYXyUYrQaadF5oTYzpxzHmPBMmGDSjbAKZTleL4= |
| x-webhook-timestamp | 1746426425612 |
| x-webhook-version | 2023-08-01 |
Ensure that the webhook payload is received in raw text format. Converting the webhook into a JSON object can lead to automatic transformation of decimal values—such as the payment\_amount—into integers. This alteration (e.g., payment\_amount: 170 instead of payment\_amount: 170.00) can cause a webhook signature mismatch.
**Correct format: payment\_amount: 170.00** ✅ **Incorrect format: payment\_amount: 170** ❌
## Payment success webhook
A payment success webhook is triggered when a payment is successfully completed. You can use this for: Updating order status, triggering fulfilment, and sending confirmation to the customer.
```javascript Version (2025-01-01) theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2025-01-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"rishab@ybl",
"upi_instrument":"UPI_CREDIT_CARD",
"upi_instrument_number":"masked card number",
"upi_payer_ifsc":"SBI0025434",
"upi_payer_account_number":"XXXXX0231"
}
},
"payment_group":"upi",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0.36,
"payment_surcharge_service_tax":0.06
}
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":{
"gateway_name":"CASHFREE",
"gateway_order_id":"1634766330",
"gateway_payment_id":"1504280029",
"gateway_order_reference_id":"abc_124",
"gateway_settlement":"CASHFREE",
"gateway_status_code":null
},
"payment_offers":[
{
"offer_id":"0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type":"DISCOUNT",
"offer_meta":{
"offer_title":"50% off on UPI",
"offer_description":"50% off for testing",
"offer_code":"UPI50",
"offer_start_time":"2022-11-09T06:23:25.972Z",
"offer_end_time":"2025-02-27T18:30:00Z"
},
"offer_redemption":{
"redemption_status":"SUCCESS",
"discount_amount":1,
"cashback_amount":0
}
}
],
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time":"2025-01-15T11:16:10+05:30",
"type":"PAYMENT_SUCCESS_WEBHOOK"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2022-12-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"suhasg6@ybl",
}
},
"payment_group":"upi"
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":{
"gateway_name":"CASHFREE",
"gateway_order_id":"1634766330",
"gateway_payment_id":"1504280029",
"gateway_order_reference_id":"abc_124",
"gateway_settlement":"CASHFREE",
"gateway_status_code":null
},
"payment_offers":[
{
"offer_id":"0f05e1d0-fbf8-4c9c-a1f0-814c7b2abdba",
"offer_type":"DISCOUNT",
"offer_meta":{
"offer_title":"50% off on UPI",
"offer_description":"50% off for testing",
"offer_code":"UPI50",
"offer_start_time":"2022-11-09T06:23:25.972Z",
"offer_end_time":"2023-02-27T18:30:00Z"
},
"offer_redemption":{
"redemption_status":"SUCCESS",
"discount_amount":1,
"cashback_amount":0
}
}
]
},
"event_time":"2023-08-01T11:16:10+05:30",
"type":"PAYMENT_SUCCESS_WEBHOOK"
}
```
## Payment failed webhook
The payment failed webhook notifies you when a payment attempt fails, and we receive a failed response from the bank. Use case: Update order status, notify customer, initiate retry flow
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255"
}
},
"payment": {
"cf_payment_id": "1504280029",
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree",
"error_subcode_raw": "U09"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_settlement": "CASHFREE",
"gateway_status_code": null
},
"payment_offers": null,
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2023-08-01T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "CFPay_g47u3888d0k0_tblfm766qc",
"order_amount": 1.8,
"order_currency": "INR",
"order_tags": {
"cf_link_id": "13746255"
}
},
"payment": {
"cf_payment_id": "1504280029",
"payment_status": "FAILED",
"payment_amount": 1.8,
"payment_currency": "INR",
"payment_message": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00.",
"payment_time": "2023-01-06T20:00:11+05:30",
"bank_reference": "NA",
"auth_id": "null",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3054",
"netbanking_bank_name": "UCO Bank"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"error_details": {
"error_code": "GATEWAY_ERROR",
"error_description": "AMOUNT SHOULD BE WITHIN RANGE BETWEEN 20.00 TO 500000.00. for this bank",
"error_reason": "invalid_amount",
"error_source": "cashfree",
"error_subcode_raw": "U09"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_order_id": "1634766330",
"gateway_payment_id": "1504280029",
"gateway_settlement": "CASHFREE",
"gateway_status_code": null
},
"payment_offers": null
},
"event_time": "2023-08-01T20:00:12+05:30",
"type": "PAYMENT_FAILED_WEBHOOK"
}
```
## Payment user dropped webhook
The User Dropped Webhook notifies you when your customer abandons the payment flow. It will help you understand if customers attempted to pay or not. Some common scenarios where the transaction will be marked as USER\_DROPPED are:
* User was redirected to the bank's OTP page, but never entered the OTP.
* User was redirected to open the UPI app, but never entered the UPI PIN.
* User was shown the 3ds OTP modal, but did not enter the OTP.
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking",
"international_payment":{
"international":false
},
"payment_surcharge":{
"payment_surcharge_service_charge":0,
"payment_surcharge_service_tax":0
}
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
},
"terminal_details":{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "order_02",
"order_amount": 2,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": "975672265",
"payment_status": "USER_DROPPED",
"payment_amount": 2,
"payment_currency": "INR",
"payment_message": "User dropped and did not complete the two factor authentication",
"payment_time": "2022-05-25T14:25:34+05:30",
"bank_reference": "1803592531",
"auth_id": "2980",
"payment_method": {
"netbanking": {
"channel": null,
"netbanking_bank_code": "3044",
"netbanking_bank_name": "State Bank Of India"
}
},
"payment_group": "net_banking"
},
"customer_details": {
"customer_name": null,
"customer_id": "7112AAA812234",
"customer_email": "test@gmail.com",
"customer_phone": "9611199227"
}
},
"event_time": "2022-05-25T14:35:38+05:30",
"type": "PAYMENT_USER_DROPPED_WEBHOOK"
}
```
## Payment charges webhook
A payment charges webhook is triggered after a successful payment when Cashfree finalises the Transaction Discount Rate (TDR) and related charges for that payment. The event time can be later than the payment time. Use this webhook to reconcile per-payment charges and the net settlement amount.
To receive this event, subscribe to **Success Payment TDR** when you [configure webhooks](/docs/payments/online/webhooks/configure) in the Merchant Dashboard. The webhook `type` in the payload is `PAYMENT_CHARGES_WEBHOOK`.
The `payment_method` object in this webhook can be empty (`{}`). This is expected for the payment charges event.
For background on TDR, see [What is TDR?](/docs/help/account/pricing#what-is-tdr).
### `charges_details` fields
| Field | Description | Example |
| - | - | - |
| `service_charge` | Service charge (TDR) applicable for the payment. | `0.12` |
| `service_tax` | Service tax applicable on the service charge. | `0.02` |
| `settlement_amount` | Net amount for the payment after deducting the service charge and service tax. | `5.86` |
| `settlement_currency` | Currency of the settlement amount. | `INR` |
| `service_charge_discount` | Discount applied on the service charge, if any. Returns `null` when no discount applies. | `null` |
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"order": {
"order_id": "14508_73_1783668483731",
"order_amount": 6.00,
"order_currency": "INR",
"order_tags": null
},
"payment": {
"cf_payment_id": 5979305158,
"payment_status": "SUCCESS",
"payment_amount": 6.00,
"payment_currency": "INR",
"payment_message": "SUCCESS",
"payment_time": "2026-07-10T12:58:04+05:30",
"bank_reference": "841754751916",
"auth_id": null,
"payment_method": {},
"payment_group": "sbc_upi"
},
"customer_details": {
"customer_name": null,
"customer_id": null,
"customer_email": "rfeef@gmail.com",
"customer_phone": "9876543211"
},
"charges_details": {
"service_charge": 0.12,
"service_tax": 0.02,
"settlement_amount": 5.86,
"settlement_currency": "INR",
"service_charge_discount": null
}
},
"event_time": "2026-07-15T08:00:05+05:30",
"type": "PAYMENT_CHARGES_WEBHOOK"
}
```
## Sample payload by payment method
The instrument used for making a payment will vary by the payment methods used by the customer. Details of the payload by payment method are documented for reference.
```javascript theme={"dark"}
{
...,
"payment_method": {
"card": {
"channel": "link",
"card_number": "XXXXXXXXXXXX4738",
"card_network": "visa",
"card_type": "credit_card",
"card_sub_type": "R",
"card_country": "IN",
"card_bank_name": "HDFC Bank",
"card_network_reference_id": "100212023061200000001014824849",
"instrument_id":"8e9cc167-4fe2-4ece-be8d-c1b224e50a23",
"par": "V0010014623022637739353641436"
}
},
"payment_group": "credit_card",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"netbanking": {
"channel":null,
"netbanking_bank_code":"3022",
"netbanking_bank_name":"ICICI Bank"
}
},
"payment_group":"net_banking",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "rishabtated@ybl",
"upi_instrument" : "UPI_CREDIT_CARD",
"upi_instrument_number" : "masked card number",
"upi_payer_ifsc" : "SBI0025434",
"upi_payer_account_number" : "XXXXX0231"
}
},
"payment_group":"upi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method": {
"app": {
"channel":"AmazonPay",
"upi_id":null
}
},
"payment_group":"wallet",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"credit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
},
"card_network_reference_id":null
}
},
"payment_group":"credit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"card":{
"channel":null,
"card_number":"XXXXXXXXXX8952",
"card_network":null,
"card_type":"debit_card_emi",
"card_country":null,
"card_bank_name":"HDFC BANK",
"emi_details":{
"emi_amount":1167,
"emi_tenure":3,
"emi_interest":16.00
}
}
},
"payment_group":"debit_card_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"cardless_emi":{
"channel":null,
"provider":"flexmoney",
"phone":"9731117102",
"emi_details":null
}
},
"payment_group":"cardless_emi",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"pay_later":{
"channel":null,
"provider":"olapostpaid",
"phone":"9731117102"
}
},
"payment_group":"pay_later",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"vba_transfer":{
"utr":"MerchantID_utr",
"credit_ref_no":"NA",
"remitter_account":"808081pxqp242614HW",
"remitter_name":"Test",
"remitter_ifsc":"IFSC",
"email":"rishabtated@gmail.com",
"phone":"9999999999",
"vaccount_id":"123499",
"vaccount_number":"94260000123400"
}
},
"payment_group":"vba_transfer",
...
}
```
```javascript theme={"dark"}
{
...,
"payment_method":{
"bank_transfer":{
"transfer_type":"NEFT",
"bank":"UNION BANK OF INDIA"
}
},
"payment_group":"bank_transfer",
...
}
```
## Webhook FAQs
You can configure webhook URLs for each notification type in your merchant dashboard. To receive notifications, subscribe to specific events, such as PAYMENT\_SUCCESS or PAYMENT\_FAILED. For step-by-step instructions, go through the [official documentation](/docs/payments/online/webhooks/overview).
This may occur if the PAYMENT\_FAILED webhook event is not subscribed. To resolve this, open your dashboard, navigate to the webhook configuration, and ensure that the `PAYMENT_FAILED` event is selected.
This applies to all webhook events. Make sure relevant events are enabled as needed.
Ensure that your endpoint is reachable and returns a 2xx status code. Also, verify that it is properly configured to accept webhook requests.
There could be multiple reasons:
* The webhook URL was not included in the notify\_url parameter during order creation.
* Make sure you have done the webhook configuration for the notification type as needed.
* The endpoint URL is returning a 4xx or 5xx error.
Actions to take:
* Verify that your webhook is correctly configured. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payment Gateway > Developers > Webhook Configuration**.
* Ensure that the endpoint is accessible and able to accept requests from Cashfree.
You can enable or disable specific webhook types directly from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). For detailed instructions, refer to the
**Payment Gateway > Developers > Webhook Configuration** section.
Once the feature is rolled out in Production, the new version will appear in the version drop-down under Webhook Configuration.
If you do not see the new version, the rollout may still be in progress. Please check back later or contact support for assistance.
This may happen if the webhook URL is configured, but no events are selected. Ensure:
* Webhook types are enabled.
* Your endpoint is healthy and accessible to accept the requests from Cashfree.
Duplicate webhook triggers may occur due to misconfiguration or retry logic. This can happen if multiple webhook versions are configured using the same or different endpoint URLs.
✅ Actions to take:
* The Merchant can revisit and delete the duplicate configured endpoint URL. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payment Gateway > Developers > Webhook Configuration**.
Notify URLs are necessary for webhook delivery. Return URLs only redirect the user after the transaction. Ensure you pass both as different URLs, especially if you need server-side notifications.
* Always subscribe to the necessary webhook event types (`SUCCESS`, `FAILED`, `USER_DROPPED`, and **Success Payment TDR** for payment charges).
* Test your webhook integration in Sandbox before going live.
* Use publicly accessible HTTPS URLs that return 200 OK responses.
* Regularly review and update webhook configurations in the merchant dashboard to avoid outdated or incorrect entries.
# Create VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/create-vba
openapi/pgvba/pgvba.yaml post /pg/vba
Use this API to create a virtual bank account. It allows you to receive payments just like a regular bank account.
# Create VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/create-vba-notification-group
openapi/pgvba/pgvba.yaml post /pg/vba/notificationgroup
Use this API to create a notification group. The recipients in the group will receive notifications regarding the payment details.
# Edit VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/edit-vba
openapi/pgvba/pgvba.yaml put /pg/vba/{virtual_account_id}
Use this API to edit the details of the created virtual bank account.
# Edit VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/edit-vba-notification-group
openapi/pgvba/pgvba.yaml put /pg/vba/notificationgroup/{notification_group_name}
Use this API to edit the details of the created notification group.
# Get VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/get-vba
openapi/pgvba/pgvba.yaml get /pg/vba/{virtual_account_id}
Use this API to get the details of the created virtual bank account by entering the virtual account ID.
# Get VBA Notification Group
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/get-vba-notification-group
openapi/pgvba/pgvba.yaml get /pg/vba/notificationgroup/{notification_group_name}
Use this API to get the details of the created notification group.
# Get VBA Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/get-vba-payments
openapi/pgvba/pgvba.yaml post /pg/vba/payments
Use this API to get all the payment details regarding a virtual bank account.
# Get VBA Payments By UTR
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/get-vba-payments-by-utr
openapi/pgvba/pgvba.yaml get /pg/vba/payments/{utr}
Use this API to get the payment details by entering the unique transaction reference (UTR).
# Manage VBA
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/manage-vba
openapi/pgvba/pgvba.yaml patch /pg/vba/{virtual_account_id}
Use this API to manage the status of the created virtual bank account.
# Manage VBA Notification Group Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/pgvba/manage-vba-notification-group-status
openapi/pgvba/pgvba.yaml patch /pg/vba/notificationgroup/{notification_group_name}
Use this API to modify the status of the created notification group.
# Vendor Reconciliation API
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/reconciliation/vendor-recon
openapi/payments/v2025-01-01.yaml post /recon/vendor
This API allows you to fetch vendor reconciliation details by using different filters. Use the appropriate filters based on your requirements. After you receive a VENDOR_SETTLEMENT_SUCCESS webhook confirmation, wait 15 minutes before you call this API endpoint.
- **View Split Order Details Using Settlement ID**: Retrieve details of split orders within a settlement by Settlement ID.
- **Vendor Recon for a Time Period**: Fetch reconciliation details for all vendors within a specific time interval.
- **Vendor Recon Using Vendor ID & Time Interval**: Get reconciliation details for a specific vendor within a given time interval.
**Vendor Recon API usage**
When you use the Vendor Recon API, follow these guidelines:
* Don't call the API with a failed `settlement_id`. If a settlement has failed and the amount remains unsettled, the API returns no data.
* If the amount is later settled under a new (successful) `settlement_id`, the API returns data for the successful settlement instead.
* To retrieve records older than six months, include a date range in your request. Searches using `settlement_id` return data from the last six months only.
# Create Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/refunds/create
openapi/payments/v2025-01-01.yaml post /orders/{order_id}/refunds
Use this API to initiate refunds. You can initiate refunds only within six months of the original successful transaction's date and time..
Run in Postman: You can also try this API in our Postman Collection.
# Get Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/refunds/get
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/refunds/{refund_id}
Use this API to fetch a specific refund processed on your Cashfree Account.
Run in Postman: You can also try this API in our Postman Collection.
# Get All Refunds for an Order
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/refunds/get-refunds-for-order
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/refunds
Use this API to fetch all refunds processed against an order.
Run in Postman: You can also try this API in our Postman Collection.
# Update Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/refunds/update-refund
openapi/payments/v2025-01-01.yaml put /orders/{order_id}/refunds/{refund_id}
Use this API to Update refunds.
# Refund Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/refunds/webhooks
Learn about the async events sent for refunds
Webhooks are server callbacks to your server from Cashfree. We send refund webhooks for three different events for a payment.
1. Refund is successfully processed
2. Refund is cancelled by Cashfree - we were unable to successfully refund to customer even after multiple attempts.
3. For successful Auto-refunds - Read more about Auto-Refunds [here](/docs/payments/manage/refunds/overview#auto-refunds)
## Refund webhook payload
```javascript Version 2025-01-01 theme={"dark"}
{
"data":{
"refund":{
"cf_refund_id":11325632,
"cf_payment_id":789727431,
"refund_id":"refund_sampleorder0413",
"order_id":"sampleorder0413",
"refund_amount":2.00,
"refund_currency":"INR",
"entity":"Refund",
"refund_type":"MERCHANT_INITIATED",
"refund_arn":"205907014017",
"refund_status":"SUCCESS",
"status_description":"Refund processed successfully",
"created_at":"2022-02-28T12:54:25+05:30",
"processed_at":"2022-02-28T13:04:27+05:30",
"refund_note":"Test",
"refund_splits":[
{
"merchantVendorId":"sampleID12345",
"amount":1,
"percentage":null
},
{
"merchantVendorId":"otherVendor",
"amount":1,
"percentage":null
}
],
"metadata":null,
"requested_speed":"STANDARD",
"processed_speed":"STANDARD",
"service_charge":0.00,
"service_tax":0.00,
"forex_conversion_handling_charge":null,
"forex_conversion_handling_tax":null,
"forex_conversion_rate":null,
"charges_currency":null
},
terminalDetails:{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time":"2022-02-28T13:04:28+05:30",
"type":"REFUND_STATUS_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data":{
"refund":{
"cf_refund_id":11325632,
"cf_payment_id":789727431,
"refund_id":"refund_sampleorder0413",
"order_id":"sampleorder0413",
"refund_amount":2.00,
"refund_currency":"INR",
"entity":"Refund",
"refund_type":"MERCHANT_INITIATED",
"refund_arn":"205907014017",
"refund_status":"SUCCESS",
"status_description":"Refund processed successfully",
"created_at":"2022-02-28T12:54:25+05:30",
"processed_at":"2022-02-28T13:04:27+05:30",
"refund_note":"Test",
"refund_splits":[
{
"merchantVendorId":"sampleID12345",
"amount":1,
"percentage":null
},
{
"merchantVendorId":"otherVendor",
"amount":1,
"percentage":null
}
],
"metadata":null,
"requested_speed":"STANDARD",
"processed_speed":"STANDARD",
"service_charge":0.00,
"service_tax":0.00
}
},
"event_time":"2022-02-28T13:04:28+05:30",
"type":"REFUND_STATUS_WEBHOOK"
}
```
## Auto refund webhook payload
Auto-refund webhooks differ from standard refund webhooks because they handle refunds that occur automatically (like failed payment attempts) rather than manual refunds tied to specific orders. Since these automatic refunds may happen before an order is created, they don't contain the usual order-related data fields that are mandatory in standard refund webhooks,
```javascript Version 2025-01-01 theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null,
"forex_conversion_handling_charge": null,
"forex_conversion_handling_tax": null,
"forex_conversion_rate": null,
"charges_currency": null
},
terminalDetails:{
"cf_terminal_id":17269,
"terminal_phone":"8971520311"
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"auto_refund": {
"event": "AUTO-REFUND",
"cf_refund_id": 1243460973,
"cf_payment_id": "2148333968",
"bank_reference": "234928698581",
"order_id": "order_1944392Tpba8y2fHcHVx0SwREojp51Jgr",
"refund_amount": 39,
"refund_currency": "INR",
"refund_type": "PAYMENT_AUTO_REFUND",
"refund_arn": "205907014017",
"refund_status": "SUCCESS",
"status_description": "Auto-Refund processed successfully",
"refund_reason": "Multiple payments were performed against same order.",
"created_at": "2023-08-11T14:08:28+05:30",
"processed_at": null,
"refund_charge": 0,
"refund_splits": null,
"metadata": null
}
},
"event_time": "2023-08-11T14:10:21+05:30",
"type": "AUTO_REFUND_STATUS_WEBHOOK"
}
```
# Submit Risk Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/risk/submit-risk-details
openapi/payments/risk-details.yaml post /risk-details
Use this API to submit comprehensive risk assessment data for an order to Cashfree's risk management system. The API accepts customer details, device information, and industry-specific transaction data for enhanced fraud detection and risk analysis.
# Get All Settlements
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/get-settlements
openapi/payments/v2025-01-01.yaml post /settlements
Use this API to get all settlement details by specifying the settlement ID, settlement UTR or date range.
Run in Postman: You can also try this API in our Postman Collection.
# Get Settlements by Order ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/get-settlements-for-order
openapi/payments/v2025-01-01.yaml get /orders/{order_id}/settlements
Use this API to view all the settlements of a particular order.
# Mark Order For Settlement
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/mark-order-for-settlement
openapi/payments/v2025-01-01.yaml post /orders/settlements
Use this API to pass the CBRICS ID to Cashfree and mark an order for settlement.
This API supports only merchants linked with the National Stock Exchange (NSE) or Bombay Stock Exchange (BSE).
# PG Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/reconcile
openapi/payments/v2025-01-01.yaml post /recon
- Use this API to get the payment gateway reconciliation details with date range.
- It will have events for your payment account
# Settlement Reconciliation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/settlement-reconciliation
openapi/payments/v2025-01-01.yaml post /settlement/recon
- Use this API to get settlement reconciliation details using Settlement ID, settlement UTR or date range.
- This API will return events for the settlement IDs you want
# Settlement Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/settlements/settlement-webhooks
Learn more about webhooks triggered when a payout to merchant or vendor account happens
We broadly send two types of notifications when a payout happens.
1. Payout to Merchant account
2. Payout to Vendor account (if you are using Easy Split)
## Settlement Webhook
This webhook is triggered whenever there is a payout to your merchant account. The settlement webhooks will notify you about instant settlements in addition to the standard settlement webhooks. We send webhooks for four different events for a `settlement`.
| Webhook Event | Description |
| - | - |
| SETTLEMENT\_INITIATED | This webhook will be triggered when a settlement is initiated. |
| SETTLEMENT\_SUCCESS | This webhook will be triggered when a settlement is successful. |
| SETTLEMENT\_FAILED | This webhook will be triggered when a settlement has failed. |
| SETTLEMENT\_REVERSED | This webhook will be triggered when a settlement has been reversed. |
The following webhook is sent for other types of settlements as well: instant settlement or an on-demand settlement.
```javascript 2025-01-01 theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 97.94,
"payment_amount": 100,
"payment_from": "2025-02-14 12:00:00",
"payment_till": "2025-02-14 12:15:00",
"reason": null,
"service_charge": 1.75,
"service_tax": 0.31,
"settled_on": "2025-02-14T12:35:19+05:30",
"settlement_type": "STANDARD", //settlement type //
"settlement_amount": 97.94,
"settlement_id": 738,
"settlement_initiated_on": "2025-02-14T12:35:17+05:30",
"status": "SUCCESS",
"utr": 1644822317781212,
"settlement_charge": 0, // applicable for instant settlement //
"settlement_tax": 0, // applicable for instant settlement //
"remarks": null, // applicable for instant settlement //
"forex_conversion_handling_charge":null,
"forex_conversion_handling_tax":null,
"forex_conversion_rate":null,
"charges_currency":null
}
},
"event_time": "2022-02-08T13:37:34+05:30",
"type": "SETTLEMENT_SUCCESS"
}
```
```javascript 2023-08-01 theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 97.94,
"payment_amount": 100,
"payment_from": "2022-02-14 12:00:00",
"payment_till": "2022-02-14 12:15:00",
"reason": null,
"service_charge": 1.75,
"service_tax": 0.31,
"settled_on": "2022-02-14T12:35:19+05:30",
"settlement_type": "STANDARD", //settlement type //
"settlement_amount": 97.94,
"settlement_id": 738,
"settlement_initiated_on": "2022-02-14T12:35:17+05:30",
"status": "SUCCESS",
"utr": 1644822317781212,
"settlement_charge": 0, // applicable for instant settlement //
"settlement_tax": 0, // applicable for instant settlement //
"remarks": null. // applicable for instant settlement //
}
},
"event_time": "2022-02-08T13:37:34+05:30",
"type": "SETTLEMENT_SUCCESS"
}
```
## Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | Sum of refunds, disputes, and chargebacks included in this settlement. | 0 |
| amount\_settled | Total amount settled in this schedule. | 15 |
| payment\_amount | Total transaction amount considered for settlement. | 15 |
| payment\_from | Start date and time from which payments are considered for settlement. | 2022-02-14 12:00:00 |
| payment\_till | End date and time till which payments are considered for settlement. | 2022-02-23 12:00:00 |
| reason | Reason for failed or reversed settlements. | Transfer mode not valid for beneficiary. |
| service\_charge | Service charges applicable to the payments included in this settlement. | 2 |
| service\_tax | Service tax applicable to the payments included in this settlement. | 0 |
| settled\_on | Date and time when the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_type | Type of settlement (e.g., INSTANT). | INSTANT |
| settlement\_amount | Net settlement amount for the payments included in this settlement. | 13 |
| settlement\_id | Unique settlement ID generated by Cashfree. | 1155353 |
| settlement\_initiated\_on | Date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (INITIATED, SUCCESS, FAILED, or REVERSED). | SUCCESS |
| utr | Unique transaction reference number provided by the bank for the settlement. | N076221079016329 |
| settlement\_charge | Additional charge applicable for instant settlement. | 10.10 |
| settlement\_tax | Settlement tax applicable for instant settlement. | 01.97 |
| remarks | Any remarks specified by the merchant. | Settlement Initiated |
| event\_time | Time when the settlement webhook was triggered. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook event (SETTLEMENT\_INITIATED, SETTLEMENT\_SUCCESS, SETTLEMENT\_FAILED, or SETTLEMENT\_REVERSED). | SETTLEMENT\_SUCCESS |
## Vendor Settlement Webhook
This section only applies to merchants using our Easy Split product
These settlement webhooks automate notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
| Webhook Event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
```javascript Vendor Settlement Webhook theme={"dark"}
{
"data": {
"settlement": {
"adjustment": 0,
"amount_settled": 10,
"payment_amount": null,
"payment_from": "2022-05-26",
"payment_till": "2022-05-26",
"reason": null,
"service_charge": 0.05,
"service_tax": 0.01,
"settled_on": "2022-05-26T15: 06: 14+05: 30",
"settled_orders_count": 2,
"settlement_amount": 10,
"settlement_id": 6151,
"settlement_initiated_on": "2022-05-26T15: 06: 09+05: 30",
"settlement_type": null,
"status": "CREATED",
"utr": null,
"vendor_id": "Vendor_123adj4dr4osn23fn",
"vendor_transaction_amount": 10,
"account_mode": "BANK",
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
},
"event_time": "2022-05-26T15:06:15+05:30",
"type": "VENDOR_SETTLEMENT_INITIATED"
}
}
```
## Transaction Wise Settlement Webhook
This section only applies to merchants using our Transaction Wise Settlement model
These TWS(Transaction Wise Settlement) webhooks are triggered when settlement are initiated, successfully processed, failed, or reversed.
| Webhook Event | Description |
| :- | :- |
| TRANSACTION\_WISE\_SETTLEMENT\_INITIATED | This webhook will be triggered when a TWS is initiated. |
| TRANSACTION\_WISE\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a TWS is successful. |
| TRANSACTION\_WISE\_SETTLEMENT\_FAILED | This webhook will be triggered when a TWS has failed. |
| TRANSACTION\_WISE\_SETTLEMENT\_REVERSED | This webhook will be triggered when a TWS has been reversed. |
```javascript Transaction Wise Settlement Webhook theme={"dark"}
{
"data":{
"order":{
"order_id":"order_OFR_2",
"order_amount":2,
"order_currency":"INR",
"order_tags":null
},
"payment":{
"cf_payment_id":"1453002795",
"payment_status":"SUCCESS",
"payment_amount":1,
"payment_currency":"INR",
"payment_message":"00::Transaction success",
"payment_time":"2022-12-15T12:20:29+05:30",
"bank_reference":"234928698581",
"auth_id":null,
"payment_method":{
"upi":{
"channel":"collect",
"upi_id":"suhasg6@ybl",
"upi_instrument":"UPI_CREDIT_CARD",
"upi_instrument_number":"masked card number",
"upi_payer_ifsc":"SBI0025434",
"upi_payer_account_number":"XXXXX0231"
}
},
"payment_group":"upi"
},
"customer_details":{
"customer_name":null,
"customer_id":"7112AAA812234",
"customer_email":"test@gmail.com",
"customer_phone":"9908734801"
},
"payment_gateway_details":null,
"payment_offers":null,
"settlement": {
"settlement_id": "1639789947",
"status": "SUCCESS",
"utr": "1212743972438575",
"payment_amount": 500.00,
"settlement_initiated_on": "2025-03-15T22:21:29+05:30",
"settled_on": "2025-03-15T22:22:30+05:30",
"reason": "Transfer completed successfully",
"adjustment": 0.00,
"settlement_amount": 441.00,
"service_charge": 50.00,
"service_tax": 9.00,
"amount_settled": 441.00,
"payment_from": "2025-03-15T22:21:29+05:30",
"payment_till": "2025-03-15T22:21:29+05:30",
"settlement_type": "NORMAL_SETTLEMENT",
"remarks": null,
"settlement_charge": 0.00,
"settlement_tax": 0.00
}
},
"event_time": "2025-04-10T22:22:06+05:30",
"type": "TRANSACTION_WISE_SETTLEMENT_SUCCESS"
}
}
```
# Fetch Settlement Simulation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/simulation/fetch-settlement-simulation
openapi/payments/v2025-01-01.yaml get /simulate/settlement/{simulation_id}
Use this API to fetch the details of a simulated settlement.
# Fetch Simulation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/simulation/fetch-simulation
openapi/payments/v2025-01-01.yaml get /simulate/{simulation_id}
Use this API to fetch simulated payment details.
# Simulate Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/simulation/simulate-payment
openapi/payments/v2025-01-01.yaml post /simulate
Use this API to simulate payment. To use this API you should first create an order using the Create Order API. Also, you need to create a payment with the same order.
# Simulate Settlement Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/simulation/simulate-settlement
openapi/payments/v2025-01-01.yaml post /simulate/settlement
Use this API to simulate a settlement in the sandbox environment. First, create a successful order, and then call this API with the order ID to simulate the settlement for that order.
# Create Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/create-terminal
openapi/payments/v2025-01-01.yaml post /terminal
Use this API to create new terminals to use softPOS.
# Create Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/create-terminal-transaction
openapi/payments/v2025-01-01.yaml post /terminal/transactions
Use this API to create a new terminal transaction. To use this API you should first create an order using the Create Order API. Also, you need to enter the terminal details while creating the order and pass the same terminal information while creating a transaction using the below mentioned API.
# Demap Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/demap-soundbox-vpa
openapi/payments/v2025-01-01.yaml post /terminal/demap/soundbox
Use this API to demap a device from soundbox.
# Fetch Terminal QR Codes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/fetch-terminal-qr-codes
openapi/payments/v2025-01-01.yaml get /terminal/qrcodes
You can fetch all the StaticQRs corresponding to given terminal id or phone number. Provide either the terminal_phone_no or terminal_id in the request.
# Fetch Terminal Soundbox vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/fetch-terminal-soundbox-vpa
openapi/payments/v2025-01-01.yaml get /terminal/soundbox/qrcodes
You can fetch all the active and mapped SoundboxVpa corresponding to given terminal id or deviceSerialNo. Provide either the device_serial_no or cf_terminal_id in the request.
# Get Terminal Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/get-terminal-payments
openapi/payments/v2025-01-01.yaml post /terminal/payments
Use this API to fetch a paginated list of terminal payment transactions. You can filter results by date range, terminal details, payment status, and other criteria.
snippets/related-topics-loader.mdx
# Get Terminal Status using Phone Number
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/get-terminal-status-using-phone-number
openapi/payments/v2025-01-01.yaml get /terminal/{terminal_phone_no}
Use this API to view all details of a terminal.
# Get Terminal Transaction
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/get-terminal-transaction
openapi/payments/v2025-01-01.yaml get /terminal/{cf_terminal_id}/payments
Use this API to get terminal transaction.
# Onboard Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/onboard-soundbox-vpa
openapi/payments/v2025-01-01.yaml post /terminal/soundbox
Use this API to onboard a terminal Vpa to soundbox.
# SoftPOS Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/softpos-webhooks
Learn in detail about softPOS webhooks.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events related to the transaction happen.
## Terminal Status Update Webhook
The new terminal status update webhook notifies you about the terminal status update, and gives you comprehensive information about terminal updates.
```java theme={"dark"}
{
"data":{
"added_on":"2024-03-07 15:11:02"
"cf_terminal_id":1234
"last_updated_on":"2024-04-26 12:16:08"
"terminal_id":1233
"terminal_name":"ABC"
"terminal_phone":"9696969696"
"terminal_status":"PROVISIONALLY_ACTIVE"
"terminal_type":"STOREFRONT"
"review_remarks":"approved"
}
"event_time":"2024-04-26T12:16:08+05:30"
"type":"TERMINAL_STATUS_UPDATE"
}
```
***
# Update Soundbox Vpa
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/update-soundbox-vpa
openapi/payments/v2025-01-01.yaml patch /terminal/{cf_terminal_id}/soundbox
Use this API to update a terminal Vpa to soundbox.
# Update Terminal
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/update-terminal
openapi/payments/v2025-01-01.yaml patch /terminal/{cf_terminal_id}
Use this API to update the terminal details. Email, Phone Number, and Terminal Meta are updatable for "Storefront". Only account status change is possible in case of "Agent".
# Update Terminal Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/update-terminal-status
openapi/payments/v2025-01-01.yaml patch /terminal/{cf_terminal_id}/status
Use this API to update the terminal status.
# Upload Terminal Docs
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/softpos/upload-terminal-docs
openapi/payments/v2025-01-01.yaml post /terminal/{cf_terminal_id}/docs
Use this API to upload the terminal documents.
# Get Vendor Balance Transfer Charges
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/billing/balance-transfer-charges
openapi/payments/v2025-01-01.yaml get /easy-split/amount/{amount}/charges
This API returns the applicable service charge and service tax for a vendor balance transfer, based on the provided amount and rate type.
# Split After Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/configuration/split-after-payment
openapi/payments/v2025-01-01.yaml post /easy-split/orders/{order_id}/split
The Split After Payment API splits payments to vendors after customers successfully complete a payment. After you receive a successful payment confirmation, wait 2 minutes before you call this API endpoint.
# Create Static Split Configuration
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/configuration/static-split
openapi/payments/v2025-01-01.yaml post /easy-split/static-split
This API will create a static split scheme wherein you can define the split type and the vendor-wise split percentage.
# Easy Split Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/easy-split-overview
Explore Cashfree's Easy Split APIs (v2025-01-01) to split payments across vendors, manage vendor accounts, and reconcile settlements automatically.
Easy Split automates the splitting of payments with vendors and partners on time. Collect payments from customers, and set up a flexible schedule options to disburse payments to your vendors. Get detailed reports on the transactions, settlements, refunds, vendor payments and adjustments.
**How does Easy Split work?**
**You can perform the following tasks using Easy Split:**
* Add and manage all your vendors efficiently
* Split payments and settle them into multiple vendor accounts using the available schedule options cycles
* Check on-demand vendor balance and settle the money into the vendor accounts instantly
* Vendor reconciliation
The table below provides the list of Easy Split APIs along with their description:
**Vendor APIs**
| API Name | Description |
| :- | :- |
| [Create Vendor](/docs/api-reference/payments/previous/v2025-01-01/split/vendors/create) | Create Vendor API creates a new vendor in your Easy Split account. |
| [Update Vendor Details](/docs/api-reference/payments/previous/v2025-01-01/split/vendors/update) | Update Vendor Details API updates the existing vendor details. |
| [Get All Vendor Details](/docs/api-reference/payments/previous/v2025-01-01/split/vendors/get) | Get All Vendor Details API gets the details of all the vendors associated with that Easy Split account. |
| [Create On Demand Transfer](/docs/api-reference/payments/previous/v2025-01-01/split/settlements/on-demand-transfer) | Create On Demand Transfer API initiates a balance transfer request between merchant and vendor. |
| [Create Refund](/docs/api-reference/payments/previous/v2025-01-01/refunds/create) | Create Refund API creates a new refund. |
**Split Order APIs**
| API Name | Description |
| :- | :- |
| [Create Static Split](/docs/api-reference/payments/previous/v2025-01-01/split/configuration/static-split) | Use this API to create a split at order level. |
| [Split After Payment](/docs/api-reference/payments/previous/v2025-01-01/split/configuration/split-after-payment) | Split After Payment API creates a split after the payment is completed. |
| [Get Split and Settlement Details by Order ID](/docs/api-reference/payments/previous/v2025-01-01/split/settlements/split-details) | Get Split and Settlement Details by Order ID API gets details of the split, settled and unsettled transactions of each vendor using the Order ID. |
**Settlement APIs**
| API Name | Description |
| :- | :- |
| [Get Vendor Settlement Details](/docs/api-reference/payments/previous/v2025-01-01/split/settlements/split-details) | Get Vendor Settlement Details (same endpoint as split-order recon; specify a settlement ID to filter results or leave blank for all) |
**On Demand Settlement APIs**
| API Name | Description |
| :- | :- |
| [Get On Demand Balance](/docs/api-reference/payments/previous/v2025-01-01/split/vendors/get-on-demand-balance) | Get On Demand Balance API fetches the available merchant and vendor balances. |
| [Create On Demand Transfer](/docs/api-reference/payments/previous/v2025-01-01/split/settlements/on-demand-transfer) | Create On Demand Transfer API initiates a balance transfer request between merchant and vendor. |
**Reconciliation APIs**
| API Name | Description |
| :- | :- |
| [Vendor Reconciliation](/docs/api-reference/payments/previous/v2025-01-01/reconciliation/vendor-recon) | Vendor Reconciliation API fetches vendor recon details; supports split-order lookups by settlement ID, time-period queries, and vendor-specific intervals. |
# Easy Split - Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/easy-split-postman-collection
Download the Cashfree Easy Split Postman collection for v2025-01-01 and watch a walkthrough video to quickly test vendor split payment APIs.
Get started quickly with Cashfree's Easy Split APIs by downloading the collection and importing it in Postman.
Download Cashfree Easy Split Postman Collection
Watch the video below to learn how to setup API
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/end-points
Find the Cashfree Payment Gateway API base URLs for test and production (v2025-01-01), and learn how to verify your API key credentials.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you can see your AppId and SecretKey.
Cashfree expects the API key to be included in all API requests to the server. Use the endpoint /api/v1/credentials/verify to verify your credentials.
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
# Create On Demand Transfer
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/settlements/on-demand-transfer
openapi/payments/v2025-01-01.yaml post /easy-split/vendors/{vendor_id}/transfer
The Create On Demand Transfer API will create a new on-demand request either from to the merchant or from to the vendor.
# Get Split and Settlement Details by OrderID v2.0
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/settlements/split-details
openapi/payments/v2025-01-01.yaml post /split/order/vendor/recon
Use this API to get all the split details, settled and unsettled transactions details of each vendor who were part of a particular order by providing order Id or start date and end date.
# Upload Vendor Docs
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/add-document
openapi/payments/v2025-01-01.yaml post /easy-split/vendor-docs/{vendor_id}
Use this API to upload KYC documents of a specific vendor.
# Create vendor
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/create
openapi/payments/v2025-01-01.yaml post /easy-split/vendors
Use this API to create a new vendor to your EasySplit account along with the KYC details. Provide KYC details such as account_type, business_type, gst, cin, pan, passport number and so on.
Keep the following points in mind when you create a vendor:
* Use [test account details](/docs/payments/split/data-to-test#sample-bank-account-numbers-upi-and-vpa) in Sandbox mode.
* Use test GST and PAN numbers from the [test details](/docs/payments/split/data-to-test#test-details) page.
* Vendors that you create in the Sandbox environment with test bank account and KYC details move to `ACTIVE` status automatically after 10 minutes.
* If a vendor doesn't move to `ACTIVE` status within 24 hours in Production mode, fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
# Download Vendor Documents
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/download-documents
openapi/payments/v2025-01-01.yaml get /easy-split/vendor-docs/{vendor_id}/download/{doc_type}
Use this API to download the uploaded KYC documents of that particular vendor. Provide the document type. Click the link from the sample request to download the KYC document.
# Get Vendor All Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/get
openapi/payments/v2025-01-01.yaml get /easy-split/vendors/{vendor_id}
Use this API to get the details of a specific vendor associated with your Easy Split account.
# Get Vendor All Documents Status
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/get-document
openapi/payments/v2025-01-01.yaml get /easy-split/vendor-docs/{vendor_id}
Use this API to fetch the details of all the KYC details of a particular vendor.
# Get On Demand Balance
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/get-on-demand-balance
openapi/payments/v2025-01-01.yaml get /easy-split/vendors/{vendor_id}/balances
This API fetches the available amount with the merchant, vendor, and the unsettled amount for the merchant as well as the vendor.
# Update vendor Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/vendors/update
openapi/payments/v2025-01-01.yaml patch /easy-split/vendors/{vendor_id}
Use this API to edit the existing vendor details added to your EasySplit account. You can edit vendor details such as name, email, phone number, upi details, and any of the KYC details.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/webhooks/overview
This section consists of the Easy Split Webhooks.
Webhooks are server callbacks to your server from Cashfree. Webhooks are event-based and are sent when specific events happen.
The table below lists the various webhook events:
| Webhook Name | Description |
| :- | :- |
| [Vendor Settlement Webhook](/docs/api-reference/payments/previous/v2025-01-01/split/webhooks/vendor-settlement-webhooks) | Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed. |
| [Vendor Status Change Webhook](/docs/api-reference/payments/previous/v2025-01-01/split/webhooks/vendor-status-change-webhooks) | Configure vendor status change webhooks to receive automated notifications when vendor status is changed. |
# Vendor Settlement Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/webhooks/vendor-settlement-webhooks
This chapter explains the vendor settlement webhooks.
Configure vendor settlement webhooks to receive automated notifications when vendor settlements are initiated, successfully processed, failed, or reversed.
The webhook notifications are sent on all the URLs added and enabled in the settlement webhook. You can add new URLs and enable or disable existing URLs for settlement webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for settlements.
| Webhook Event | Description |
| :- | :- |
| VENDOR\_SETTLEMENT\_INITIATED | This webhook will be triggered when a vendor settlement is initiated. |
| VENDOR\_SETTLEMENT\_SUCCESS | This webhook will be triggered when a vendor settlement is successful. |
| VENDOR\_SETTLEMENT\_FAILED | This webhook will be triggered when a vendor settlement has failed. |
| VENDOR\_SETTLEMENT\_REVERSED | This webhook will be triggered when a vendor settlement has been reversed. |
## Vendor settlement initiated
SETTLEMENT\_INITIATED webhook is triggered when a settlement has been initiated by Cashfree.
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "CREATED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_CREATED"
}
```
## Vendor settlement success
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "SUCCESS",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "2023-06-08T15:10:37+05:30",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": 600.00,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "UPI",
"settled_orders_count": 1,
"account_number": null,
"ifsc": null,
"vpa": "9898989898@ybl"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_SUCCESS"
}
```
***
## Vendor settlement failed
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "FAILED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": null,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_FAILED"
}
```
***
## Vendor settlement reversed
```
{
"data": {
"settlement": {
"settlement_id": 49703,
"status": "REVERSED",
"utr": "1686217237243457",
"payment_amount": null,
"settlement_initiated_on": "2023-06-08T15:10:35+05:30",
"settlement_type": null,
"settled_on": "null",
"reason": Failed from bank end,
"adjustment": 100.00,
"settlement_amount": 600.00,
"service_charge": 0.50,
"service_tax": 0.09,
"amount_settled": null,
"payment_from": "2023-06-08",
"payment_till": "2023-06-08",
"vendor_id": "esSettlementsAutomationVendor",
"vendor_transaction_amount": 500.00,
"account_mode": "BANK",
"settled_orders_count": 1,
"account_number": "XXXXXXX1234",
"ifsc": "HDFC0000001",
"vpa": null
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_SETTLEMENT_REVERSED"
}
```
***
## Payload field description
| Field | Description | Example |
| - | - | - |
| adjustment | The sum of refunds, disputes, and chargeback part of this settlement is displayed here. | 0 |
| amount\_settled | The total amount that is settled in this schedule option. | 50 |
| payment\_amount | Total transaction amount considered for settlement. | 100 |
| payment\_from | Start date from which the payments are considered for settlement. | 2022-03-15 |
| payment\_till | End date till which the payments are considered for settlement. | 2022-03-23 |
| reason | Reason for failed and reversed settlements. | Transfer mode is not valid for beneficiary. |
| service\_charge | Service charges are applicable for the payments that are included in this settlement. | 2 |
| service\_tax | Service tax is applicable for the payments that are included in this settlement. | 0.50 |
| settled\_on | Date and time at which the settlement was processed. | 2022-03-17T14:21:18+05:30 |
| settlement\_amount | The sum of net settlement amount for the payments part of this settlement. | 13 |
| settlement\_id | Cashfree settlement ID | 1155353 |
| settlement\_initiated\_on | The date on which settlement was initiated. | 2022-03-17T14:29:21+05:30 |
| status | Status of the settlement (either INITIATED, SUCCESS, FAILED, or REVERSED) | SUCCESS |
| utr | The unique transaction reference number is given by the bank for the settlement. | N076221079016329 |
| vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| vendor\_transaction\_amount | Transaction amount split of vendor | 50 |
| event\_time | Time at which settlement webhook was initiated. | 2022-03-17T14:29:23+05:30 |
| type | Type of webhook - VENDOR\_SETTLEMENT\_INITIATED, VENDOR\_SETTLEMENT\_SUCCESS, VENDOR\_SETTLEMENT\_FAILED, or VENDOR\_SETTLEMENT\_REVERSED. | VENDOR\_SETTLEMENT\_SUCCESS |
## Reasons for failed and reversed settlements
| Reason | Category | Description |
| :- | :- | :- |
| BANK\_GATEWAY\_ERROR | Bank | Technical error at the bank |
| BENE\_BANK\_DECLINED | Bank | Rejected by Beneficiary bank due to business reasons |
| FAILED | Bank | No explicit failure reason from the bank |
| INVALID\_IFSC\_FAIL | Customer | Invalid ifsc code provided for bank account |
| INVALID\_ACCOUNT\_FAIL | Customer | Bank account is invalid |
| RETURNED\_FROM\_BENEFICIARY | Bank | Immediate reversal from the beneficiary bank |
| INSUFFICIENT\_BALANCE | Vendor | Your balance is exhausted, need to add funds |
| IMPS\_MODE\_FAIL | Bank | IMPS mode not supported for the beneficiary |
| RTGS\_MODE\_FAIL | Bank | RTGS mode not supported (only for RTGS) |
| REINITIALIZE\_TRANSFER\_LATER | Bank | Technical error at the bank, retry later |
| NRE\_ACCOUNT\_FAIL | Customer | Customer bank account is an NRE account |
| ACCOUNT\_BLOCKED | Customer | Customer bank account is blocked |
| DEST\_LIMIT\_REACHED | Bank | Transfer limit to beneficiary exceeded |
| INVALID\_MODE\_FAIL | Bank | Transfer mode not valid for beneficiary |
| NPCI\_UNAVAILABLE | Bank | NPCI in unavailable |
| BENEFICIARY\_BANK\_OFFLINE | Bank | Beneficiary bank is offline |
| INVALID\_AMOUNT\_FAIL | Vendor | Amount is invalid for the given transfer mode |
| SUSPECTED\_TRANSFER | Customer | Suspicious transfer identified |
| BENE\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| DISABLED\_MODE | Vendor | Transfer mode not enabled for the account |
| AMAZON\_AMOUNT\_EXCEED | Vendor | Amount should be less than 10000 for Amazon Pay mode |
| BENEFICIARY\_BLACKLISTED | Vendor | Beneficiary is blacklisted |
| PAYOUT\_INACTIVE | Vendor | Payout account is not active |
| INVALID\_TRANSFER\_AMOUNT | Vendor | Transfer amount is invalid |
| BENEFICIARY\_NOT\_EXIST | Vendor | Beneficiary does not exist |
| BENEFICIARY\_INVALID\_MODE | Vendor | Mode Not valid for Beneficiary |
| INVALID\_BENE\_ACCOUNT\_OR\_IFSC | Vendor | Invalid bank account number or ifsc provided |
| BENEFICIARY\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records |
| ANY\_OTHER\_REASON | Bank | No reason provided for the failure/reversal |
| INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Customer | Invalid account |
***
## Signature verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
Watch this video to learn more on Vendor Webhooks:
# Vendor Status Change Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/split/webhooks/vendor-status-change-webhooks
This chapter explains the vendor status change webhook.
Configure vendor status change webhooks to receive automated notifications when vendor status is changed.
The webhook notifications are sent on all the URLs added and enabled in the vendor status change webhook. You can add new URLs and enable or disable existing URLs for vendor status change webhook at any time and it will reflect instantaneously.
The table below lists the webhook events available for vendor status change.
| Webhook Event | Description |
| :- | :- |
| VENDOR\_STATUS\_UPDATE | This webhook will be triggered whenever there is a change in the status of the vendor. |
# Vendor Status Update
```javascript 2025-01-01 theme={"dark"}
{
"data": {
"merchant_id": 152707,
"merchant_vendor_id": "status002",
"email": "[john.doe@cashfree.com]()",
"updated_status": "ACTION_REQUIRED",
"past_status": "IN_BENE_CREATION",
"account_holder": "JOHN DOE",
"phone": "9876554927",
"name": "BOB HOPE",
"product_type": "PG",
"max_split": 100,
"account_number": null,
"ifsc": null,
"dashboard_access": false,
"vpa": "success@upi",
"account_type": "Individual",
"business_type": "Travel and Hospitality",
"updated_by": "AUTOMATED",
"document_status": {
"PAN": "VERIFIED",
"GSTIN": "DUE_CURRENTLY"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_STATUS_UPDATE"
}
```
```javascript Version 2023-08-01 theme={"dark"}
{
"data": {
"merchant_id": 152707,
"merchant_vendor_id": "status002",
"email": "[john.doe@cashfree.com]()",
"updated_status": "ACTION_REQUIRED",
"past_status": "IN_BENE_CREATION",
"account_holder": "JOHN DOE",
"phone": "9876554927",
"name": "BOB HOPE",
"product_type": "PG",
"max_split": 100,
"account_number": null,
"ifsc": null,
"dashboard_access": false,
"vpa": "success@upi",
"account_type": "Individual",
"business_type": "Travel and Hospitality",
"updated_by": "AUTOMATED",
"document_status": {
"PAN": "VERIFIED",
"GSTIN": "DUE_CURRENTLY"
}
},
"event_time": "2023-06-08T15:10:37+05:30",
"type": "VENDOR_STATUS_UPDATE"
}
```
***
# Payload Field Description
| Field | Description | Example |
| - | - | - |
| merchant\_id | Cashfree Merchant ID. | 152707 |
| merchant\_vendor\_id | Reference ID as shared by you when onboarding the vendor. | IS\_1hour\_Upi |
| email | Email of the vendor. | [test@gmail.com](mailto:test@gmail.com) |
| updated\_status | Current status of the vendor. | ACTIVE |
| past\_status | Previous status of the vendor. | ACTION\_REQUIRED |
| account\_holder | Name of the account holder associated with the vendor. | John Doe |
| phone | Contact phone number of the vendor. | 9876554927 |
| name | Name of the vendor. | BOB HOPE |
| product\_type | Type of product offered to the vendor | PG |
| max\_split | The maximum percentage of the amount shared with a vendor in any order. | 100 |
| account\_number | Vendor's bank account number. | 12345678909 |
| ifsc | IFSC (Indian Financial System Code) associated with the vendor's bank. | SBIN1231935 |
| dashboard\_access | Access level to the dashboard for the vendor (if applicable). | FALSE |
| vpa | VPA of the vendor for UPI transactions. | success\@upi |
| account\_type | Type of the vendor's account. | Individual |
| business\_type | Type of business conducted by the vendor. | Travel and Hospitality |
| updated\_by | Entity or process that initiated the status update. | AUTOMATED |
| document\_status | Status of any associated documents for the vendor. | "PAN": "VERIFIED" "GSTIN": "DUE\_CURRENTLY" |
***
# Signature Verification
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree PG secret key along with the payload.
timestamp is present in the header x-webhook-timestamp\
Actual signature is present in the header x-webhook-signature
```
"headers": {
"host": "gamma.cashfree.com",
"x-request-id": "ad4dc1e65f8901302455b247237a667a",
"x-real-ip": "172.0.57.13",
"x-forwarded-for": "172.0.57.13",
"x-forwarded-host": "gamma.cashfree.com",
"x-forwarded-port": "80",
"x-forwarded-proto": "http",
"x-forwarded-scheme": "http",
"x-scheme": "http",
"x-original-forwarded-for": "52.66.25.127",
"content-length": "592",
"accept": "_/_",
"content-type": "application/json",
"user-agent": "ReactorNetty/1.0.30",
"x-datadog-parent-id": "4281924148563621550",
"x-datadog-sampling-priority": "1",
"x-datadog-trace-id": "228569355002181270",
"x-webhook-signature": "Xm0YzEJCRsh0XvIEK12D4FqpmC60cReKoqPBn424kV0=",
"x-webhook-timestamp": "1686217237543",
"x-webhook-version": "2022-09-01"
}
```
Watch this video to learn more on Vendor Webhooks
# End Points
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/endpoints
Find the Cashfree Subscriptions API base URLs for test and production environments (v2025-01-01), plus supported API versions and key usage.
Cashfree uses API keys to control access to the API. After you sign up on the merchant site, you'll receive your `AppId` and `SecretKey`.
Include your API key in all requests to the server. Use the endpoint **`/api/v1/credentials/verify`** to verify your credentials.
All API responses are in JSON format. POST requests must include the header `Content-Type: application/json`.
| Environment | Base URL |
| - | - |
| Test | `https://sandbox.cashfree.com/pg` |
| Production | `https://api.cashfree.com/pg` |
| Latest version | v5, 2025-01-01 Previous versions: 2023-08-01, 2021-05-21, 2022-01-01, 2022-09-01 |
# Error Codes and Reasons
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/error-codes
Learn more about subscription error codes, failure reasons, and their resolutions
## Error codes
The following are the common error codes returned by the Subscription APIs:
| Error Code | Description | Resolution |
| - | - | - |
| `subscription_id_missing` | Subscription ID is required but missing in the request | Ensure the subscription ID is included in your API request |
| `plan_id_missing` | Plan ID is missing, invalid, or not found | Verify the plan ID exists and is correctly specified |
| `payment_id_missing` | Payment ID is missing or not found | Include a valid payment ID in your request |
| `subscription_id_missing_request_failed_failed` | Subscription ID missing; request failed | Add the required subscription ID parameter |
| `invalid_payment_type` | Invalid payment type specified | Use supported payment types: 'E\_MANDATE', 'UPI', or 'CARD' |
| `subscription_does_not_exist` | Subscription doesn't exist for the provided reference ID | Verify the subscription reference ID is correct |
| `authorization_payment_info_mismatch` | Authorization payment info doesn't match subscription creation info | Ensure payment details match between subscription creation and authorization |
| `tpv_not_supported` | TPV currently not allowed for Intent and QR auth flow | Use alternative auth flows when TPV is enabled |
## Transaction failure reasons
The following are the detailed failure reasons categorised by their nature:
* [Account issues](#account-issues)
* [Balance and limit issues](#balance-and-limit-issues)
* [Mandate issues](#mandate-issues)
* [Fraud and security](#fraud-and-security)
* [Technical issues](#technical-issues)
* [Customer action required](#customer-action-required)
* [Invalid data and validation](#invalid-data-and-validation)
* [Know your customer and documentation](#know-your-customer-and-documentation)
* [System and processing status](#system-and-processing-status)
* [Notification issues](#notification-issues)
### Account issues
The following are the account-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `ACCOUNT CLOSED` | The account has been closed and all associated mandates were deactivated | Create a new mandate with a different account for the customer |
| `Account Blocked or frozen` | Account is temporarily blocked (for example, KYC not updated) | Customer needs to contact their bank to unblock the account |
| `DEBIT HAS BEEN FAILED \| ACCOUNT DOES NOT EXIST (REMITTER)` | Account verification failed due to incorrect account details | Verify and update correct account information |
| `Not a CBS act no.or old act no.representwithCBS no` | Account given for debit is old/non CBS/wrong/invalid | Use a valid CBS-enabled account number |
| `DEBIT HAS BEEN FAILED \| REMITTER CBS OFFLINE` | Core Banking System is offline | Wait for CBS to come online and retry |
| `U30\|DEBIT HAS BEEN FAILED\|YE\|REMITTING ACCOUNT BLOCKED/FROZEN` | Remitting account is blocked or frozen | Customer should contact their bank to resolve account issues |
### Balance and limit issues
The following are the balance and limit-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Balance Insufficient` | Insufficient funds in customer account | Customer should add funds or retry when balance is available |
| `DEBIT HAS BEEN FAILED \| INSUFFICIENT FUNDS IN CUSTOMER (REMITTER) ACCOUNT` | Insufficient balance in customer account | Recommend customer to maintain sufficient balance before retry |
| `U30\|DEBIT HAS BEEN FAILED\|Z9\|INSUFFICIENT FUNDS IN CUSTOMER (REMITTER) ACCOUNT` | Insufficient funds in remitter account | Customer needs to ensure adequate balance |
| `Amount Exceeds E-mandate Limit` | Transaction amount exceeds the e-mandate limit | Reduce amount or increase mandate limit if supported |
| `DEBIT HAS BEEN FAILED \| PER TRANSACTION LIMIT EXCEEDED AS SET BY REMITTING MEMBER` | Per transaction limit exceeded | Use amount within the set transaction limits |
| `U29\|ADDRESS RESOLUTION IS FAILED\|QL\|MANDATE DEBIT IS BEYOND PSP SPECIFIED AMOUNT CAP` | Amount limit is breached | Ensure amount is within PSP specified limits |
| `DEBIT HAS BEEN FAILED \| MANDATE REQUEST LIMIT HAS BREACHED` | Mandate request limit has been breached | Wait for limit reset or contact support |
| `U30\|DEBIT HAS BEEN FAILED\|QK\|MANDATE REQUEST LIMIT HAS BREACHED` | Mandate request limit exceeded | Review and adjust mandate limits |
| `Not Arranged For` | Bank account isn't set up to facilitate debit transaction | Customer should contact bank to set up debit facility |
### Mandate issues
The following are the mandate-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Invalid UMRN or Inactive Mandate` | Mandate has been deactivated by NPCI or cancelled by customer/merchant | Create a new mandate for the customer |
| `Mandate Cancelled` | Mandate has been cancelled by customer or merchant | Create a new mandate to continue debits |
| `Record Level Error: Invalid Mandate Info` | Mandate cancelled by customer from bank | Create a new mandate with updated information |
| `DEBIT HAS BEEN FAILED \| MANDATE HAS BEEN REVOKED` | Mandate has been revoked | Create a new mandate for the customer |
| `DEBIT HAS BEEN FAILED \| MANDATE SIGNATURE IS TAMPERED OR CORRUPT (REMITTER)` | Mandate signature is corrupted | Customer should contact issuing bank |
| `DUPLICATE MANDATE REQUEST FOR SAME ITEM` | Duplicate mandate request submitted | Avoid duplicate requests or check existing mandates |
| `Mandate Qr tampered` | Mandate QR code has been tampered with | Generate a new mandate with fresh QR code |
| `U29\|ADDRESS RESOLUTION IS FAILED\|QB\|MANDATE IS ALREADY HONOURED` | Duplicate transaction attempt | Ensure transaction isn't a duplicate of a previously successful one |
| `Invalid frequency` | Invalid frequency specified for LOAN category | Use appropriate frequency as per NPCI guidelines |
### Fraud and security
The following are the fraud and security-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `DEBIT HAS BEEN FAILED \| SUSPECTED FRAUD` | Transaction flagged as suspected fraud | Customer should contact their bank for clearance |
| `U30\|DEBIT HAS BEEN FAILED\|K1\|SUSPECTED FRAUD, DECLINE / TRANSACTIONS DECLINED BASED ON RISK SCORE BY REMITTER` | Risk-based decline by remitter bank | Customer may retry or contact bank |
| `ADDRESS RESOLUTION IS FAILED \| TRANSACTION CANNOT BE COMPLETED. COMPLIANCE VIOLATION (REMITTER)` | Compliance violation detected | Ensure transaction complies with regulatory requirements |
| `DEBIT HAS BEEN FAILED \| DO NOT HONOUR (REMITTER)` | Debit transaction rejected by issuing bank | Customer should contact their bank |
### Technical issues
The following are the technical error codes:
| Error | Description | Resolution |
| - | - | - |
| `REMITTER BANK NOT AVAILABLE` | Remitter bank system is unavailable | Retry the transaction after some time |
| `DEBIT TIMEOUT \| REMITTER/ISSUER UNAVAILABLE (TIMEOUT)` | Bank system timeout occurred | Retry the transaction when bank systems are stable |
| `U67\|DEBIT TIMEOUT\|UT\|REMITTER/ISSUER UNAVAILABLE (TIMEOUT)` | Timeout from remitter or issuer | Retry during stable network conditions |
| `REMITTER BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | Bank system experiencing high traffic or technical issues | Retry during off-peak hours |
| `U90\|REMITTER BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | High response time from remitter bank | Retry when bank systems are more responsive |
| `U91\|BENEFICIARY BANK DEEMED HIGH RESPONSE TIME CHECK DECLINE` | Beneficiary bank system issues | Retry when bank systems are stable |
| `No response received from bank within the prescribed API time limit` | Bank API timeout | Retry the transaction |
| `ADD_RESLN_DISPATCH_FAILED` | Address resolution dispatch failure | Contact support for technical assistance |
### Customer action required
The following are the error codes that require customer action:
| Error | Description | Resolution |
| - | - | - |
| `No action performed by customer` | Customer didn't complete the authorization process | Customer needs to complete the payment flow |
| `COLLECT EXPIRED` | Customer didn't complete auth after entering VPA | Customer should complete the transaction within time limit |
| `RESPMANDATE TIMEOUT AT REMITTER END` | Customer didn't honor the mandate within time | Customer should respond to mandate requests |
| `RESPMANDATE DECLINED BY REMITTER BANK` | Remitter bank declined the mandate | Customer should contact their bank |
| `RESPAUTHMANDATE EXPIRED` | No action performed on collect request and it expired | Customer should complete authorization within time limit |
| `RESPAUTHMANDATE DECLINED BY PSP` | PSP declined the authorization mandate | Contact support for assistance |
| `Transaction Open Status` | Customer closed transaction page before completion or retried failed transaction | Complete the transaction without closing the page |
| `No Details available for Requested MandateReqID` | Customer cancelled mandate before reaching NPCI page | Reinitiate the mandate creation process |
### Invalid data and validation
The following are the data validation error codes:
| Error | Description | Resolution |
| - | - | - |
| `U29\|ADDRESS RESOLUTION IS FAILED\|ZH\|INVALID VIRTUAL ADDRESS` | Invalid VPA used in transaction | Use a valid and verified VPA |
| `ADDRESS RESOLUTION IS FAILED \| INVALID VIRTUAL ADDRESS` | Invalid Virtual Address during VPA validation | Verify and use correct VPA |
| `DEBIT HAS BEEN FAILED \| INVALID TRANSACTION OR IF MEMBER IS NOT ABLE TO FIND ANY APPROPRIATE RESPONSE CODE (REMITTER)` | Invalid transaction or unrecognized response | Retry with valid transaction details |
| `U30\|DEBIT HAS BEEN FAILED\|XB\|INVALID TRANSACTION OR IF MEMBER IS NOT ABLE TO FIND ANY APPROPRIATE RESPONSE CODE (REMITTER)` | Invalid transaction from remitter | Verify transaction details and retry |
| `DEBIT HAS BEEN FAILED \| INVALID RESPONSE CODE` | Invalid response received from bank | Retry the transaction |
| `U30\|DEBIT HAS BEEN FAILED\|XD\|INVALID AMOUNT (REMITTER)` | Invalid amount specified | Use valid amount format and value |
| `DEBIT HAS BEEN FAILED \| RegIdDetails must be present` | Required registration details missing | Ensure all required details are provided |
| `U30\|DEBIT HAS BEEN FAILED\|V1\|RegIdDetails must be present` | Registration details missing | Include all required registration information |
| `DEBIT HAS BEEN FAILED \| Id name must be present` | Required ID name field missing | Include the ID name field in the request |
### Know your customer and documentation
The following are the KYC and documentation-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Aadhaar number does not have mobile number registered with uidai` | Mobile number not linked with Aadhaar | Customer should link mobile number with Aadhaar |
| `Payer Account Validation Failure` | TPV verification failed | Ensure correct account details for TPV verification |
### System and processing status
The following are the system and processing status error codes:
| Error | Description | Resolution |
| - | - | - |
| `Internal Payment Failed` | Internal system error during payment processing | Retry the transaction or contact support |
| `Charge couldn't happen on time` | Previous charge was in progress, preventing next charge | Wait for previous charge to complete |
| `Previous request in progress` | Previous request for same action is still being processed | Wait for previous request to complete before retrying |
| `debit has been failed` | Bank didn't send any failure reason | Check with bank for specific failure details |
### Notification issues
The following are the notification-related error codes:
| Error | Description | Resolution |
| - | - | - |
| `Notification couldn't be sent to the customer` | Pre-debit notification failed to send | Ensure customer contact details are correct |
| `DEBIT HAS BEEN FAILED \| Unable to Notify the Customer` | Pre-debit notification delivery failed | Update customer contact information |
## Error response structure
Subscription API errors follow this structure:
```json theme={"dark"}
{
"status": "ERROR",
"subCode": "400",
"message": "Error description",
"reason": "Detailed error reason"
}
```
## Best practices for error handling
The following are the recommended practices for handling subscription errors:
**Implement retry logic**:
* For timeout and temporary errors, implement exponential backoff retry logic.
* Start with a 1-second delay, double the delay for each subsequent retry.
* Use a maximum of 3-5 retry attempts.
* Apply different retry strategies for different error types.
**Customer communication**:
* Provide clear, actionable error messages to customers.
* Include specific steps they need to take for resolution.
* Avoid technical jargon in customer-facing messages.
**Mandate management**:
* Monitor mandate status.
* Proactively create new mandates when existing ones are cancelled or expired.
* Implement mandate renewal work flows before expiration.
**Balance monitoring**:
* Advise customers to maintain sufficient balance before scheduled debits.
* Send pre-debit notifications to remind customers.
* Implement balance check APIs where available.
**Error logging and monitoring**:
* Log all errors with timestamps and request details.
* Set up alerts for critical error patterns.
* Analyse error trends to identify systemic issues.
**Graceful degradation**:
* Provide alternative payment methods when subscription payment fails.
* Implement fallback mechanisms for critical payment flows.
* Maintain service availability despite individual payment failures.
**Security considerations**:
* Handle fraud-related errors with additional verification steps.
* Implement risk scoring for suspicious transaction patterns.
* Maintain compliance with regulatory requirements.
For additional API error codes and web hook error structures, refer to the [Payment Errors documentation](/docs/api-reference/payments/errors).
# Create Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/create
openapi/payments/v2025-01-01.yaml post /subscriptions
Use this API to create a new subscription.
# Fetch Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/fetch
openapi/payments/v2025-01-01.yaml get /subscriptions/{subscription_id}
Use this API to fetch subscription details.
# Generate Transaction Return Summary
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/generate-transaction-summary
openapi/payments/v2025-01-01.yaml post /subscriptions/charge/{payment_id}/transaction-return-summary/generate
Use this API to generate transaction return summary for failed transactions (insufficient balance).
# Manage Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/manage
openapi/payments/v2025-01-01.yaml post /subscriptions/{subscription_id}/manage
Use this API to manage subscriptions. You can cancel, pause, activate, or change the plan associated with a subscription.
To update the recurring amount for a periodic subscription: 1. Create a new plan with the revised amount. 2. Use the Manage Subscription API to associate the subscription with the new plan. 3. Include the `CHANGE_PLAN` action and the new `plan_id` in the request body.
* Customers won't be notified about plan changes. The charge amount can't exceed the maximum amount defined in the original plan.
* The `CHANGE_PLAN` and `PAUSE` actions aren't supported for On-Demand Subscriptions.
# Get All the Payment Method Details Available for Subscription Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/payment-methods
openapi/payments/v2025-01-01.yaml post /subscriptions/eligibility/payment_methods
Use this API to check if a payment method is enabled for your account.
# Upload file for Physical Nach Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/physical-nach-mandate
openapi/payments/v2025-01-01.yaml post /subscriptions/pay/documents/{payment_id}
Use this API to upload file for Physical Nach Authorization.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/overview
Learn details about subscription APIs to manage recurring payments, mandates, and payment schedules.
The Subscription APIs provide RESTful endpoints for managing recurring payments, customer mandates, and automated billing schedules. These APIs support both sandbox testing and production environments with consistent authentication and error handling across all endpoints. Real-time webhooks ensure seamless integration for subscription lifecycle events, payment notifications, and mandate status updates.
## API endpoints
| Environment | Base URL |
| :- | :- |
| Test | [https://sandbox.cashfree.com/pg](https://sandbox.cashfree.com/pg) |
| Production | [https://api.cashfree.com/pg](https://api.cashfree.com/pg) |
| Latest version | v5, 2025-01-01 |
## Authentication
All Subscription APIs require authentication. Refer to the [Authentication](/docs/api-reference/authentication) guide for detailed information on API authentication for merchants and partners.
## Subscription APIs
Retrieve refund details and status using refund ID or payment ID.
## Supported payment methods
Cashfree Subscriptions supports the following payment methods for recurring payments:
* **Bank account (e-Mandate)**: Net banking, debit card, or Aadhaar-based authorization with up to ₹1,00,00,000 mandate amount
* **Bank account (Physical mandate)**: Signature-based NACH mandate for accounts without digital access
* **UPI Autopay**: Recurring payments via UPI applications with ₹15,000-₹1,00,000 limits based on authentication
* **Standing Instructions (SI) on cards**: Credit or debit cards (Indian and International) with flexible amount limits
For detailed payment method information, refer to the [Supported Payment Methods](/docs/payments/subscription/payment-modes) guide.
## Getting started
Complete the following steps to set up subscriptions using Cashfree APIs:
1. **Create a Plan** (optional): Define your subscription terms including billing frequency and amount
2. **Create a Subscription**: Set up a mandate with customer details and payment method
3. **Customer Authorization**: Customer authorizes the recurring payment through their chosen method
4. **Raise Payments**: Initiate recurring charges as per the subscription schedule
5. **Manage Subscriptions**: Update subscription status, handle payment retries, and process refunds
For a comprehensive integration guide, visit the [Subscription Introduction](/docs/payments/subscription/introduction) page.
# Create Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/create-controlled-execution
openapi/payments/v2025-01-01.yaml post /subscriptions/pay/controlled/execute-mandate
Use this API to create a controlled charge execution for an on-demand subscription mandate after a successful notification.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.The debit amount cannot change after the pre-debit notification (PDN) is initiated. If the executed debit amount differs from the amount notified in the PDN, the transaction is declined by the issuing bank due to the amount-match logic enforced at the issuing bank.
# Create Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/create-controlled-notification
openapi/payments/v2025-01-01.yaml post /subscriptions/pay/controlled/notify-mandate
Use this API to initiate a controlled payment notification (PDN) for an on-demand subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-execution
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}
Use this API to fetch the details of a controlled execution for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Executions
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-executions
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions
Use this API to fetch all controlled payment executions for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-notification
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}
Use this API to fetch the details of a controlled payment notification for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Notifications
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-notifications
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications
Use this API to fetch all controlled payment notifications for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Controlled Subscription Payments
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/overview
Drive pre-debit notification and charge execution yourself with the controlled subscription payment APIs for UPI Autopay and card mandates.
The controlled payment flow for UPI Autopay and card mandate subscriptions gives you explicit control over when to notify your customers and when to execute the debit. This is a significant change if you need to comply with pre-debit notification rules for UPI Autopay and card mandates.
The controlled flow supports UPI Autopay and card mandates. eNACH and Physical NACH (PNACH) mandates are not supported.
## How it works
The controlled flow replaces the automatic charge trigger with a two-step process you drive:
1. **Send a pre-debit notification**: Notify your customer of the upcoming charge amount before the debit window opens.
2. **Execute the charge**: Trigger the mandate debit after the compliance window elapses. The debit amount must exactly match the notified amount; a mismatch causes the issuing bank to decline the transaction.
Controlled charging is a two-step flow in which you send the pre-debit notification and trigger the debit. Cashfree does not automatically retry a failed attempt. You must trigger each attempt yourself.
## API endpoints
The following endpoints support the controlled notification and execution flow:
| API | Method | Description |
| - | - | - |
| [Create Controlled Notification](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/create-controlled-notification) | `POST /subscriptions/pay/controlled/notify-mandate` | Send a pre-debit notification to the customer |
| [Fetch Controlled Notification](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-notification) | `GET /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}` | Retrieve a single notification |
| [Fetch All Controlled Notifications](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-notifications) | `GET /subscriptions/payments/{payment_id}/controlled/notifications` | List all notifications for a payment |
| [Create Controlled Execution](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/create-controlled-execution) | `POST /subscriptions/pay/controlled/execute-mandate` | Trigger the mandate debit after the notification window |
| [Fetch Controlled Execution](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-execution) | `GET /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}` | Retrieve a single execution |
| [Fetch All Controlled Executions](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/controlled/fetch-controlled-executions) | `GET /subscriptions/payments/{payment_id}/controlled/executions` | List all execution attempts for a payment |
For UPI Autopay mandates, NPCI enforces blackout windows during which attempts are rejected. When this happens, the error response tells you the next permitted timestamp. Use this timestamp to schedule your next attempt instead of retrying immediately.
## Webhooks
Subscribe to both events rather than polling:
* [`SUBSCRIPTION_CONTROLLED_NOTIFICATION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_notification_status): A notification attempt reached a terminal state.
* [`SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_execution_status): A charge attempt reached a terminal state.
# Create Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/create-controlled-execution
openapi/payments/v2025-01-01.yaml post /subscriptions/pay/controlled/execute-mandate
Use this API to create a controlled charge execution for an on-demand subscription mandate after a successful notification.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.The debit amount cannot change after the pre-debit notification (PDN) is initiated. If the executed debit amount differs from the amount notified in the PDN, the transaction is declined by the issuing bank due to the amount-match logic enforced at the issuing bank.
# Create Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/create-controlled-notification
openapi/payments/v2025-01-01.yaml post /subscriptions/pay/controlled/notify-mandate
Use this API to initiate a controlled payment notification (PDN) for an on-demand subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Details of a Single Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch
openapi/payments/v2025-01-01.yaml get /subscriptions/{subscription_id}/payments/{payment_id}
Use this API to fetch details of a single payment of a subscription.
# Fetch Controlled Execution
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch-controlled-execution
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions/{execution_id}
Use this API to fetch the details of a controlled execution for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Executions
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch-controlled-executions
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/executions
Use this API to fetch all controlled payment executions for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Controlled Notification
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch-controlled-notification
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications/{notification_id}
Use this API to fetch the details of a controlled payment notification for a subscription mandate.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch All Controlled Notifications
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch-controlled-notifications
openapi/payments/v2025-01-01.yaml get /subscriptions/payments/{payment_id}/controlled/notifications
Use this API to fetch all controlled payment notifications for a subscription payment.
This API supports UPI mandates only. eNACH and Physical NACH (PNACH) mandates are not supported. Card support is planned for a future release.
# Fetch Details of All Payments of a Subscription
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/fetch-payments-for-mandate
openapi/payments/v2025-01-01.yaml get /subscriptions/{subscription_id}/payments
Use this API to fetch all payments of a subscription.
# Manage a Single Payment
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/manage
openapi/payments/v2025-01-01.yaml post /subscriptions/{subscription_id}/payments/{payment_id}/manage
Use this API to manage a payment of a subscription. A payment can be cancelled or retried with this API.
# Raise a Charge or Create an Auth
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/raise
openapi/payments/v2025-01-01.yaml post /subscriptions/pay
Use this API to create an auth or to raise a charge.
In the sandbox environment, authorisation-related responses for eNACH, card, and UPI differ from those in production.
You must generate the URL in production by concatenating it with the payload data in JSON format. The following are example responses for all Seamless Auth modes in the production environment.
```
{
"action": "custom",
"cf_payment_id": "39394805",
"channel": "link",
"data": {
"url": "https://centinelapi.cardinalcommerce.com/V2/Cruise/StepUp",
"payload": {
"JWT": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI4MjcxZmJlMS1mOTU5LTQwMTgtOTc1OC01MzZkMWRkNzM2NjIiLCJpYXQiOjE3NDc2NDI4NjIsImlzcyI6IjYxNDIwNjg4OTMzODI1Njc1MDg0ZGI2ZiIsImV4cCI6MTc0NzY0NjQ2MiwiT3JnVW5pdElkIjoiNjRkNjA3ZGFmZjUzNDk2MWYxNjk0YWZjIiwiUGF5bG9hZCI6eyJBQ1NVcmwiOiJodHRwczovL3NlY3VyZWljaWNpLWNyMS5pY2ljaWJhbmsuY29tL3YxL2Fjcy9zZXJ2aWNlcy9icm93c2VyL2NyZXEvTC84MTEyLzMzNzAxNTBlLTM0OGEtMTFmMC05NTliLTJiYjZmODk2ZjIzOCIsIlBheWxvYWQiOiJleUp0WlhOellXZGxWSGx3WlNJNklrTlNaWEVpTENKdFpYTnpZV2RsVm1WeWMybHZiaUk2SWpJdU1pNHdJaXdpZEdoeVpXVkVVMU5sY25abGNsUnlZVzV6U1VRaU9pSTRZV1ZtT1RCaU15MW1ZakU0TFRRME5qa3RPREF3TVMwMk1tVm1ZakEwWW1RMk56TWlMQ0poWTNOVWNtRnVjMGxFSWpvaU16TTNNREUxTUdVdE16UTRZUzB4TVdZd0xUazFPV0l0TW1KaU5tWTRPVFptTWpNNElpd2lZMmhoYkd4bGJtZGxWMmx1Wkc5M1UybDZaU0k2SWpBeUluMCIsIlRyYW5zYWN0aW9uSWQiOiJUNGVtNEdidnBubGwzQWViakNKMSJ9LCJPYmplY3RpZnlQYXlsb2FkIjp0cnVlLCJSZXR1cm5VcmwiOiJodHRwczovL3d3dy5jYXNoZnJlZS5jb20vc3Vic2NyaXB0aW9uL2NhcmRfcmV0dXJuLzE1MTk5NzA3P3NiY2RhdGE9bHM5SmlOMUl6VUlKaU9pY0diaEpDTGlRMVZLSmlPaUFYZTBKeWUualY5MTNOd2NUTzVFVE54b2pJa2xFYTBWWFlpc25PaXdrVVY5bFRTVkZWRkoxWEhCMVhJUlZWQkp5ZS5CM2txOWhMeXdvY2hlV1U3QV9yT2tmQ2tTVl9TUEw3NzZxcl9mVHY2RG85MmwifQ.BeWYE8vslkOLZVWJd4mJ4MU1eu682fpp2Va7IvzdL9U",
"MD": "3881717951"
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 1,
"payment_currency": "INR",
"payment_id": "test12343234887",
"payment_method": "card",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "jd-rupay-test106"
}
```
```
{
"action": "custom",
"cf_payment_id": "39394843",
"channel": "link",
"data": {
"url": "https://enach.npci.org.in/onmags/sendRequest",
"payload": {
"AuthMode": "NetBanking",
"BankID": "ICIC",
"CheckSumVal": "Ril5otPjBl/Y44z3a0HAsSce2NlDqO1iEpP3pIBuKGYJplXVLuIQ1azxNB2aSJkx7...",
"MandateReqDoc": "..."
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 1,
"payment_currency": "INR",
"payment_id": "test12343234888",
"payment_method": "enach",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "jd-enach-test107"
}
```
```
{
"action": "custom",
"cf_payment_id": "40756575",
"channel": "link",
"data": {
"url": "https://payments.cashfree.com/subscriptions/checkout/timer",
"payload": {
"paymentType": "UPI",
"upiIntentData": {
"androidAuthAppLinks": {
"AMAZONPAY": "intent://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=in.amazon.mShop.android.shopping;end",
"BHIM": "intent://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=in.org.npci.upiapp;end",
"DEFAULT": "upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"GPAY": "gpay://upi/mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=com.google.android.apps.nbu.paisa.user;end",
"PAYTM": "paytmmp://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=net.one97.paytm;end",
"PHONEPE": "phonepe://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00#Intent;scheme=upi;package=com.phonepe.app;end"
},
"iosAuthAppLinks": {
"BHIM": "bhim://upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"GPAY": "tez://upi/mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"PAYTM": "paytmmp://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00",
"PHONEPE": "phonepe://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413545205666653&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00"
}
}
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 10,
"payment_id": "PAY-1749025491584-4289ae9a",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "custom",
"cf_payment_id": "40756761",
"channel": "collect",
"data": {
"url": "https://payments.cashfree.com/subscriptions/checkout/timer",
"payload": {
"paymentType": "UPI"
},
"content_type": "application/json",
"method": ""
},
"payment_amount": 10,
"payment_id": "PAY-1749025606422-791be52e",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "custom",
"cf_payment_id": "40757018",
"channel": "qrcode",
"data": {
"url": "",
"payload": {
"paymentType": "UPI",
"qrData": "upi://mandate?pa=branchautopay.cf@icici&pn=Branch&tr=EZM2025060413592105685824&am=10.00&cu=INR&orgid=400011&mc=7322&purpose=14&tn=Cashfree%20Payments&validitystart=04062025&validityend=04062055&amrule=MAX&recur=ASPRESENTED&rev=N&share=Y&block=N&txnType=CREATE&mode=13&fam=10.00"
},
"content_type": "application/json",
"method": "post"
},
"payment_amount": 10,
"payment_id": "PAY-1749025760541-4c158190",
"payment_method": "upi",
"payment_status": "PENDING",
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
```
{
"action": "post",
"cf_payment_id": "47720375",
"channel": "post",
"data": {
"url": "https://api.cashfree.com/pg/view/gateway/subscriptions/testkriti12upi12ANUG5689TFVNB357123",
"payload": null,
"content_type": "",
"method": null
},
"payment_amount": 0,
"payment_currency": "INR",
"payment_id": "PAY-1749025760541-4c158190",
"payment_method": "pnach",
"payment_status": "PENDING",
"payment_tags": null,
"payment_type": "AUTH",
"subscription_id": "SUB_TEST_1749025465390"
}
```
# Physical Mandates
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/physical-mandates
In this chapter, you will learn in detail about the APIs related to Physical Mandates.
Physical mandate is the process of authorization where the customer requires only his signature and bank account details. There is no requirement to have a Debit Card/Netbanking enabled to set up the mandate. Click [here](/docs/payments/subscription/payment-modes#bank-account-physical-mandate) to read more on Physical Mandates.
List of Physical Mandates APIs
| API Name | Description |
| :- | :- |
| [Create Subscription API](/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/create) | Use this API to create a subscription by providing a custom payment experience to your customers by specifying the plan ID and the customer details. You can also specify the bank account information when you create the subscription to ensure that mandates are created via the specified bank account only. Make sure to choose the payment mode as PNACH to enable Physical NACH flow. TPV is applicable only for eNACH and UPI. |
| [Create an Auth API](/docs/api-reference/payments/previous/v2025-01-01/subscription/payment/raise) | Use this API to create an authorization request for your customer. For Physical mandates (PNACH), you must include the payment\_method with "pnach" details in the request payload. Upon creation, the authorization status will be set to "DOCUMENT\_PENDING". To move the status to "INITIALIZED", use the Upload File API to upload the required documents. |
| [Upload File](/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/physical-nach-mandate) | Use this API to upload the Physical Nach registration forms that contain your customer’s bank account details and signature. Use the paymentId you get in the response in the "Create Auth API" and set action as "SUBMIT\_DOCUMENT". |
| [Simulate Payment api](/docs/api-reference/payments/previous/v2025-01-01/simulation/simulate-payment) | Use this API to update the authorisation status from INITIALIZED to either SUCCESS or FAILED. You must provide the payment\_id (obtained from the upload file API) along with the desired payment status. This functionality is available only in the test environment. |
# Create a Plan
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/plans/create
openapi/payments/v2025-01-01.yaml post /plans
A plan allows your customer to identify the features you offer along with your pricing. You can create plans as per the pricing you support for your services. For each plan, you can set a pre-decided frequency and amount with which they’ll be charged.
Example: Netflix Plans : Premium, Basic, Standard, Mobile. Each plan differs and caters for a particular set of audiences.
# Fetch Plan
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/plans/fetch
openapi/payments/v2025-01-01.yaml get /plans/{plan_id}
Use this API to fetch plan details.
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/rate-limits
This chapter explains the default rate limit applied by the Subscriptions APIs per minute.
The rate limit value shows the number of API calls that were made in a minute. For example, if the rate limit is 400 - it means you can call a maximum of 400 API calls in a minute.
**Rate Limits in Sandbox & Production:**\
We use rate limiting for all endpoints. Rate limiting is based on your IP and your account Id. By default, the following rate limits are applied per minute.
| API | Rate Limit Value Per Minute | Rate Limit Type |
| :- | :- | :- |
| [Create Plan](/docs/api-reference/payments/previous/v2025-01-01/subscription/plans/create) | 60 | Account |
| [Create Subscription](/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/create) | 60 | Account |
| [Create Seamless Subscription](/docs/api-reference/payments/previous/subscriptionsv1/seamless-apis/create-seamless-subscription-with-plan-id) | 60 | Account |
| [Get Subscription Details](/docs/api-reference/payments/previous/v2025-01-01/subscription/mandate/fetch) | 60 | Account |
| [Get All Subscription Payments](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-subscription-payments) | 60 | Account |
| [Get Single Subscription Payment](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-single-subscription-payment) | 60 | Account |
| [Cancel Charge](/docs/api-reference/payments/previous/subscriptionsv1/subscription/cancel-subscription) | 60 | Account |
| [Charge Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/charge-subscription) | 60 | Account |
| [Charge Retry](/docs/api-reference/payments/previous/subscriptionsv1/subscription/retry-subscription-charge) | 60 | Account |
| [Activate Subscription](/docs/api-reference/payments/previous/subscriptionsv1/subscription/activate-subscription) | 60 | Account |
| [Get Payment Details using Merchant Txn ID](/docs/api-reference/payments/previous/subscriptionsv1/subscription/fetch-payment-by-merchant-transaction-id) | 60 | Account |
| [Update Recurring-amount](/docs/api-reference/payments/previous/subscriptionsv1/subscription/update-recurring-amount) | 60 | Account |
# Redirection Payload After Authorisation
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/redirection-payload-after-authorization
When a subscription is created, a return URL is provided as part of the request. When the customer authorises the payment, they are redirected to this URL via a POST request containing the parameters listed below.
## Parameters
The POST request to the return URL includes the following parameters:
| Parameter | Type | Description |
| - | - | - |
| cf\_subReferenceId | Long | Unique numeric ID generated when the subscription was created. |
| cf\_subscriptionId | String | ID of the subscription. |
| cf\_authAmount | Float | The amount charged to authorise the subscription. |
| cf\_referenceId | Long | The reference ID or transaction ID of authorisation in PG. |
| cf\_status | String | Status of the subscription. In the returnUrl, the response should be `ACTIVE` or `BANK_APPROVAL_PENDING` if the authorisation was successful, or `INITIALIZED` if the authorisation failed. |
| cf\_message | String | A brief note about the payment. |
| signature | String | The hash of all parameters in the request generated using Secret Key. |
| cf\_umrn | String | The unique identifier associated with a mandate. Applicable if the payment mode is eMandate. |
| cf\_checkoutStatus | String | The subscription checkout status. The status can be `SUCCESS`, `FAILED`, `SUCCESS_DEBIT_PENDING`, or `SUCCESS_TOKENIZATION_PENDING`. |
| cf\_mode | String | The checkout payment mode. Modes: `NPCI_SBC`, `SBC_UPI`, `SBC_CREDIT_CARD`, `SBC_DEBIT_CARD`. |
| cf\_subscriptionPaymentId | String | The subscription payment ID. |
| cf\_umn | String | The unique identifier associated with a mandate. Applicable if the payment mode is **UPI**. |
## Sample Payload
Once the authorisation is complete, Cashfree will send a POST request to your `return_url` with the following payload:
```json theme={"dark"}
{
"cf_subReferenceId": 1234567,
"cf_subscriptionId": "sub_test_123",
"cf_authAmount": 1.00,
"cf_referenceId": 987654321,
"cf_status": "ACTIVE",
"cf_message": "Subscription authorised successfully",
"signature": "calculated_signature_here",
"cf_umrn": "UMRN1234567890",
"cf_checkoutStatus": "SUCCESS",
"cf_mode": "SBC_UPI",
"cf_subscriptionPaymentId": "pay_test_123",
"cf_umn": "UMN1234567890"
}
```
## Sample Code
Below are examples of how to receive and process the redirection payload in your backend.
```javascript Node.js theme={"dark"}
const express = require('express');
const app = express();
// Middleware to parse POST bodies
app.use(express.urlencoded({ extended: true }));
app.post('/return-url', (req, res) => {
const payload = req.body;
console.log('Received Redirection Payload:', payload);
const status = payload.cf_status;
if (status === 'ACTIVE' || status === 'BANK_APPROVAL_PENDING') {
// Handle success
res.send('Subscription Authorised Successfully');
} else {
// Handle failure
res.send('Authorization Failed');
}
});
```
```python Python theme={"dark"}
from flask import Flask, request
app = Flask(__name__)
@app.route('/return-url', methods=['POST'])
def return_url():
# Capture the POST payload
payload = request.form.to_dict()
print("Received Redirection Payload:", payload)
status = payload.get('cf_status')
if status in ['ACTIVE', 'BANK_APPROVAL_PENDING']:
return "Subscription Authorised Successfully", 200
else:
return "Authorisation Failed", 400
```
```java Java theme={"dark"}
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class SubscriptionController {
@PostMapping("/return-url")
public String handleRedirection(HttpServletRequest request) {
// Collect parameters from the POST request
Map parameterMap = request.getParameterMap();
String status = request.getParameter("cf_status");
if ("ACTIVE".equals(status) || "BANK_APPROVAL_PENDING".equals(status)) {
return "Subscription Authorised Successfully";
} else {
return "Authorisation Failed";
}
}
}
```
```go Go theme={"dark"}
package main
import (
"fmt"
"net/http"
)
func returnURLHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
// Parse the POST form
r.ParseForm()
status := r.FormValue("cf_status")
fmt.Printf("Subscription Status: %s\n", status)
if status == "ACTIVE" || status == "BANK_APPROVAL_PENDING" {
fmt.Fprint(w, "Subscription Authorised Successfully")
} else {
fmt.Fprint(w, "Authorisation Failed")
}
}
func main() {
http.HandleFunc("/return-url", returnURLHandler)
http.ListenAndServe(":8080", nil)
}
```
```php PHP theme={"dark"}
```
**Return URL**
* After the customer completes the checkout on the OTP page, they are redirected to your `return_url`. This redirection is link-based. For example, if you provide a `return_url` in the format `https://b8af79f41056.eu.ngrok.io?order_id={order_id}`, the customer is redirected to `https://b8af79f41056.eu.ngrok.io?order_id=order_271vfuhh1o4h6bQIigqyOx74YiJ1T`.
* In production, `cf_status` and `cf_message` may not be included in the `return_url` response, even though they are present in the sandbox.\
The `return_url` is intended only to redirect customers back to your site after payment. It should not be used to retrieve complete subscription details.
For accurate and complete data, use webhooks.
* Configure your webhook URL in the Cashfree Dashboard.
* Enable the relevant events, such as `SUBSCRIPTION_AUTH_STATUS` and `SUBSCRIPTION_PAYMENT_SUCCESS`.
Always validate the subscription status through webhook notifications for production-grade reliability.
# Create a Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/refund/create
openapi/payments/v2025-01-01.yaml post /subscriptions/{subscription_id}/refunds
This API allows you to create refund on a successful payment. Refund amount can be partial or the full amount of the payment.
# Fetch Details of a Refund
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/refund/fetch
openapi/payments/v2025-01-01.yaml get /subscriptions/{subscription_id}/refunds/{refund_id}
Use this API to fetch details of a refund of a subscription payment.
# Refund APIs Overview
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/refund/refund-apis-overview
In this section, you will learn about all the APIs related to subscription refunds.
# List of Subscription Refund APIs
| API Name | Description |
| :- | :- |
| [Create Refund](/docs/api-reference/payments/previous/v2025-01-01/subscription/refund/create) | Use this API to create a refund for the payment of a Subscription. |
| [Get Refund](/docs/api-reference/payments/previous/v2025-01-01/subscription/refund/fetch) | Use this API to fetch the status of the refund of a Subscription. |
# Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/subscription-postman-collection
Download Cashfree's subscription APIs Postman collection to get started with testing and integration.
Get started with Cashfree's subscription APIs by downloading the collection and importing it in Postman.
Download Cashfree subscription Postman collection
## Error codes and reasons
For comprehensive error codes, failure reasons, and troubleshooting guidance when working with subscription APIs, refer to the [Error codes and reasons](/docs/api-reference/payments/previous/v2025-01-01/subscription/error-codes) documentation.
# Subscription Webhooks
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks
Learn about the various Subscription webhooks sent by Cashfree
Below are the various events that can be sent to your webhook endpoint. These webhooks will be triggered if the merchant has integrated our newer Subscription API.
* If the merchant added the webhook under the 2025-01-01 version, they will receive the same version of the webhook for older subscriptions as well.
* While filling the UPI payment methods, `upi_instrument` and `upi_instrument_number` will remain empty for webhook versions before 2025. This will be implemented in later versions.
* While filling the UPI payment methods, `upi_payer_account_number` and `upi_payer_ifsc` will be applicable only for TPV customers who have passed TPV details while creating the subscription.
* [`SUBSCRIPTION_STATUS_CHANGED`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_status_changed)
* [`SUBSCRIPTION_AUTH_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_auth_status)
* [`SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_payment_notification_initiated)
* [`SUBSCRIPTION_PAYMENT_SUCCESS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_payment_success)
* [`SUBSCRIPTION_PAYMENT_FAILED`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_payment_failed)
* [`SUBSCRIPTION_PAYMENT_CANCELLED`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_payment_cancelled)
* [`SUBSCRIPTION_REFUND_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_refund_status)
* [`SUBSCRIPTION_CARD_EXPIRY_REMINDER`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_card_expiry_reminder)
* [`SUBSCRIPTION_CONTROLLED_NOTIFICATION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_notification_status)
* [`SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS`](/docs/api-reference/payments/previous/v2025-01-01/subscription/webhooks#subscription_controlled_execution_status)
Payment method object attributes:
```javascript UPI theme={"dark"}
"payment_method": {
"upi": {
"channel": "collect",
"upi_id": "8709228804@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
```
```javascript ENACH theme={"dark"}
"payment_method": {
"enach": {
"channel": "link",
"auth_mode": "aadhar",
"account_type": "",
"account_number": "",
"account_ifsc": "",
"account_holder_name": "",
"account_bank_code": ""
}
},
"payment_group": "enach"
```
```javascript PNACH theme={"dark"}
"payment_method": {
"pnach": {
"channel": "link",
"mandate_creation_date": "",
"mandate_start_date": "",
"account_type": "",
"account_number": "",
"account_ifsc": "",
"account_holder_name": "",
"account_bank_code": ""
}
},
"payment_group": "pnach"
```
```javascript Debit/Credit card theme={"dark"}
{
"payment_method": {
"card": {
"channel": null,
"card_number": "XXXXXXXXXXXX2123",
"card_network": "visa",
"card_type": "debit_card",
"card_sub_type": "R",
"card_country": "IN",
"card_bank_name": "KOTAK MAHINDRA BANK",
"card_network_reference_id": null,
"instrument_id": "8e9cc167-4fe2-4ece-be8d-c1b224e50a23"
}
},
"payment_group": "debit_card"
}
```
## SUBSCRIPTION\_STATUS\_CHANGED
Whenever a subscription is created it goes to initialised state and customer is expected to authorise it. The list of statuses where this webhook will get triggered are:
* ACTIVE
* ON\_HOLD
* COMPLETED
* CUSTOMER\_CANCELLED
* CUSTOMER\_PAUSED
* EXPIRED
* LINK\_EXPIRED
* BANK\_APPROVAL\_PENDING
* CANCELLED
* CARD\_EXPIRED
```javascript theme={"dark"}
{
"data": {
"subscription_details": {
"cf_subscription_id": "23639356",
"subscription_id": "mozuyYwUCbWEfJVVRLi",
"subscription_status": "BANK_APPROVAL_PENDING",
"subscription_expiry_time": "2055-08-07T10:30:46",
"subscription_first_charge_time": null,
"subscription_tags": null,
"next_schedule_date": null
},
"customer_details": {
"customer_name": null,
"customer_email": "john@dummy.com",
"customer_phone": "9900000000"
},
"plan_details": {
"plan_id": "mozuyYwUCbWEfJVVRLi",
"plan_name": "6Msuj2mttuf2F5P1FYVSet",
"plan_type": "ON_DEMAND",
"plan_max_cycles": 0,
"plan_recurring_amount": null,
"plan_max_amount": 399.00,
"plan_interval_type": null,
"plan_intervals": null,
"plan_currency": "INR",
"plan_note": null,
"plan_status": null
},
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "2025-09-06T10:30:47",
"authorization_reference": "6ba74ac2b047424da95591xxxxx[at]xxxx",
"authorization_time": "2025-08-07T10:31:36",
"authorization_status": "PENDING",
"payment_id": "49988270",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23639356",
"gateway_plan_id": "mozuyYwUCbWEfJVVRLi",
"gateway_auth_id": "6ba74ac2b047424da95591xxxxx[at]xxxx"
}
},
"event_time": "2025-08-07T10:31:35+05:30",
"type": "SUBSCRIPTION_STATUS_CHANGED"
}
```
```javascript theme={"dark"}
{
"data": {
"subscription_details": {
"cf_subscription_id": "123456",
"subscription_id": "Demo_Subscription",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2024-01-14T23:00:08+05:30",
"subscription_first_charge_time": "2024-01-10T23:00:08+05:30"
},
"customer_details": {
"customer_name": "john",
"customer_email": "john@dummy.com",
"customer_phone": "9900000000"
},
"plan_details": {
"plan_id": "plan12345",
"plan_name": "Plan Name",
"plan_type": "ON_DEMAND",
"plan_max_cycles": 10,
"plan_recurring_amount": 100.00,
"plan_max_amount": 1000.00,
"plan_currency": "INR",
"plan_note": "Note",
"plan_status": "ACTIVE"
},
"authorization_details": {
"authorizationAmount": 1.00,
"authorizationAmountRefund": true,
"approveByTime": "2025-09-06T16:44:48",
"authorizationReference": "544edde057f34ce588627axxxxx[at]xxxx",
"authorizationTime": "2025-08-07T16:46:06",
"authorizationStatus": "PENDING",
"paymentId": "50088288",
"paymentMethod": "upi",
"instrumentId": "xxxxx@xxxx"
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_plan_id": "plan12345",
"gateway_auth_id": "6595231908096894505959"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_STATUS_CHANGED"
}
```
## SUBSCRIPTION\_AUTH\_STATUS
The event is triggered when the checkout is completed by the customer for success and failed cases.
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"cf_payment_id": "49988825",
"cf_txn_id": "4213159266",
"cf_order_id": "4519691525",
"subscription_id": "mozth7smWGCCqPRaSv7",
"cf_subscription_id": "23639858",
"payment_type": "AUTH",
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "cce92d335be0467693c020xxxxx[at]xxxx",
"authorization_time": "2025-08-07T10:34:23+05:30",
"authorization_status": "FAILED",
"payment_id": "ab-SUBV2ODRFhdJuHlcQYyFw-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T10:33:56+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT HAS BEEN FAILED"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23639858",
"gateway_payment_id": "49988825"
}
},
"event_time": "2025-08-07T10:34:23+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200.75,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_AUTH_STATUS"
}
```
## SUBSCRIPTION\_PAYMENT\_NOTIFICATION\_INITIATED
This webhook is used to inform the merchant that we have sent a notification of payment to the customer.
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"cf_payment_id": "49970855",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "moziva9hyjiLtCuGN74",
"cf_subscription_id": "22390006",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "ab-SUBV2ODR683gV1CXF85ev-1",
"payment_method": null,
"payment_group": null
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-07T09:08:09+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22390006",
"gateway_payment_id": "49970855"
}
},
"event_time": "2025-08-07T09:51:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "PENDING",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "INITIALIZED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED"
}
```
## SUBSCRIPTION\_PAYMENT\_SUCCESS
This notification is sent whenever a successful payment is processed for an active subscription.
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"cf_payment_id": "49914526",
"cf_txn_id": "4212435861",
"cf_order_id": "4518936510",
"subscription_id": "moznV33AssPd6vXsSm2",
"cf_subscription_id": "23601811",
"payment_type": "AUTH",
"authorization_details": {
"authorization_amount": 2.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "427b608f83ad4cbdb6d472xxxxx[at]xxxx",
"authorization_time": "2025-08-07T05:53:22+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRc5Dl2meCr7Iui-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "8100000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 2.00,
"payment_currency": "INR",
"payment_schedule_date": "",
"payment_initiated_date": "2025-08-07T05:52:21+05:30",
"payment_remarks": "auth payment",
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23601811",
"gateway_payment_id": "49914526"
}
},
"event_time": "2025-08-07T05:53:21+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-20T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-20T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": null,
"payment_status": "SUCCESS",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_SUCCESS"
}
```
## SUBSCRIPTION\_PAYMENT\_FAILED
This notification is sent whenever payment processing fails for an active subscription.
```javascript theme={"dark"}
{
"data": {
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"cf_payment_id": "49585655",
"cf_txn_id": "4212555720",
"cf_order_id": "4519061918",
"subscription_id": "mozh4iRHSsjre7GkDNz",
"cf_subscription_id": "22393526",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 399.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": "a7d6101a7d9340269f070dxxxxx[at]xxxx",
"authorization_time": "2025-07-25T22:37:53+05:30",
"authorization_status": "ACTIVE",
"payment_id": "ab-SUBV2ODRIeYlFEhMHfS0M-1",
"payment_method": {
"upi": {
"channel": "link",
"upi_id": "9910000000@ybl",
"upi_instrument": "",
"upi_instrument_number": "",
"upi_payer_account_number": "",
"upi_payer_ifsc": ""
}
},
"payment_group": "upi"
},
"payment_amount": 399.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-07T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T05:02:41+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": "DEBIT FAILED | Insufficient Funds In Customer (Remitter) Account"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "22393526",
"gateway_payment_id": "49585655"
}
},
"event_time": "2025-08-07T10:24:45+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Insufficient balance"
},
"payment_status": "FAILED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_FAILED"
}
```
## SUBSCRIPTION\_PAYMENT\_CANCELLED
This notification is sent whenever payment processing is cancelled by user for an active subscription.
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"payment_id": "433563_33_1754492527395",
"cf_payment_id": "2011332",
"cf_txn_id": null,
"cf_order_id": "",
"subscription_id": "subTestIdOndemand_2025080615020470",
"cf_subscription_id": "1220385",
"payment_type": "CHARGE",
"authorization_details": {
"authorization_amount": 1.00,
"authorization_amount_refund": false,
"approve_by_time": "",
"authorization_reference": null,
"authorization_time": "",
"authorization_status": null,
"payment_id": "433563_33_1754492527395",
"payment_method": null,
"payment_group": null
},
"payment_amount": 1.00,
"payment_currency": "INR",
"payment_schedule_date": "2025-08-08T12:00:00+05:30",
"payment_initiated_date": "2025-08-06T20:32:07+05:30",
"payment_remarks": null,
"retry_attempts": 0,
"failure_details": {
"failure_reason": null
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "1220385",
"gateway_payment_id": "2011332"
}
},
"event_time": "2025-08-06T20:32:07+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "12345",
"cf_payment_id": "67890",
"cf_txn_id": "789012",
"cf_order_id": "98765",
"subscription_id": "sub12345",
"cf_subscription_id": "sub67890",
"payment_type": "DEBIT_CARD",
"authorization_details": {
"authorization_amount": 100,
"authorization_amount_refund": true,
"approve_by_time": "2024-07-18T16:09:50+05:30",
"authorization_reference": "6595231908096894505959",
"authorization_time": "2024-07-18T16:09:51",
"authorization_status": "ACTIVE",
"payment_id": "123",
"payment_method": "DEBIT_CARD",
"instrument_id": "hsdg9"
},
"payment_amount": 200,
"payment_schedule_date": "2024-07-20",
"payment_initiated_date": "2024-07-20",
"payment_remarks": "payment",
"retry_attempts": 0,
"failureDetails": {
"failureReason": "Subscription is not active"
},
"payment_status": "CANCELLED",
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "Demo_Subscription",
"gateway_payment_id": "payment12345"
}
},
"event_time": "2024-07-20T11:16:10+05:30",
"type": "SUBSCRIPTION_PAYMENT_CANCELLED"
}
```
## SUBSCRIPTION\_REFUND\_STATUS
This event is triggered whenever a refund status of a transaction will be success, failed, or cancelled.
```javascript theme={"dark"}
{
"data": {
"payment_id": "yCzJxeT2aXDqI",
"cf_payment_id": "49778199",
"refund_id": "WHOqiwy05P1l0",
"cf_refund_id": "SUB_21ebb4bf-e84f-4afa-bb09-07aac433abe4",
"refund_amount": 1000.00,
"refund_speed": "STANDARD",
"refund_note": "Tesg Refund",
"refund_status": "SUCCESS",
"failure_details": "",
"refund_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_payment_id": "49778199",
"gateway_refund_id": "SUB_21ebb4bf-e84f-4afa-bb09-07aac433abe4"
}
},
"event_time": "2025-08-06T17:20:02+05:30",
"type": "SUBSCRIPTION_REFUND_STATUS"
}
```
```javascript theme={"dark"}
{
"data": {
"payment_id": "pay8643",
"cf_payment_id": "863782648",
"refund_id": "refund2",
"cf_refund_id": "ref_212",
"refund_amount": 100,
"refund_note": "test",
"refund_speed": "INSTANT",
"refund_status": "SUCCESS",
"failure_details": null,
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_payment_id": "pay8643",
"gateway_refund_id": "refund2"
}
},
"event_time": "2023-01-03T11:16:10+05:30",
"type": "SUBSCRIPTION_REFUND_STATUS"
}
```
## SUBSCRIPTION\_CARD\_EXPIRY\_REMINDER
This event is triggered 7 days prior to the card’s expiry date for active card subscriptions.
```javascript theme={"dark"}
{
"data": {
"subscription_status_webhook": {
"subscription_details": {
"cf_subscription_id": "23661347",
"subscription_id": "SUB_TEST_1754550382119",
"subscription_status": "ACTIVE",
"subscription_expiry_time": "2050-12-31T00:00:00",
"subscription_first_charge_time": "2025-09-30T00:00:00",
"subscription_tags": {
"next_schedule_date": "2025-09-30T00:10:00"
}
},
"customer_details": {
"customer_name": "John Doe",
"customer_email": "john@cashfree.com",
"customer_phone": "9090909090"
},
"plan_details": {
"plan_id": "PLAN_1754550139964",
"plan_name": "MY_PLAN",
"plan_type": "PERIODIC",
"plan_max_cycles": 2,
"plan_recurring_amount": 5,
"plan_max_amount": 1000,
"plan_interval_type": "MONTH",
"plan_intervals": 1,
"plan_currency": null,
"plan_note": null,
"plan_status": null
},
"authorization_details": {
"authorizationAmount": 1,
"authorizationAmountRefund": false,
"approveByTime": "2025-09-06T12:36:22",
"authorizationReference": null,
"authorizationTime": "2025-08-07T13:14:18",
"authorizationStatus": "ACTIVE",
"paymentId": "160594_178_1754552533131",
"paymentMethod": "card",
"instrumentId": null
},
"payment_gateway_details": {
"gateway_name": "CASHFREE",
"gateway_subscription_id": "23661347",
"gateway_plan_id": "PLAN_1754550139964",
"gateway_auth_id": null
}
},
"card_expiry_date": "2025-09-30"
},
"event_time": "2025-09-24T02:00:09+05:30",
"type": "SUBSCRIPTION_CARD_EXPIRY_REMINDER"
}
```
The following webhooks are only relevant if you are using Controlled API endpoints for notification and charge.
## SUBSCRIPTION\_CONTROLLED\_NOTIFICATION\_STATUS
Cashfree sends this webhook when the status of a merchant-controlled payment notification attempt changes (for example, SUCCESS or FAILED).
```javascript theme={"dark"}
{
"data": {
"cf_notification_id": "3333",
"cf_order_id": "123456",
"cf_payment_id": "123456",
"cf_subscription_id": "7891011",
"cf_txn_id": "123456",
"notification_attempted_time": "2025-06-01T22:14:59+05:30",
"notification_completed_time": "2025-06-01T22:15:59+05:30",
"notification_failure_details": {
"failure_reason": "",
"failure_error_code": "",
"failure_sub_error_code": ""
},
"notification_id": "notification-001",
"notification_initiated_time": "2025-06-01T22:14:58+05:30",
"notification_status": "SUCCESS",
"payment_amount": 1,
"payment_id": "test-payment-id",
"payment_remarks": "monthly charge",
"payment_status": "INITIALIZED",
"subscription_id": "test-subscription-id"
},
"event_time": "2025-06-01T22:15:59+05:30",
"type": "SUBSCRIPTION_CONTROLLED_NOTIFICATION_STATUS"
}
```
## SUBSCRIPTION\_CONTROLLED\_EXECUTION\_STATUS
Cashfree sends this webhook when the status of a merchant-controlled charge execution attempt changes (for example, SUCCESS or FAILED).
```javascript theme={"dark"}
{
"data": {
"cf_execution_id": "3333",
"cf_order_id": "123456",
"cf_payment_id": "123456",
"cf_subscription_id": "7891011",
"cf_txn_id": "123456",
"execution_attempted_time": "2025-06-01T22:14:59+05:30",
"execution_completed_time": "2025-06-01T22:15:59+05:30",
"execution_id": "execution-001",
"execution_initiated_time": "2025-06-01T22:14:58+05:30",
"execution_status": "SUCCESS",
"failure_details": {
"failure_reason": "",
"failure_error_code": "",
"failure_sub_error_code": ""
},
"payment_amount": 1,
"payment_id": "test-payment-id",
"payment_remarks": "",
"payment_status": "SUCCESS",
"subscription_id": "test-subscription-id"
},
"event_time": "2025-06-01T22:15:59+05:30",
"type": "SUBSCRIPTION_CONTROLLED_EXECUTION_STATUS"
}
```
# Delete Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/token-vault/delete
openapi/payments/v2025-01-01.yaml delete /customers/{customer_id}/instruments/{instrument_id}
Use this API to delete a specific saved card stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Get Cryptogram for a Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/token-vault/generate-cryptogram
openapi/payments/v2025-01-01.yaml get /customers/{customer_id}/instruments/{instrument_id}/cryptogram
Use this API to retrieve the token and cryptogram for a specific saved card stored in Cashfree's [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Get Specific Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/token-vault/get
openapi/payments/v2025-01-01.yaml get /customers/{customer_id}/instruments/{instrument_id}
Use this API to fetch a specific saved card stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Get All Saved Card Instrument
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/token-vault/get-all
openapi/payments/v2025-01-01.yaml get /customers/{customer_id}/instruments?instrument_type=card
Use this API to fetch all saved cards stored for the customer in Cashfree’s [Token Vault](https://www.cashfree.com/docs/payments/features/token-vault).
# Card Token Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/token-vault/webhooks
Receive asynchronous notification for updates on a card instrument, which is requested to be tokenised.
| Event | Description |
| - | - |
| INSTRUMENT\_ACTIVE\_WEBHOOK | This webhook is triggered when the card is successfully tokenised. |
| INSTRUMENT\_FAILED\_WEBHOOK | This webhook is triggered when the card tokenisation fails. |
For more information on how to configure webhooks, see [Webhook configuration](/docs/payments/online/webhooks/configure).
## Instrument active webhook
```javascript Instrument active webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "ACTIVE",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": "50012ADWQZJKHCLXLT61QTYD5QNX1",
"card_token_details": null
}
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_ACTIVE_WEBHOOK"
}
```
## Instrument failed Webhook
```javascript Instrument failed webhook theme={"dark"}
{
"data": {
"instrument": {
"customer_id": "siddhesh199721",
"afa_reference": "887316963",
"instrument_id": "af250dc5-e5e5-4e7d-a7cf-3f446741fa54",
"instrument_type": "card",
"instrument_uid": "680cd7171583f9f64b426983d4501d6941b462932ce5f626be78392d5ec42660",
"instrument_display": "XXXXXXXXXXXX6854",
"instrument_status": "FAILED",
"added_at": "2022-04-14T10:42:59+05:30",
"instrument_meta": {
"card_network": "visa",
"card_bank_name": "HDFC BANK",
"card_country": "IN",
"card_type": "credit",
"sub_type": "R",
"card_par": null,
"card_token_details": null
}
},
"error_details": {
"error_code": "NETWORK_ERROR",
"error_description": "Error while processing the request",
"error_source": "NETWORK"
}
},
"event_time": "2022-04-14T10:44:14+05:30",
"type": "INSTRUMENT_FAILED_WEBHOOK"
}
```
## Payload field description
| Field | Description | Type |
| - | - | - |
| customer\_id | For checkout, this is the customer phone number and for seamless this is the customer ID provided by the merchant during the [Create Order API](/docs/api-reference/payments/previous/v2025-01-01/orders/create) call, which is used to save cards for the customer. | `string` |
| afa\_reference | Represents the `cf_payment_id` of the successful transaction done while saving the instrument. | `string` |
| instrument\_id | Represents the identifier for the card saved at Cashfree. | `string` |
| instrument\_type | Specifies the type of instrument. Available options: `card`. | `enum` |
| instrument\_uid | Represents the unique identifier for the card, used to identify a specific card. | `string` |
| instrument\_display | Shows the last 4 digits of the actual card number. | `string` |
| instrument\_status | Shows the status of the saved instrument. It is `ACTIVE` when the card is successfully tokenised, else `FAILED`. Available options: `ACTIVE`, `FAILED`. | `enum` |
| added\_at | Shows the timestamp at which the instrument was attempted to be saved. | `string` |
| card\_network | Specifies the card scheme or network. Available options: `visa`, `mastercard`, `rupay`, `amex`, `diners`. | `string` |
| card\_bank\_name | Shows the issuing bank name of the card. Examples: `HDFC BANK`, `ICICI BANK`, `AXIS BANK`. | `string` |
| card\_country | Shows the issuing country of the card. Example: `IN`. | `string` |
| card\_type | Specifies the type of card. Available options: `credit`, `debit`, `prepaid`. | `string` |
| sub\_type | Specifies the sub-type of card. `R` = Retail, `P` = Premium, `C` = Corporate. Available options: `R`, `P`, `C`. | `string` |
| card\_par | Represents the [PAR](/docs/payments/features/payment-account-reference) for the plain card. Appears only in instrument active webhook when the card is tokenised successfully. | `string` |
| card\_token\_details | Always passed as null. | `object` |
| event\_time | Shows the time at which the webhook is initiated. | `string` |
| type | Specifies the type of the instrument webhook. Available options: `INSTRUMENT_ACTIVE_WEBHOOK`, `INSTRUMENT_FAILED_WEBHOOK`. | `string` |
# Get Card BIN Details
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/utilities/get-card-bin
post /utilities/cardbin
Use this API to get [Card BIN](https://www.cashfree.com/docs/payments/features/utility-apis) (Bank Identification Number) details.
# Get PAR
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/utilities/get-par
post /utilities/pars
Use this API to get [Payment Account Reference (PAR)](https://www.cashfree.com/docs/payments/features/payment-account-reference) by providing plain card details.
# Fetch All Downtimes
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/utilities/incidents/fetch-all-downtimes
get /incident
Fetches active downtimes across various payment methods based on filters. Gives all active downtimes when no filters are applied.
# Fetch Downtime by ID
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/utilities/incidents/fetch-downtime-by-id
get /incident/{id}
Fetches details of a specific downtime using its unique ID.
# Incident Service Webhook
Source: https://www.cashfree.com/docs/api-reference/payments/previous/v2025-01-01/utilities/incidents/incident-webhook
Subscribe to Cashfree's Incident Service Webhook to get notified by email or server callback when an issuing bank has high failures or maintenance.
Cashfree will notify you whenever we create an incident at our end. An incident implies that the issuing bank is facing high failure rates or has scheduled a maintenance activity during that time. The former could be due to many reasons and until the failure rates go down, we would recommend customers to use alternative payment instruments.
There are two channels through which we notify. You can subscribe to either of the channels by adding your email address and webhook endpoint in the merchant dashboard.
Email - Cashfree will send an email alert when an issuer is facing downtime or a scheduled incident.
Webhooks - Cashfree will invoke a server to server call whenever an incident is created. You can use this webhook and update your payment page accordingly.
## Webhook Schema of Incident Service Webhook
### Sample Payload for Creation of Incident
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
### Sample Payload When Incident is Resolved
```javascript Version (2025-01-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
```javascript Version (2023-08-01) theme={"dark"}
{
"data": {
"incident": {
"end_time": "2025-04-29T09:11:48+05:30",
"id": "x77rkd7phl5dobr94k1s",
"impact": "HIGH",
"message": "Payment mode up",
"start_time": "2025-04-22T09:11:48+05:30",
"status": "RESOLVED",
"type": "SCHEDULED"
},
"instruments": {
"upi": {
"issuers": [
"DEUTSCHE BANK"
]
}
}
},
"event_time": "2025-04-22T14:42:08+05:30",
"type": "HEALTH_ALERT"
}
```
### Payload
| Field | Description | Example | Mandatory |
| - | - | - | - |
| end\_time | Null when an incident is created. Or end time when incident is resolved | 2021-04-16T15:10:36+05:30 | No |
| start\_time | Time since we have seen this incident | 2021-04-16T14:10:36+05:30 | Yes |
| id | Incident id | Alphanumeric with \_,- | Yes |
| impact | Impact of the downtime | HIGH, MEDIUM, LOW | Yes |
| message | Human readable message | | No |
| status | Status of the incident. OPEN when created, RESOLVED when resolved, UPDATE when updated with details | OPEN, UPDATE, RESOLVED | Yes |
| type | Is this a scheduled or an unscheduled downtime? | SCHEDULED, UNSCHEDULED | Yes |
| instruments | Refers to the payment mode. This will contain a nested object | | Yes |
| upi.issuers | Issuers which are impacted | Array | No |
| net\_banking.issuers | Net banking banks which are impacted | Array | No |
| wallet.issuers | Wallets which are impacted | Array | No |
| card.type | Card types which are impacted | CREDIT\_CARD, DEBIT\_CARD, ALL | No |
| card.scheme | Card schemes which are impacted | MASTER, VISA, RUPAY, MAESTRO, AMEX, Multiple Schemes | No |
| card.issuers | Banks which are impacted | Array | No |
| event\_time | Time when this webhook was created | | Yes |
| type | Type of webhook | HEALTH\_ALERT | Yes |
| version | Version of webhook. You should build your parsing logic with respect to this version | | Yes |
| Children | Optional | Type | Possible Values |
| - | - | - | - |
| wallet | Y\* | Child attributes | Available below |
| net\_banking | Y\* | Child attributes | Available below |
| upi | Y\* | Child attributes | Available below |
| card | Y\* | Child attributes | Available below |
> At least one of the children needs to be present
### Wallet
| Children | Optional | Type | Possible Values |
| - | - | - | - |
| issuers | N | Text | See list of wallet issuers below. |
### Net Banking
| Children | Optional | Type | Possible Values |
| - | - | - | - |
| issuers | N | Array | See list of issuers below. |
### UPI
| Children | Optional | Type | Possible Values |
| - | - | - | - |
| issuers | N | Array | See list of issuers below. |
### Card
| Children | Optional | Type | Possible Values |
| - | - | - | - |
| type | N | Text | CREDIT\_CARD, DEBIT\_CARD, ALL |
| scheme | N | Text | MASTER, VISA, RUPAY, MAESTRO, AMEX, Multiple Schemes |
| issuers | N | Array | See list of issuers below. |
### Payload Headers
Cashfree will send two custom headers for every webhook being invoked by our system.
| Name | Description | Example |
| - | - | - |
| x-cashfree-timestamp | Timestamp for this event. Used to generate signature | 1618562436364 |
| x-cashfree-signature | Cashfree signature for this webhook | ke+K3gR8GssH9AMfJm+0+8jGIL1Mq7hOheP9w36/hL0= |
## Signature Generation
The signature must be used to verify if the request has not been tampered with. To verify the signature at your end, you will need your Cashfree Payment Gateway secret key along with the payload.
```
//The payload here refers to the raw request sent by
Cashfree to your endpoint. No modifications need to be
done to this payload.
payload := {"data":{"bank_name":"Test Bank",
"card_type":"Visa","health":"DEGRADED",
"incident_end_time":"2021-04-07T00:20:30",
"incident_id":"INCIDENT_HIGH_Test Bank_954b95zz-f11a-test-abcd-0eb0e8608847",
"incident_impact":"High",
"incident_start_time":"2021-04-06T00:20",
"incident_type":"Scheduled",
"is_resolved":false,
"issuers":[],
"message":"We are facing high failure issues in Payment gateway at the moment and will keep you updated about the issue.",
"payment_gateway":null,"payment_mode":"DEBIT_CARD",
"scope":"PaymentMode"},
"type":"HEALTH_ALERT","version":1}
# timestamp is present in the header x-cashfree-timestamp
timestamp := 1617695238078
signedPayload := $timestamp.$payload
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $merchantSecretKey))
```
## Bank Names
* Axis Bank
* Bank of Baroda - Retail Banking
* Bank of India
* Bank of Maharashtra
* Canara Bank
* Catholic Syrian Bank
* Central Bank of India
* City Union Bank
* Deutsche Bank
* DBS Bank Ltd
* DCB Bank - Personal
* Dhanlakshmi Bank
* Federal Bank
* HDFC Bank
* ICICI Bank
* IDBI Bank
* IDFC Bank
* Indian Bank
* Indian Overseas Bank
* IndusInd Bank
* Jammu and Kashmir Bank
* Karnataka Bank Ltd
* Karur Vysya Bank
* Kotak Mahindra Bank
* Laxmi Vilas Bank - Retail Net Banking
* Punjab & Sind Bank
* Punjab National Bank - Retail Net Banking
* RBL Bank
* Saraswat Bank
* South Indian Bank
* Standard Chartered Bank
* State Bank Of India
* Tamilnad Mercantile Bank Ltd
* UCO Bank
* Union Bank of India
* Yes Bank Ltd
* Bank of Baroda - Corporate
* Bank of India - Corporate
* DCB Bank - Corporate
* Lakshmi Vilas Bank - Corporate
* Punjab National Bank - Corporate
* State Bank of India - Corporate
* Union Bank of India - Corporate
* Axis Bank Corporate
* Dhanlaxmi Bank Corporate
* ICICI Corporate Netbanking
* Ratnakar Corporate Banking
* Shamrao Vithal Bank Corporate
* Equitas Small Finance Bank
* Yes Bank Corporate
* Bandhan Bank- Corporate banking
* Barclays Corporate- Corporate Banking - Corporate
* Indian Overseas Bank Corporate
* City Union Bank of Corporate
* HDFC Corporate
* Shivalik Bank
* AU Small Finance
* Bandhan Bank - Retail Net Banking
* Shamrao Vitthal Co-operative Bank
* Tamil Nadu State Co-operative Bank
All Banks (Note: This parameter will be sent when all banks are having a downtime)
## Wallet Names
* FreeCharge
* MobiKwik
* Ola Money
* Reliance Jio Money
* Airtel Money
* Paytm
* Amazon Pay
* PhonePe
## Compute Signature and Verify
#### Sample code
#### Verify Signature using SDK
```javascript Node(express) theme={"dark"}
var express = require('express')
import { Cashfree } from "cashfree-pg";
var app = express()
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.Environment.SANDBOX;
app.post('/webhook', function (req, res) {
try {
Cashfree.PGVerifyWebhookSignature(req.headers["x-webhook-signature"], req.rawBody, req.headers["x-webhook-timestamp"]))
} catch (err) {
console.log(err.message)
}
})
```
```go Go theme={"dark"}
import (
cashfree "github.com/cashfree/cashfree-pg/v4"
)
// Route
e.POST("/webhook", _this.Webhook)
// Controller
func (_this *WebhookRoute) Webhook(c echo.Context) error {
clientId := ""
clientSecret := ""
cashfree.XClientId = &clientId
cashfree.XClientSecret = &clientSecret
cashfree.XEnvironment = cashfree.SANDBOX
signature := c.Request().Header.Get("x-webhook-signature")
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
webhookEvent, err := cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp)
if err != nil {
fmt.Println(err.Error())
} else {
fmt.Println(webhookEvent.Object)
}
}
```
```php PHP theme={"dark"}
";
\Cashfree\Cashfree::$XClientSecret = "";
$cashfree = new \Cashfree\Cashfree();
try {
$response = cashfree->PGVerifyWebhookSignature($expectedSig, $inputJSON, $ts);
} catch(Exception $e) {
// Error if signature verification fails
}
?>
```
```python Python theme={"dark"}
from cashfree_pg.api_client import Cashfree
@app.route('/webhook', methods = ['POST'])
def disp():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
decoded_body = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signature = request.headers['x-webhook-signature']
cashfree = Cashfree()
cashfree.XClientId = ""
cashfree.XClientSecret = ""
try:
cashfreeWebhookResponse = cashfree.PGVerifyWebhookSignature(signature, decoded_body, timestamp)
except:
# If Signature mis-match
```
```java Java theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
```csharp C# theme={"dark"}
import com.cashfree.*;
@PostMapping("/my-endpoint")
public String handlePost(HttpServletRequest request) throws IOException {
Cashfree.XClientId = "";
Cashfree.XClientSecret = "";
Cashfree.XEnvironment = Cashfree.SANDBOX;
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String rawBody = stringBuilder.toString();
String signature = request.getHeader("x-webhook-signature");
String timestamp = request.getHeader("x-webhook-timestamp");
Cashfree cashfree = new Cashfree();
PGWebhookEvent webhook = cashfree.PGVerifyWebhookSignature(signature, rawBody, timestamp);
} catch (Exception e) {
// Error if verification fails
} finally {
if (bufferedReader != null) {
bufferedReader.close();
}
}
}
```
### Compute Signature and Verify manually
```javascript Node(express) theme={"dark"}
function verify(ts, rawBody){
const body = req.headers["x-webhook-timestamp"] + req.rawBody;
const secretKey = "";
let genSignature = crypto.createHmac('sha256',secretKey).update(body).digest("base64");
return genSignature
}
```
```go Go theme={"dark"}
func VerifySignature(expectedSig string, ts string, body string) (string, error) {
t := time.Now()
currentTS := t.Unix()
if currentTS-ts > 1000*300 {
return "", errors.New("webhook delivered too late")
}
signStr := strconv.FormatInt(ts, 10) + body
fmt.Println("signing String: ", signStr)
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature($ts, $rawBody){
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig;
}
```
```java Java theme={"dark"}
public String generateSignature() {
bufferedReader = request.getReader();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line).append('\n');
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp+payload;
String secretKey = "SECRET-KEY"; // Get secret key from Cashfree Merchant Dashboard;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key_spec);
String computed_signature = Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
return computed_signature; // compare with "x-webhook-signature"
}
```
```python Python theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature():
# Get the raw body from the request
raw_body = request.data
# Decode the raw body bytes into a string
payload = raw_body.decode('utf-8')
#verify_signature
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp+payload
message = bytes(signatureData, 'utf-8')
secretkey=bytes("Secret_Key",'utf-8') #Get Secret_Key from Cashfree Merchant Dashboard.
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
computed_signature = str(signature, encoding='utf8')
return computed_signature #compare with "x-webhook-signature"
```
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payments/rate-limits
Review the per-minute rate limits applied to Cashfree API endpoints and learn how to detect throttling using response headers.
You can view your API usage and rate limits on your dashboard. Go to **Developers** > **Rate Limits** to view various metrics such as: `Rate Limit`, `Latest Usage`, `Average Usage`, `Burst limit`, `Request Count` and `Violation Count`.
## Rate limiting
We use rate limiting for all endpoints. Rate limiting is based on your IP and your account Id. By default, the following rate limits are applied per minute. You can also view your rate limits in the response headers.
### Rate limit in Production
| API | Rate limit value per minute | Rate limit type |
| :- | :- | :- |
| Create Order | 200 | Account |
| Get Order | 400 | Account |
| Get Payments | 100 | Account |
| Get Payments by ID | 130 | Account |
| Pay Order | 100 | IP |
| Get Settlements | 30 | Account |
| Initiate Refund | 100 | Account |
| Get Refund | 30 | Account |
### Rate limits in Sandbox
| API | Rate limit value per minute | Rate limit type |
| :- | :- | :- |
| Create Order | 30 | Account |
| Get Order | 60 | Account |
| Get Payments | 30 | Account |
| Pay Order | 30 | IP |
| Get Settlements | 20 | Account |
| Initiate Refund | 30 | Account |
| Get refund | 60 | Account |
## Rate limiting headers
All responses will have the following headers to help you understand rate limiting.
| Header name | Example | Description |
| :- | :- | :- |
| x-ratelimit-limit | 100 | Max number of calls that can be made in a minute |
| x-ratelimit-remaining | 30 | Remaining number of calls that can be made in a minute |
| x-ratelimit-retry | 0 | Number of seconds you will have to wait to make the next call |
| x-ratelimit-type | `app_id` or `ip` | Type of rate limiting applied |
## Upgrading limits
You can increase rate limits or burst limits at an API level through the Merchant Dashboard.
To request a limit increase:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Go to **Payment Gateway > Developers > Rate Limits**.
*Rate Limits page showing all APIs with current limits*
3. Select **Request new limit** for the API you want to change the limit for.
*Request form for increasing rate or burst limits*
4. Enter the new rate or burst limit you require. For burst limit, enter the time duration.
The total limit is the sum of the rate limit and burst limits.
5. Provide the reason for the request and click **Submit**.
After you submit the request, it will be reviewed and approved within 1-2 business days. Once approved, the new rate limits will be applied to your account.
# Payment SDK
Source: https://www.cashfree.com/docs/api-reference/payments/sdk
Integrate the Cashfree SDKs for server-side languages and mobile platforms to accept payments without writing low-level REST code.
Cashfree server-side SDKs reduce the amount of work required to use Cashfree's REST APIs. Below are the links for these libraries in a variety of popular server-side programming languages.
## Server SDK
Version **5.0.5**. Server-side SDK for Python applications with comprehensive payment gateway integration.
Version **5.1.0**. JavaScript/TypeScript SDK for Node.js applications and serverless functions.
Version **5.0.1**. Enterprise-grade SDK for Java applications and Spring Boot projects.
Version **5.0.3**. Lightweight SDK for PHP applications and Laravel projects.
Version **6.0.7**. Cross-platform SDK for .NET Core and .NET Framework applications. Install via NuGet: `cashfree-dotnet-pg`.
Version **5.1.9**. High-performance SDK for Go applications and microservices.
# Getting Started
Source: https://www.cashfree.com/docs/api-reference/payouts/getting-started-with-payouts-apis
Review the prerequisites, sandbox credentials, IP whitelisting, and signature setup you need before testing Cashfree Payouts APIs in your integration.
Version 2 APIs: Cashfree has new [version 2 APIs for Payouts](/docs/api-reference/payouts/v2/payouts-api-v2-new). The v2 APIs represent a significant leap forward in payouts integration, offering enhanced versioning, standardised requests and responses, efficient troubleshooting, standardisation across products, and simplified transfer APIs.
This article covers the following topics:
* [Download Postman collection](#download-postman-collection)
* [View endpoints](#view-endpoints)
* [Generate API keys](#generate-api-keys)
* [Whitelist IP address](#whitelist-your-ip-address) or [Generate signature](#generate-signature)
* [Contact support](#any-queries-contact-support)
## Download Postman collection
This collection can save you time because of easy access to different requests.
Download Cashfree Payouts Postman Collection
## View endpoints
For [Payout v2 APIs](/docs/api-reference/payouts/v2/payouts-api-v2-new): \[NEW]
| Environment | Base address |
| :- | :- |
| Production | [https://api.cashfree.com/payout](https://api.cashfree.com/payout) |
| Test | [https://sandbox.cashfree.com/payout](https://sandbox.cashfree.com/payout) |
For Payout v1 and v1.2 APIs:
| Environment | Base address |
| :- | :- |
| Production | [https://payout-api.cashfree.com](https://payout-api.cashfree.com) |
| Test | [https://payout-gamma.cashfree.com](https://payout-gamma.cashfree.com) |
Cashfree uses unique identifiers to allow access to the API. After you sign up at the merchant site, you can see your **AppId** and **SecretKey**. Each API request to the server requires these credentials.
Use this endpoint to verify your credentials: **/api/v1/credentials/verify**
## Generate API keys
To generate API keys:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. From the Payouts dashboard, click **Developers** on the navigation panel.
3. Click **API Keys**.
4. Click **Generate API Keys** from the API Keys screen.
5. The New API Keys popup displays with the client ID and client secret information.
6. Click **Download API Keys** to download the information and save them in your local system folder. Don't share the keys with anyone because they're confidential. You can generate a maximum of 10 API keys.
API Keys - Production Environment: You need to perform an OTP authentication
to generate API keys for the production environment.
## Identity verification
Whitelisting the IP address or generating a signature provides a layer of authentication. These cybersecurity techniques prevent anonymous or unknown disbursement requests and allow only verified requests.
### Whitelist your IP address
Your IP address needs to be whitelisted in the Cashfree production server or it rejects all incoming requests.
Only the production environment needs approval from Cashfree and not
for the test environment.
To whitelist your IP:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. From the Payouts dashboard, click **Developers** > **Two-Factor Authentication**.
3. Choose **IP Whitelist** from the **Select 2FA Method** drop-down.
4. Click **Add IP Address**.
5. Enter the IP address you want to whitelist in the respective field and click **Add IP Address** to save the details. Note that the IPv4 has to be whitelisted, and not IPv6. The whitelisted IPs display in the grid as shown below. You can whitelist a maximum of 25 IPs.
### Generate signature
To generate a signature, you need to generate the public key. You then use the generated public key to generate the signature.
#### Generating a public key
1. From the **Payouts** dashboard, click **Developers** > **Two-Factor Authentication**.
2. Select **Public Key** from the **Select 2FA Method** drop-down.
3. Click **Generate Public Key**.
4. The public key is downloaded to your computer. Use your registered email ID to access the key.
#### Generating a signature
To generate your signature:
1. Retrieve your clientId (one which you're passing through the header X-Client-Id).
2. Append this with CURRENT UNIX timestamp separated by a period (.).
3. Encrypt this data using RSA encrypt with public key you received—this is the signature.
4. Pass this signature through the header X-Cf-Signature.
When using the Cashfree library, go through the libraries section. During the initialisation process, you need to pass the key as a parameter.
```php PHP theme={"dark"}
";
$publicKey =
openssl_pkey_get_public(file_get_contents("/path/to/certificate/public
_key.pem"));
$encodedData = $clientId.".".strtotime("now");
return static::encrypt_RSA($encodedData, $publicKey);
}
private static function encrypt_RSA($plainData, $publicKey) { if (openssl_public_encrypt($plainData, $encrypted, $publicKey,
OPENSSL_PKCS1_OAEP_PADDING))
$encryptedData = base64_encode($encrypted);
else return NULL;
return $encryptedData;
}
?>
```
```java Java theme={"dark"}
private static String generateEncryptedSignature(String clientIdWithEpochTimestamp) {
// String clientIdWithEpochTimeStamp = clientId+"."+Instant.now().getEpochSecond();
String encrytedSignature = "";
try {
byte[] keyBytes = Files
.readAllBytes(new File("/Users/sameera/Downloads/payout_test_public_key.pem").toPath()); // Absolute Path to be replaced
String publicKeyContent = new String(keyBytes);
System.out.println(publicKeyContent);
publicKeyContent = publicKeyContent.replaceAll("[\\t\\n\\r]", "")
.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
System.out.println(publicKeyContent);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(
Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encrytedSignature = Base64.getEncoder().encodeToString(cipher.doFinal(clientIdWithEpochTimestamp.getBytes()));
System.out.println(encrytedSignature);
} catch (Exception e) {
e.printStackTrace();
}
return encrytedSignature;
}
```
```python Python theme={"dark"}
from cashfree_sdk.payouts import Payouts
// Initialise the SDK, pass public key for dynamic IP
Payouts.init("", "", "PROD", public_key= b'public key')
```
```javascript Node theme={"dark"}
//require CashfreeSDK
const cfSdk = require("cashfree-sdk");
//access the PayoutsSdk from CashfreeSDK
const { Payouts } = cfSdk;
// Instantiate Cashfree Payouts
const payoutsInstance = new Payouts({
env: "TEST",
clientId: "",
clientSecret: "",
pathToPublicKey: "/path/to/your/public/key/file.pem",
//"publicKey": "ALTERNATIVE TO SPECIFYING PATH (DIRECTLY PASTE PublicKey)"
});
```
**Getting the “IP not whitelisted” error on the Postman web app?**\
If you're using the Postman web app, API requests may fail because Postman uses dynamic cloud IPs, which can't be whitelisted.
**How to fix it**: Use the Postman desktop app. It sends requests from your local IP address, which can be whitelisted.
Signature verification works correctly with both web and desktop apps. Only **IP-based whitelisting** is affected.
## Any queries: Contact support
For API or integration issues, fill the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) or email Cashfree Support with the details below.
To identify, diagnose, and resolve problems related to API requests, ensure the following information is communicated when contacting support:
* Share the API request and response details along with only **x-client-ID**.
* Mention the registered email ID and environment in the email.
* Use your registered email address (with Cashfree) to send the email or mention the registered email address.
* Include your account manager in the CC of the email request.
For dashboard queries, share the screenshot and .har file of the screen.
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/overview
Explore the Cashfree Payouts APIs that disburse funds to bank accounts, UPI IDs, and cards with sandbox endpoints, authentication, and webhooks.
The **Payouts APIs** by Cashfree provide secure, scalable RESTful endpoints for instant fund transfers. These APIs enable businesses to disburse payments directly to **bank accounts**, **UPI IDs**, or **cards** without manual intervention. With high success rates, consistent authentication, and robust error handling, Payouts ensure reliable and real-time disbursal operations across a range of business use cases.
The Payouts APIs are available for both **sandbox testing** and **production** environments, supporting webhook notifications, reconciliation capabilities, and multiple payout modes.
## Key features
The key features offered by Cashfree’s **Payouts APIs** are:
* **Instant fund transfers**: Process payouts to bank accounts, UPI, and cards 24×7.
* **Multi-mode disbursals**: Choose from IMPS, NEFT, RTGS, UPI, and card-based transfers.
* **Bulk payouts**: Automate thousands of payments in a single API call.
* **Dynamic beneficiary management**: Add, verify, and manage beneficiaries securely.
* **Advanced reconciliation**: Track transaction statuses with webhooks and detailed reporting.
* **Enhanced security and compliance**: PCI DSS-certified infrastructure with real-time fraud prevention through Payout Protect.
Receive real-time notifications on payout success, failure, or reversal events.
## Get started
Use the following resources to begin implementing Cashfree Payouts:
Learn about Payouts features, sub-products, and setup process.
Configure API keys, Postman collection, and security requirements.
# Add Beneficiary
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/add-beneficiary
post /payout/v1/addBeneficiary
Use this API to add a beneficiary to your Cashfree account by providing the bank account number, IFSC, and other required details. Before you request a transfer, ensure the account has been successfully added as a beneficiary.
This API will be retired soon. Please plan to migrate to the latest version, [Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Beneficiary added successfully | - |
| 400 | ERROR | Please provide a valid VPA | Enter a valid VPA in the API request. |
| 403 | ERROR | Token is not valid | Enter a valid token in the request. |
| 403 | ERROR | IP not whitelisted | Whitelist the API. |
| 403 | ERROR | APIs not enabled. Fill out the details in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) | [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) |
| 409 | ERROR | Beneficiary Id already exists | Enter a unique ID for the beneficiary. |
| 409 | ERROR | Entered bank Account is already registered | Enter different bank account information. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the request. |
| 412 | ERROR | Beneficiary group is not an active group | |
| 412 | ERROR | Bank account and VPA are both provided in the request. Please add either of them to add the beneficiary. | Enter any of the information in the request. |
| 412 | ERROR | Cannot add yourself as a beneficiary | Enter an individual's information apart from yours to add a beneficiary. |
| 422 | ERROR | Please provide a valid Beneficiary Id | Enter a valid beneficiary ID. |
| 422 | ERROR | Please provide a valid email | Enter a valid email address. |
| 422 | ERROR | Please provide a valid name | Enter a valid name. |
| 422 | ERROR | Please provide a valid Phone Number | Enter a valid phone number. |
| 422 | ERROR | Please provide a valid Bank Account | Enter valid bank account information. |
| 422 | ERROR | Please provide a valid Bank IFSC code | Enter a valid IFSC. |
| 422 | ERROR | Please provide a valid Virtual Payee Address | Enter a valid VPA. |
| 422 | ERROR | Please provide a valid Address | Enter a valid address. |
| 422 | ERROR | Please provide a valid City Name | Enter a valid city name. |
| 422 | ERROR | Please provide a valid State Name | Enter a valid state name. |
| 422 | ERROR | Please provide a valid Pin code | Enter a valid PIN code. |
| 422 | ERROR | Cashfree VBA/VPA cannot be added as a beneficiary | Enter a different VBA/VPA to add the beneficiary. |
| 422 | ERROR | Please provide a valid MasterCard or Visa card number | Enter a valid MasterCard or Visa card number. |
| 422 | ERROR | Please provide a masked card number of a valid MasterCard or Visa card | Enter a masked card number of a valid MasterCard or Visa card. |
| 422 | ERROR | Invalid details provided | Enter valid details of the beneficiary to add the beneficiary in the system. |
| 520 | ERROR | Adding beneficiary Failed | Re-enter the details or try again after some time. |
**Note**: If you are attempting to create a transfer in the Sandbox environment, you can obtain the test data details from the [test data page](/docs/payouts/payouts/integrations/data-to-test).
# Authorize
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/authorize
post /payout/v1/authorize
Use this API to authenticate with the Cashfree system and obtain the authorization bearer token. All other API calls must have this token as Authorization header in the format 'Bearer ' (without quotes) for them to get processed.
**URLs**
* Production/Live: [https://payout-api.cashfree.com/payout/v1/authorize](https://payout-api.cashfree.com/payout/v1/authorize)
* Sandbox/Test: [https://payout-gamma.cashfree.com/payout/v1/authorize](https://payout-gamma.cashfree.com/payout/v1/authorize)
If you do not have a static IP, you can generate a public key and pass it with the API request.
To generate a public key,
1. Go Payouts Dashboard > **Developers** section on the left-side navigation > **Payouts** > **Two-Factor Authentication** > **Public Key**.
2. Click **Generate Public Key**. The public key will be downloaded to your computer and the password to access it will be your email ID registered with Cashfree. Only one Public Key can be generated at a time.
Below are the steps to generate your signature:
1. Retrieve your clientId (one which you are passing through the header X-Client-Id )
2. Append this with CURRENT UNIX timestamp separated by a period (.)
3. Encrypt this data using RSA encrypt with Public key you received - this is the signature.
4. Pass this signature through the header X-Cf-Signature.
In the case of using our library, go through the libraries section. During the initialization process, you need to pass the key as a parameter.
```php PHP theme={"dark"}
";
$publicKey =
openssl_pkey_get_public(file_get_contents("/path/to/certificate/public
_key.pem"));
$encodedData = $clientId.".".strtotime("now");
return static::encrypt_RSA($encodedData, $publicKey);
}
private static function encrypt_RSA($plainData, $publicKey) { if (openssl_public_encrypt($plainData, $encrypted, $publicKey,
OPENSSL_PKCS1_OAEP_PADDING))
$encryptedData = base64_encode($encrypted);
else return NULL;
return $encryptedData;
}
?>
```
```java Java theme={"dark"}
private static String generateEncryptedSignature(String clientIdWithEpochTimestamp) {
// String clientIdWithEpochTimeStamp = clientId+"."+Instant.now().getEpochSecond();
String encrytedSignature = "";
try {
byte[] keyBytes = Files
.readAllBytes(new File("/Users/sameera/Downloads/payout_test_public_key.pem").toPath()); // Absolute Path to be replaced
String publicKeyContent = new String(keyBytes);
System.out.println(publicKeyContent);
publicKeyContent = publicKeyContent.replaceAll("[\\t\\n\\r]", "")
.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
System.out.println(publicKeyContent);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(
Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encrytedSignature = Base64.getEncoder().encodeToString(cipher.doFinal(clientIdWithEpochTimestamp.getBytes()));
System.out.println(encrytedSignature);
} catch (Exception e) {
e.printStackTrace();
}
return encrytedSignature;
}
```
```python Python theme={"dark"}
from cashfree_sdk.payouts import Payouts
// Initialise the SDK, pass public key for dynamic IP
Payouts.init("", "", "PROD", public_key= b'public key')
```
```javascript Node theme={"dark"}
//require CashfreeSDK
const cfSdk = require('cashfree-sdk');
//access the PayoutsSdk from CashfreeSDK
const {Payouts} = cfSdk;
// Instantiate Cashfree Payouts
const payoutsInstance = new Payouts({
env: 'TEST',
clientId: '',
clientSecret: '',
pathToPublicKey: '/path/to/your/public/key/file.pem',
//"publicKey": "ALTERNATIVE TO SPECIFYING PATH (DIRECTLY PASTE PublicKey)"
});
```
# Batch Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/batch-transfer
post /payout/v1/requestBatchTransfer
Use this API to create multiple transfers to multiple beneficiaries. This API accepts an array of transfer objects under the batch field.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
Get Batch Transfer Status
Use the [Get Batch Transfer Status](https://docs.cashfree.com/reference/get-batch-transfer-status) API to get the status of the batch transfer request. The Get Transfer Status API does not give you the status of the batch transfer requests. Read the [batch transfer document](https://docs.cashfree.com/docs/batch-transfer-1) to understand the flow of the API.
| Value | Description |
| :- | :- |
| BENEFICIARY\_ID | With this value, beneId and transferMode must be passed in the transfer object within the batch array alphanumeric and underscore allowed (60 character limit) If batchFormat is set to any of the below values, transfers will only be processed via specified mode. |
| BANK\_ACCOUNT | With this value, Additional details such as bankAccount, ifsc, name, email, phone must be passed in the transfer object within the batch array |
| UPI | With this value, Additional details such as vpa, name, email, phone must be passed in the transfer object within the batch array |
| PAYTM | With this value, Additional details such as name, email, phone must be passed in the transfer object within the batch array |
| AMAZONPAY | With this value, Additional details such as name, email, phone must be passed in the transfer object within the batch array |
| **Field name** | **Description** |
| - | - |
| transferId | A unique transfer id. |
| amount | Amount to be transferred. |
| beneId | The ID of the beneficiary. This field must be passed if the batch format option is BENEFICIARY\_ID. |
| transferMode | Required only when batchFormat is set to BENEFICIARY\_ID, mode of transfer for each transfer in batch needs to be set. Allowed values are: banktransfer, upi, paytm, and amazonpay |
| bankAccount | Bank account number for payout. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| ifsc | IFSC of the corresponding bank account. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| vpa \[optional] | VPA of the corresponding user. This field must be passed if the batch format option is UPI. |
| name | Name of the account holder. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| email \[optional] | Email of the beneficiary. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| phone | The phone of the beneficiary. This field must be passed if the batch format option is BANK\_ACCOUNT/PAYTM/AMAZONPAY. |
| remarks \[optional] | Remarks, if any. |
Currently, batch transfer supports transfers to bank accounts, UPI, Paytm, and Amazon Pay. If the beneficiary object does not have valid details attached to it, the transfer fails.
| Sub code | Status | Message | Solution |
| :- | :- | :- | :- |
| 200 | SUCCESS | Batch Transfer requested successfully. Please check later for processing status. | |
| 202 | PENDING | Request received. Please check status after some time. | |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | Permission Denied | |
| 409 | ERROR | Invalid Batch Format | Enter a valid batch transfer ID. |
| 409 | ERROR | Batch TransferId already exists | Enter a different batch transfer ID. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the request. |
| 422 | ERROR | Batch transfer id is missing | Enter a valid batch transfer ID. |
| 422 | ERROR | Invalid Batch Transfer Id provided | Enter a valid batch transfer ID. |
| 422 | ERROR | The maximum number of entries allowed per file is 500, please try again. | Enter only a maximum of 500 entries per file. |
| 422 | ERROR | Batch format is missing | Enter valid batch format details. |
| 422 | ERROR | Transfer Parameters missing in the request | |
| 422 | ERROR | Please provide at least one transfer entry | Enter at least one transfer entry. |
| 520 | ERROR | Unknown error occurred at batchTransfer | |
| 520 | ERROR | Batch Transfer request failed | |
| 520 | ERROR | Error in batch transfer | |
| 520 | ERROR | Unknown error occurred | |
# Batch Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/batch-transfer-v12
post /payout/v1.2/requestBatchTransfer
Use this API to create transfers to multiple beneficiaries. This API accepts an array of transfer objects under the batch field.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
**Get Batch Transfer Status**
Use the [Get Batch Transfer Status V1.2](https://docs.cashfree.com/reference/get-batch-transfer-status-v1-2) API to get the status of the batch transfer request. The Get Transfer Status V1.2 API does not give you the status of the batch transfer requests. Read the [batch transfer document](https://docs.cashfree.com/docs/batch-transfer-1) to understand the flow of the API.
| Value | Description |
| :- | :- |
| BENEFICIARY\_ID | With this value, beneId and transferMode must be passed in the transfer object within the batch array alphanumeric and underscore allowed (60 character limit) If batchFormat is set to any of the below values, transfers will only be processed via specified mode. |
| BANK\_ACCOUNT | With this value, Additional details such as bankAccount, ifsc, name, email, phone must be passed in the transfer object within the batch array |
| UPI | With this value, Additional details such as vpa, name, email, phone must be passed in the transfer object within the batch array |
| PAYTM | With this value, Additional details such as name, email, phone must be passed in the transfer object within the batch array |
| AMAZONPAY | With this value, Additional details such as name, email, phone must be passed in the transfer object within the batch array |
| Field name | Description |
| - | - |
| transferId | A unique transfer id. |
| amount | Amount to be transferred. |
| beneId | The ID of the beneficiary. This field must be passed if the batch format option is BENEFICIARY\_ID. |
| transferMode | Required only when batchFormat is set to BENEFICIARY\_ID, mode of transfer for each transfer in batch needs to be set. |
| | Allowed values are: banktransfer, upi, paytm, and amazonpay. |
| bankAccount | Bank account number for payout. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| ifsc | IFSC of the corresponding bank account. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| vpa \[optional] | VPA of the corresponding user. This field must be passed if the batch format option is UPI. |
| name | Name of the account holder. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| email \[optional] | Email of the beneficiary. This field must be passed if the batch format option is BANK\_ACCOUNT. |
| phone | The phone of the beneficiary. This field must be passed if the batch format option is BANK\_ACCOUNT/PAYTM/AMAZONPAY. |
| remarks \[optional] | Remarks, if any. |
Currently, batch transfer supports transfers to bank accounts, UPI, Paytm, and Amazon Pay. If the beneficiary object does not have valid details attached to it, the transfer fails.
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Batch Transfer requested successfully. Please check later for processing status. | - |
| 200 | SUCCESS | beneficiary already exists with a different name. Please delete | |
| 202 | PENDING | Request received. Please check status after some time. | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | Permission Denied | |
| 409 | ERROR | Invalid Batch Format | Enter valid batch format details. |
| 409 | ERROR | Batch TransferId already exists | Enter a valid batch transfer ID. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the request. |
| 422 | ERROR | Batch transfer id is missing | Enter a valid batch transfer ID. |
| 422 | ERROR | Batch format is missing | Enter valid batch format details. |
| 422 | ERROR | Invalid Batch Transfer Id provided | Enter a valid batch transfer ID. |
| 422 | ERROR | Please provide at least one transfer entry | Enter at least one transfer entry. |
| 422 | ERROR | The maximum number of entries allowed per file is 500, please try again. | Enter only a maximum of 500 entries per file. |
| 422 | ERROR | Transfer Parameters missing in the request | Enter all the required transfer parameters in the request. |
| 520 | ERROR | Unknown error occurred at batchTransfer | |
| 520 | ERROR | Batch Transfer request failed | |
| 520 | ERROR | Error in batch transfer | |
| 520 | ERROR | Unknown error occurred | |
# CardPay
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/cardpay
post /payout/v1/cardpay
Use this API to transfer money to beneficiary cards. Provide details such as beneficiary name, card type, network type, and transfer ID.
You need to pass the tokenised card number or card token for this transfer.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Test token | Response in UAT |
| :- | :- |
| 4895379990484220 | SUCCESS |
| 5480981500100002 | SUCCESS |
| 5480981500100003 | FAILURE |
| 4895379990484221 | FAILURE |
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully | None |
| 201 | PENDING | Transfer request pending at the bank | None |
| 400 | ERROR | Transfer Id already exists | Provide a different transfer ID |
| 403 | ERROR | Token is not valid | Validate the token |
| 403 | ERROR | APIs not enabled. Please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) | Please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) |
| 412 | ERROR | Not enough available balance in the account | Try again with sufficient account balance |
| 422 | ERROR | Please provide valid token details | Provide a valid token |
| 422 | ERROR | amount should be at least 1.0 | Enter a transfer amount that is equal to or more than Rs. 1. |
| 422 | ERROR | Invalid bank account number or ifsc provided | Provide valid bank account details |
| 422 | ERROR | Please provide a valid Name | Provide a valid name |
| 422 | ERROR | Please provide a valid networkType | Provide a valid network type |
| 422 | ERROR | cardType is invalid | Provide a valid card type |
| 422 | ERROR | transferId can contain only alphabets, numbers, hyphen and underscore | Provide a valid transfer ID |
# Postman Collection
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/cashgram-postman-collection
Download the Cashfree Cashgram Postman collection, import it into Postman, and start trying Cashgram API requests against sandbox without writing code.
Get started quickly with Cashfree's Cashgram APIs by downloading the collection and importing it in Postman.
[Download Cashfree Cashgram Postman Collection](https://gocashassets.s3.ap-south-1.amazonaws.com/repostmancollection/Cashfree_Cashgram_Collection.json.zip)
# Create Cashgram
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/create-cashgram
post /payout/v1/createCashgram
Use this API to create a Cashgram.
# Deactivate Cashgram
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/deactivate-cashgram
post /payout/v1/deactivateCashgram
# Direct Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/direct-transfer
post /payout/v1/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. | - |
| 201 | SUCCESS | Transfer Scheduled for next working day. | - |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. | - |
| 201 | PENDING | Transfer request pending at the bank. | - |
| 202 | PENDING | Request received. Please check status after some time. | - |
| 400/520 | ERROR | Transfer attempt failed at the bank. | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 403 | ERROR | This feature is not available for your account. | - |
| 403 | ERROR | Transfer mode is not available for your account. | Enter a different transfer mode. |
| 403 | ERROR | Transfer to this beneficiary not allowed. | Enter different beneficiary details. |
| 404 | ERROR | Beneficiary does not exist. | Enter a valid beneficiary ID. |
| 409 | ERROR | Transfer Id already exists. | Enter a different transfer ID. |
| 412 | ERROR | Token missing in the request. | Enter a valid token in the API request. |
| 412 | ERROR | BeneId missing in the request. | Enter a valid beneficiary ID. |
| 412 | ERROR | Amount missing in the request. | Enter a valid transfer amount. |
| 412 | ERROR | TransferId missing in the request. | Enter a valid transfer ID. |
| 412 | ERROR | Invalid Tag passed in the request. | |
| 412 | ERROR | Invalid transfer mode passed in the request. | |
| 412 | ERROR | Transfer mode not enabled for the account. | |
| 412 | ERROR | Transfer limit for your account exceeded. | |
| 412 | ERROR | Transfer limit for beneficiary exceeded. | |
| 412 | ERROR | Not enough available balance in the account. | Retry with sufficient balance in your account. |
| 412 | ERROR | Please wait 30 minutes after adding the beneficiary. | - |
| 412 | ERROR | Transfer amount is less than minimum amount of Rs. 100. | Enter a transfer amount that is equal to or more than Rs. 100. |
| 412 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. | Enter a transfer amount that is equal to or less than Rs. 100000. |
| 422 | ERROR | Invalid IFSC code provided for bank account. | Enter a valid IFSC for the provided bank account details. |
| 422 | ERROR | Invalid bank account number or IFSC provided. | Enter valid bank account details. |
| 422 | ERROR | Transfer request to paytm wallet failed. | |
| 422 | ERROR | No Bank account or IFSC associated with the beneficiary. | Enter valid bank account details of the beneficiary. |
| 422 | ERROR | Invalid transferId passed. | Enter a valid transferId. |
| 422 | ERROR | Beneficiary details not valid. | Enter valid beneficiary details. |
| 422 | ERROR | Remarks can have only numbers, alphabets and whitespaces. | - |
| 422 | ERROR | Invalid amount passed. | Enter a valid transfer amount. |
| 422 | ERROR | No Payee Virtual Address associated with the beneficiary. | |
| 520 | ERROR | Transfer request triggered. No response from bank. | |
# Direct Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/direct-transfer-v12
post /payout/v1.2/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. | - |
| 201 | SUCCESS | Transfer Scheduled for next working day. | - |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. | - |
| 201 | PENDING | Transfer request pending at the bank. | - |
| 202 | PENDING | Request received. Please check status after some time. | - |
| 400 | ERROR | Multiple PaymentInstruments available for this payment mode. | - |
| 400 | ERROR | Specified paymentInstrumentId not valid for this payment mode. | - |
| 400 | ERROR | Specified paymentInstrumentId not available. | Enter a different paymentInstrumentId. |
| 400 | ERROR | Transfer attempt failed at the bank. | - |
| 403 | ERROR | Token is not valid | Verify the generated token |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address |
| 403 | ERROR | Transfer to this beneficiary not allowed. | Enter different beneficiary details |
| 403 | ERROR | This feature is not available for your account. | |
| 403 | ERROR | Transfer mode is not available for your account. | Enter a different transfer mode. |
| 404 | ERROR | Beneficiary does not exist. | Enter a valid beneficiary ID. |
| 409 | ERROR | Transfer Id already exists. | Enter a different transfer ID. |
| 412 | ERROR | Token missing in the request. | Enter a valid token in the API request. |
| 412 | ERROR | BeneId missing in the request. | Enter a valid beneficiary ID. |
| 412 | ERROR | Amount missing in the request. | Enter a valid transfer amount. |
| 412 | ERROR | TransferId missing in the request. | Enter a valid transfer ID. |
| 412 | ERROR | Please wait 30 minutes after adding the beneficiary. | - |
| 412 | ERROR | Transfer amount is less than minimum amount of Rs. 100. | Enter a transfer amount that is equal to or more than Rs. 100. |
| 412 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. | Enter a transfer amount that is equal to or less than Rs. 100000. |
| 412 | ERROR | Transfer limit for beneficiary exceeded. | |
| 412 | ERROR | Transfer limit for your account exceeded. | |
| 412 | ERROR | Not enough available balance in the account. | Retry with sufficient balance in your account. |
| 412 | ERROR | Invalid Tag passed in the request. | |
| 412 | ERROR | Transfer mode not enabled for the account. | |
| 412 | ERROR | Invalid transfer mode passed in the request. | |
| 422 | ERROR | Invalid amount passed. | Enter a valid transfer amount. |
| 422 | ERROR | Invalid transferId passed. | Enter a valid transferId. |
| 422 | ERROR | No Payee Virtual Address associated with the beneficiary. | |
| 422 | ERROR | Remarks can have only numbers, alphabets and whitespaces. | |
| 422 | ERROR | Beneficiary details not valid. | Enter valid beneficiary details. |
| 422 | ERROR | No Bank account or IFSC associated with the beneficiary. | Enter valid bank account details of the beneficiary. |
| 422 | ERROR | Transfer request to paytm wallet failed. | |
| 422 | ERROR | Invalid IFSC code provided for bank account. | Enter a valid IFSC for the provided bank account details. |
| 422 | ERROR | Invalid bank account number or IFSC provided. | Enter valid bank account details. |
| 520 | ERROR | Transfer request triggered. No response from bank. | |
# End Points
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/end-points
Find the production and sandbox base URLs for Cashfree Payouts v1 APIs, plus the credentials verification endpoint you use to validate your AppId and SecretKey.
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you will be able to see your AppId and SecretKey.
Cashfree expects API key to be included in all API requests to the server. Use the endpoint **/api/v1/credentials/verify** to verify your credentials.
| Environment | Base URL |
| :- | :- |
| Production | [https://payout-api.cashfree.com](https://payout-api.cashfree.com) |
| Test | [https://payout-gamma.cashfree.com](https://payout-gamma.cashfree.com) |
# Get Balance
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-balance
get /payout/v1/getBalance
Use this API to get the ledger balance and available balance of your account. Available balance is ledger balance minus the sum of all pending transfers (transfers triggered and processing or pending now).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Solution |
| :- | :- | :- | :- |
| 200 | SUCCESS | Ledger balance for the account | |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 412 | ERROR | Token missing in the request | Enter the generated token as the value for Authorization under Headers in this format: Bearer \. |
# Get Balance V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-balance-v12
get /payout/v1.2/getBalance
Use this API to get the ledger balance and available balance of your account. Available balance is ledger balance minus the sum of all pending transfers (transfers triggered and processing or pending now).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
# Get Batch Transfer Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-batch-transfer-status
get /payout/v1/getBatchTransferStatus
Use this API to get the status of the Batch Transfer.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message |
| :- | :- | :- |
| 200 | SUCCESS | Data retrieved successfully |
| 201 | PENDING | Entries are not processed yet |
| 403 | ERROR | Token is not valid |
| 403 | ERROR | IP not whitelisted |
| 404 | ERROR | Bulk Transfer Id does not exist |
| 412 | ERROR | Token missing in the request |
| 520 | ERROR | Error while fetching data |
| 520 | ERROR | Unknown error occurred at batchTransfer |
# Get Batch Transfer Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-batch-transfer-status-1
get /payout/v1.3/getBatchTransferStatus
Use this API to get the status of the Batch Transfer.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
# Get Batch Transfer Status V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-batch-transfer-status-v12
get /payout/v1.2/getBatchTransferStatus
Use this API to get the status of the Batch Transfer.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Data retrieved successfully | - |
| 201 | PENDING | Entries are not processed yet | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | Bulk Transfer Id does not exist | Enter a valid batch transfer ID. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the request. |
| 520 | ERROR | Error while fetching data | |
| 520 | ERROR | Unknown error occurred at batchTransfer | |
# Get Beneficiary Details
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-beneficiary-details
get /payout/v1/getBeneficiary/{beneId}
Use this API to get the details of a particular beneficiary in your account.
This API will be retired soon. Please plan to migrate to the latest version, [Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Details of beneficiary | - |
| 403 | ERROR | Token is not valid | Verify the generated token |
| 404 | ERROR | Beneficiary does not exist | Provide a valid beneficiary ID |
| 412 | ERROR | Token missing in the request | Enter the generated token as the value for Authorization under Headers in this format: `Bearer `. |
# Get Beneficiary History
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-beneficiary-history
get /payout/v1/beneHistory
Use this API to fetch the transaction history for a particular beneficiary and for a desired period of time.
This API will be retired soon. Please plan to migrate to the latest version, [Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Solution |
| :- | :- | :- | :- |
| 200 | SUCCESS | Data retrieved successfully. | - |
| 403 | ERROR | Token is invalid. | Validate the generated token. |
| 405 | ERROR | Invalid request URL or HTTP method. | |
| 422 | ERROR | Requested date range is invalid. | Enter a valid date rage. |
| 422 | ERROR | Page value should be minimum 1. | Enter the page value as 1. |
| 422 | ERROR | Please provide a valid Beneficiary Id. | Enter a valid beneficiary ID. |
| 422 | ERROR | startDate should be of format yyyy-mm-dd | Enter the date range in the format: yyyy-mm-dd. |
| 422 | ERROR | endDate should be of format yyyy-mm-dd | Enter the date range in the format: yyyy-mm-dd. |
| 422 | ERROR | startDate should be less than or equal to EndDate | Enter a startDate value lesser than or equal to endDate. |
| 422 | ERROR | perPage should be at max 25 | Enter the perPage value lesser than or equal to 25. |
| 429 | ERROR | Too many requests. | |
| 520 | ERROR | Unknown error occurred. | Try again after some time. |
# Get Beneficiary ID
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-beneficiary-id
get /payout/v1/getBeneId
Use this API to get the beneficiary ID by providing the bank account number and ifsc.
This API will be retired soon. Please plan to migrate to the latest version, [Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | BeneId retrieved successfully | - |
| 52 | ERROR | Error while fetching beneId | Retry or try again after some time. |
| 403 | ERROR | Token is not valid | Validate the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | Beneficiary not found with given bank account details | Enter a valid bank account number and IFSC. |
| 412 | ERROR | Token missing in the request | Enter the generated token as the value for Authorization under Headers in this format: `Bearer `. |
| 422 | ERROR | Please provide a valid bank account and ifsc | Enter a valid bank account number and IFSC. |
| 422 | ERROR | Please provide both bank account and ifsc | Enter both the bank account number and IFSC. |
| 422 | ERROR | Please provide a valid ifsc | Enter a valid IFSC. |
# Get Cashgram Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-cashgram-status
get /payout/v1/getCashgramStatus
Use this API to get the status of the Cashgram created.
# Get Incidents
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-incidents
get /payout/v1/incidents
Use this API to get the list of incidents on banks(Resolved,Unresolved,All) for a given time range.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Status | Sub code | Message | |
| - | - | - | - |
| SUCCESS | 200 | List of incidents retrieved | |
| ERROR | 403 | Token is not valid | |
| ERROR | 403 | IP Not Whitelisted | |
| ERROR | 403 | APIs not enabled. Please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) | |
| ERROR | 412 | Token missing in the request | |
| ERROR | 422 | Status is invalid | |
| ERROR | 422 | startTime should be less than or equal to EndTime. | |
| ERROR | 422 | Maximum time difference can be up to 7 days and startTime should be within 90 days from now. | |
| ERROR | 422 | startTime should be of the format yyyy-mm-dd | |
| hh:mm:ss | | | |
| ERROR | 422 | endTime should be of the format yyyy-mm-dd | |
| hh:mm:ss | | | |
| ERROR | 520 | Unknown error occurred! | |
# Get Transfer Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-transfer-status
get /payout/v1.1/getTransferStatus
Use these details to get details of a particular transfer. You can pass referenceId or transferId to fetch the details.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Solution |
| :- | :- | :- | :- |
| 200 | SUCCESS | Details of transfer with referenceId (or transferId) XXXX | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | TransferId is invalid or does not exist | Enter a valid transfer ID. |
| 404 | ERROR | ReferenceId is invalid or does not exist | Enter a valid reference ID. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the request. |
| 422 | ERROR | Please provide referenceId or transferId to fetch details | Enter a valid reference or transferId. |
| /520 | ERROR | Unknown error occurred | Try again after some time. |
| Reason (in API response) | Category | Description | Solution |
| :- | :- | :- | :- |
| BANK\_GATEWAY\_ERROR | Bank | Technical error at the bank | |
| SOURCE\_BANK\_DECLINED | Bank | TPS exceeded at the bank/NPCI | |
| FAILED | Bank | No explicit failure reason from the bank | |
| INVALID\_AMOUNT\_FAIL | Merchant | Amount is invalid for the given transfer mode | Enter a valid transfer amount. |
| INVALID\_AMOUNT\_FAIL | Customer | Bank account is invalid | Enter valid bank account details. |
| INVALID\_REQUEST | Merchant | Request is invalid | |
| RETURNED\_FROM\_BENEFICIARY | Bank | Immediate reversal from the beneficiary bank | |
| INSUFFICIENT\_BALANCE | Merchant | Balance is exhausted, need to add funds | |
| IMPS\_MODE\_FAIL | Bank | IMPS mode not supported for the beneficiary | |
| RTGS\_MODE\_FAIL | Bank | RTGS mode not supported (only for RTGS) | |
| REINITIALIZE\_TRANSFER\_LATER | Bank | Technical error at the bank, retry later | |
| NRE\_ACCOUNT\_FAIL | Customer | Customer bank account is an NRE account | |
| ACCOUNT\_BLOCKED | Customer | Customer bank account is blocked | |
| DEST\_LIMIT\_REACHED | Bank | Transfer limit to beneficiary exceeded | |
| INVALID\_MODE\_FAIL | Bank | Transfer mode not valid for beneficiary | Enter a different transfer mode. |
| NPCI\_UNAVAILABLE | Bank | NPCI in unavailable | |
| BENEFICIARY\_BANK\_OFFLINE | Bank | Beneficiary bank is offline | |
| Reason (in API response) | Category | Description | Solution |
| :- | :- | :- | :- |
| ACCOUNT\_FROZEN\_OR\_CLOSED | Customer | Account is closed or frozen | |
| CREDIT\_LIMIT\_EXCEEDED | Customer | Transfer limit to beneficiary exceeded | |
| ACCOUNT\_CLOSED\_OR\_FROZEN | Customer | Transfer limit to beneficiary exceeded | |
| ACCOUNT\_ON\_HOLD | Customer | Account is temporarily on hold | |
| ACCOUNT\_FROZEN | Customer | Account is frozen | |
| IFSC\_DOES\_NOT\_MATCH | Customer | IFSC does not match | Enter a valid IFSC. |
| FRAUD\_REVERSED | Customer | Suspect fraudulent transfer | |
| ANY OTHER REASON | Bank | Reason not specified by bank | |
| INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Customer | Invalid account | |
| ACCOUNT\_CLOSED | Customer | Account is closed | |
| ACCOUNT\_FROZEN\_OR\_BLOCKED | Customer | Account is frozen or blocked | |
| BENEFICIARY\_NAME\_DIFFERS | Customer | Beneficiary name does not match (only for NEFT) | |
| BENEFICIARY\_BANK\_NODE\_OFFLINE | Bank | Beneficiary bank offline | |
| ACCOUNT\_DOES\_NOT\_EXIST | Customer | Account does not exist | Enter valid bank account details. |
# Get Transfer Status V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/get-transfer-status-v12
get /payout/v1.2/getTransferStatus
Use these details to get details of a particular transfer. You can pass referenceId or transferId to fetch the details.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Details of transfer with referenceId (or transferId) XXXX | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | ReferenceId is invalid or does not exist | Enter a valid reference ID. |
| 404 | ERROR | TransferId is invalid or does not exist | Enter a valid transfer ID. |
| 412 | ERROR | Token missing in the request | Enter a valid token in the API request. |
| 422 | ERROR | Please provide referenceId or transferId to fetch details | Enter a valid referenceId or transferId. |
| 520 | ERROR | Unknown error occurred | Try again after some time. |
FAILED / REJECTED / REVERSED Reasons (**reason** field will be available only for these 3 statuses)
| Reason (in API response) | Category | Description | Next action |
| :- | :- | :- | :- |
| BANK\_GATEWAY\_ERROR | Bank | Technical error at the bank | |
| BENE\_BANK\_DECLINED | Bank | Rejected by Beneficiary bank due to business reasons | |
| FAILED | Bank | No explicit failure reason from the bank | |
| INVALID\_IFSC\_FAIL | Customer | Invalid ifsc code provided for bank account | Enter a valid IFSC. |
| INVALID\_ACCOUNT\_FAIL | Customer | Bank account is invalid | Enter valid bank account information. |
| RETURNED\_FROM\_BENEFICIARY | Bank | Immediate reversal from the beneficiary bank | |
| INSUFFICIENT\_BALANCE | Merchant | Merchant balance is exhausted, need to add funds | |
| IMPS\_MODE\_FAIL | Bank | IMPS mode not supported for the beneficiary | |
| RTGS\_MODE\_FAIL | Bank | RTGS mode not supported (only for RTGS) | |
| REINITIALIZE\_TRANSFER\_LATER | Bank | Technical error at the bank, retry later | Retry after some time. |
| NRE\_ACCOUNT\_FAIL | Customer | Customer bank account is an NRE account | |
| ACCOUNT\_BLOCKED | Customer | Customer bank account is blocked | |
| DEST\_LIMIT\_REACHED | Bank | Transfer limit to beneficiary exceeded | |
| INVALID\_MODE\_FAIL | Bank | Transfer mode not valid for beneficiary | |
| NPCI\_UNAVAILABLE | Bank | NPCI in unavailable | |
| BENEFICIARY\_BANK\_OFFLINE | Bank | Beneficiary bank is offline | |
| INVALID\_AMOUNT\_FAIL | Merchant | Amount is invalid for the given transfer mode | Enter a valid amount for the provided transfer mode. |
| SUSPECTED\_TRANSFER | Customer | Suspicious transfer identified | |
| BENE\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records | Enter the beneficiary name as per bank records. |
| DISABLED\_MODE | Merchant | Transfer mode not enabled for the account | Enter a different transfer mode for the account or enable the transfer mode before initiating the transfer request. |
| AMAZON\_AMOUNT\_EXCEED | Merchant | Amount should be less than 10000 for Amazon Pay mode | Enter a transfer amount that is lesser than Rs. 10000. |
| BENEFICIARY\_BLACKLISTED | Merchant | Beneficiary is blacklisted | Enter a beneficiary that is not in the blacklist. |
| PAYOUT\_INACTIVE | Merchant | Payout account is not active | |
| INVALID\_TRANSFER\_AMOUNT | Merchant | Transfer amount is invalid | Enter a valid transfer amount. |
| BENEFICIARY\_NOT\_EXIST | Merchant | Beneficiary does not exist | Enter valid beneficiary details. |
| BENEFICIARY\_INVALID\_MODE | Merchant | Mode Not valid for Beneficiary | Enter a different transfer mode for the specified beneficiary. |
| INVALID\_BENE\_ACCOUNT\_OR\_IFSC | Merchant | Invalid bank account number or ifsc provided | Enter a valid bank account number or IFSC. |
| BENEFICIARY\_NAME\_DIFFERS | Customer | Beneficiary name not matching with bank records | Enter the beneficiary name as per bank records. |
| ANY\_OTHER\_REASON | Bank | No reason provided for the failure/reversal | |
| INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Customer | Invalid account | |
| Transfer status | Description |
| :- | :- |
| SUCCESS | Transfer completed successfully. Acknowledged flag in the response tells whether the beneficiary bank has provided acknowledgement of the transfer request. |
| ERROR | There was an error while requesting the transfer. See sub status code received for more details on why the error occurred. Example: Wrong IFSC. |
| FAILED | The transfer has failed. |
| PENDING | The request is getting processed. Query transfer status (/getTransferStatus) after some time to see whether the request was successful/failed. |
| REVERSED | Transfer rejected by the beneficiary bank. The payout balance gets credited back with the amount charged. You don't receive this when you are attempting a transfer but might see this when querying for transfer status (after a couple of hours). Configure the webhook endpoint to be notified in such cases. |
# Getting Started
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/getting-started-with-payouts-apis
Set up sandbox credentials, IP whitelisting, and the production environment so you can test and go live with the Cashfree Payouts v1 APIs and SDKs.
1. [Download Postman Collection](#download-postman-collection)
2. [View End Points](#view-end-points)
3. [Generate API Keys](#generate-api-keys)
4. [Whitelist IP Address](#whitelist-your-ip-address) / [Generate Signature](#generate-signature)
5. [Any Queries: Contact Us](#any-queries-contact-us)
***
## Download Postman collection
This collection can save you time because of easy access to different requests.
[Download Cashfree Payouts Postman Collection](https://gocashassets.s3.ap-south-1.amazonaws.com/repostmancollection/Cashfree_Payouts_Collection.json.zip)
***
## View end points
| Environment | Base URL |
| :- | :- |
| Production | [https://payout-api.cashfree.com](https://payout-api.cashfree.com) |
| Test | [https://payout-gamma.cashfree.com](https://payout-gamma.cashfree.com) |
Cashfree uses unique identifiers to allow access to the API. Once you have signed up at our merchant site, you can see your **AppId** and **SecretKey**. Each API request to the server requires these credentials.
Use this endpoint to verify your credentials: /api/v1/credentials/verify
***
## Generate API keys
Follow the instructions below to generate API keys:
1. From the Payouts dashboard, click **Developers** on the navigation panel.
2. Click **API Keys**.
3. Click **Generate API Keys** from the *API Keys* screen.
4. The *New API Keys* popup displays with the client ID and client secret information.
5. Click **Download API Keys** to download the information and save them in your local system folder. Do not share the keys with anyone because they are confidential. You can generate a maximum of 10 API keys.
API Keys - Production Environment: You need to perform an OTP authentication
to generate API keys for production environment.
***
## Identity verification
Whitelisting the IP address or generating a signature provides a layer of authentication. These cybersecurity techniques prevent anonymous or unknown disbursement requests and allow only verified requests.
### Whitelist your IP address
Your IP address needs to be whitelisted in the Cashfree production server or it rejects all incoming requests.
Only the production environment needs approval from Cashfree and not
for the test environment.
Follow the instructions below to whitelist your IP:
1. From the \_Payout\_s dashboard, click **Developers** > **Two-Factor Authentication**.
2. Choose **IP Whitelist** from the *Select 2FA Method* drop-down.
3. Click **Add IP Address**.
4. Enter the IP address you want to whitelist in the respective field and click **Add IP Address** to save the details. Note that the IPv4 has to be whitelisted, and not IPv6. The whitelisted IPs are displayed in the grid as shown below. You can whitelist a maximum of 25 IPs.
### Generate signature
To generate a signature, you need to generate the public key. You then use the generated public key to generate the signature.
#### Generate public key
1. From the *Payouts* dashboard, click **Developers** > **Two-Factor Authentication**.
2. Select **Public Key** from the *Select 2FA Method* drop-down.
3. Click **Generate Public Key**.
4. The public key is downloaded to your computer. Use your registered email ID to access the key.
#### Generate signature
Below are the steps to generate your signature:
1. Retrieve your clientId (one which you are passing through the header X-Client-Id )
2. Append this with CURRENT UNIX timestamp separated by a period (.)
3. Encrypt this data using RSA encrypt with Public key you received – this is the signature.
4. Pass this signature through the header X-Cf-Signature.
In the case of using our library, go through the libraries section. During the initialization process, you need to pass the key as a parameter.
```php PHP theme={"dark"}
[](?php
public static function getSignature() {
$clientId = "[](your clientId here>";
$publicKey =
openssl_pkey_get_public(file_get_contents("/path/to/certificate/public
_key.pem"));
$encodedData = $clientId.".".strtotime("now");
return static::encrypt_RSA($encodedData, $publicKey);
}
private static function encrypt_RSA($plainData, $publicKey) { if (openssl_public_encrypt($plainData, $encrypted, $publicKey,
OPENSSL_PKCS1_OAEP_PADDING))
$encryptedData = base64_encode($encrypted);
else return NULL;
return $encryptedData;
}
?>
```
```java Java theme={"dark"}
private static String generateEncryptedSignature(String clientIdWithEpochTimestamp) {
// String clientIdWithEpochTimeStamp = clientId+"."+Instant.now().getEpochSecond();
String encrytedSignature = "";
try {
byte[] keyBytes = Files
.readAllBytes(new File("/Users/sameera/Downloads/payout_test_public_key.pem").toPath()); // Absolute Path to be replaced
String publicKeyContent = new String(keyBytes);
System.out.println(publicKeyContent);
publicKeyContent = publicKeyContent.replaceAll("[\\t\\n\\r]", "")
.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
System.out.println(publicKeyContent);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(
Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encrytedSignature = Base64.getEncoder().encodeToString(cipher.doFinal(clientIdWithEpochTimestamp.getBytes()));
System.out.println(encrytedSignature);
} catch (Exception e) {
e.printStackTrace();
}
return encrytedSignature;
}
```
```python Python theme={"dark"}
from cashfree_sdk.payouts import Payouts
// Initialise the SDK, pass public key for dynamic IP
Payouts.init("[](client_id>", "[](client_secret>", "PROD", public_key= b'public key')
```
```javascript Node theme={"dark"}
//require CashfreeSDK
const cfSdk = require("cashfree-sdk");
//access the PayoutsSdk from CashfreeSDK
const { Payouts } = cfSdk;
// Instantiate Cashfree Payouts
const payoutsInstance = new Payouts({
env: "TEST",
clientId: "[](CLIENT_ID>",
clientSecret: "[](CLIENT_SECRET>",
pathToPublicKey: "/path/to/your/public/key/file.pem",
//"publicKey": "ALTERNATIVE TO SPECIFYING PATH (DIRECTLY PASTE PublicKey)"
});
```
***
## Any queries: Contact us
For identifying, diagnosing, and resolving problems related to API requests, ensure the information below is communicated while contacting us:
* Share the API request and response details along with only **x-client-ID**.
* Mention the registered email ID and environment in the email.
* Use your registered email address (with Cashfree) to send the email or mention the registered email address.
* Include your account manager in the CC of the email request.
For dashboard queries, share the screenshot and .har file of the screen.
# Internal Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/internal-transfer
post /payout/v1/internalTransfer
Use this API to request an internal transfer at Cashfree. The internal transfer API is useful for multiple Payouts accounts. The API response will either result in an ERROR or SUCCESS response.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
# Internal Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/internal-transfer-v12
post /payout/v1.2/internalTransfer
Use this API to request an internal transfer. It is useful for accounts with multiple fund sources. You need to provide either the rechargeAccount or paymentInstrumentId and toPaymentInstrumentId along with the amount.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
# Lend
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/lend
post /payout/v1/lend
Use this API to send requests for loan disbursement to the beneficiary. The service charges are pooled for the respective party and disbursed at the end of day. Disbursement amount = (Amount - total service charges).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully | None |
| 201 | PENDING | Transfer request pending at the bank | None |
| 400 | ERROR | beneId is missing in the request | Enter a beneId in the request |
| 400 | ERROR | Total service charge is greater than disbursal amount | Enter valid amount which is greater than sum of service charges |
| 400 | ERROR | Insufficient balance in LENDER fundsource | Lender needs to recharges their CF wallet |
| 403 | ERROR | APIs not enabled. Please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) | Please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) |
| 422 | ERROR | Please provide valid token details | Provide a valid token |
| 422 | ERROR | amount should be at least 1.0 | Enter a transfer amount that is equal to or more than Rs. 1. |
| 422 | ERROR | Invalid bank account number or ifsc provided | Provide valid bank account details |
# Add Registered Recharge Account(Whitelist Bank Account)
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/add-registered-recharge-accountwhitelist-bank-account
post /v1/whitelisted-bank-accounts
# Create Virtual Account
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/create-virtual-account
post /fundsources/connected/virtual-account
Use this API to create a virtual account that helps streamline the management of funds, enhance tracking capabilities, and simplify the financial process.
# Debit Connected Wallet
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/debit-connected-wallet
post /payout/v1/connected-wallet/debit
# Get Account Statement
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/get-account-statement
get /v1/accountStatement
Use this API to fetch the account statement of the virtual account in a paginated format using cursor-based pagination.
# Get Fund Source Details
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/get-fund-source-details
get /v1/fundsources/{paymentInstrumentId}
Use this API to get the details of the fund source.
# Allocate Funds to Virtual Account
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/recharge-oneescrow-account
post /v1/connected-wallet/recharge
Use this API to recharge the OneEscrow account (notional credit) using a payment instrument.
# Transfer Funds Between VAs
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/oneescrow/transfer-funds-between-vas
post /v1.2/internalTransfer
Use this API to transfer funds between virtual accounts (VAs).
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/payouts-api-overview
Use Cashfree Payouts v1 APIs to send funds to bank accounts, UPI IDs, cards, and wallets, with sandbox and production keys, request parameters, and error codes.
**You can perform the following tasks using the Payouts API:**
* Add and manage your beneficiaries efficiently
* Transfer money to your beneficiaries' accounts using different transfer methods
* Track the transfer status
* Check the ledger and available balance instantly
Use the [V2 version](/docs/api-reference/payouts/v2/payouts-api-v2-new) of the Payouts APIs if you are starting a new integration. V1 is a legacy version.
## Beneficiary APIs
| API name | Description |
| :- | :- |
| [Add Beneficiary](/docs/api-reference/payouts/v1/add-beneficiary) | Add a beneficiary to your Payouts account. |
| [Retrieve Beneficiary Details](/docs/api-reference/payouts/v1/get-beneficiary-details) | Retrieve a beneficiary's details. |
| [Find Beneficiary ID](/docs/api-reference/payouts/v1/get-beneficiary-id) | Find the ID of a specific beneficiary. |
| [Remove Beneficiary](/docs/api-reference/payouts/v1/remove-beneficiary) | Remove a beneficiary from your Payouts account. |
| [Retrieve Beneficiary Transfers](/docs/api-reference/payouts/v1/get-beneficiary-history) | Retrieve transfer data of a specific beneficiary. |
## Account APIs
| API name | Description |
| :- | :- |
| [View Balance](/docs/api-reference/payouts/v1/get-balance) | View the ledger and available balance of your account. |
| [View Balance V1.2](/docs/api-reference/payouts/v1/get-balance-v12) | Version 1.2 allows you to specify the payment instrument Id. |
| [Self Withdrawal](/docs/api-reference/payouts/v1/self-withdrawal) | Request a self-withdrawal from your Payouts account. |
| [Internal Transfer](/docs/api-reference/payouts/v1/internal-transfer) | Request an internal transfer between your Payouts accounts. |
## Transfers APIs
| API version 1.2 | API version 1 | Description | Transactions per minute (TPM) | Response time |
| :- | :- | :- | :- | :- |
| [Standard Transfer Sync V1.2](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Standard Transfer Sync](/docs/api-reference/payouts/v1/standard-transfer-sync) | Initiate a sync transfer request | N/A | 9.77 s |
| [Standard Transfer Async V1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Standard Transfer Async](/docs/api-reference/payouts/v1/standard-transfer-async) | Initiate an async transfer request | 1000 | 25.0 ms |
| [Direct Transfer V1.2](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Direct Transfer](/docs/api-reference/payouts/v1/direct-transfer) | Initiate an amount transfer request directly to the beneficiary not in the database. | 1000 | 9.04 s |
| [Get Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) | [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) | Get the status of the transfer request. | - | 244 ms |
| [Batch Transfer V1.2](/docs/api-reference/payouts/v1/batch-transfer-v12) | [Batch Transfer](/docs/api-reference/payouts/v1/batch-transfer) | Initiate a transfer request to multiple beneficiaries. | 1000 | 182 ms |
| [Get Batch Transfer Status V1.2](/docs/api-reference/payouts/v1/get-batch-transfer-status-v12) | [Get Batch Transfer Status](/docs/api-reference/payouts/v1/get-batch-transfer-status) | Get the status of the batch transfer request. | - | 6.19 ms |
| [Validate Payout V1.2](/docs/api-reference/payouts/v1/validate-payout-v1-2) | [Validate Payout V1](/docs/api-reference/payouts/v1/validate-payout-v1) | Validates a UPI VPA or phone number and returns a single-use transfer token. | - | - |
| [Process Validated Payout V1.2](/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1-2) | [Process Validated Payout V1](/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1) | Initiates a payout using the transfer token from the corresponding Validate Payout API. | - | - |
***
## Payouts - Postman Collection
This collection can save you time because of easy access to different requests.
Download Cashfree Payouts Postman Collection
# Remove Beneficiary
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/remove-beneficiary
post /payout/v1/removeBeneficiary
Use this API to remove an existing beneficiary from a list of added beneficiaries.
This API will be retired soon. Please plan to migrate to the latest version, [Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Beneficiary removed | - |
| 403 | ERROR | Token is not valid | Validate the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | Beneficiary does not exist with given Id | Enter a valid beneficiary ID. |
| 412 | ERROR | Token missing in the request | Enter the generated token as the value for Authorization under Headers in this format: `Bearer ` |
| 412 | ERROR | BeneId missing in the request | Enter a valid beneficiary ID. |
| 422 | ERROR | Please provide a valid Beneficiary Id | Enter a valid beneficiary ID. |
| 520 | ERROR | Unknown error occurred | Try again after some time. |
# Response Codes
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/response-codes
Look up Cashfree Payouts v1 response codes for Cashgram, beneficiary, and transfer APIs, with HTTP status, error codes, messages, and recommended next actions.
## Cashgram V1
### Create Cashgram
| HTTP status code | Error code | Message | Next action |
| - | - | - | - |
| 200 | - | Cashgram created successfully. | N/A |
| 409 | cashgram\_id\_already\_exists | A Cashgram with the given ID already exists. Please provide a unique Cashgram ID. | Provide a unique Cashgram ID. |
| 422 | notifyCustomer\_invalid | The `notifyCustomer` value can only be 0 or 1. Please try again with a valid value. | Use a valid `notifyCustomer` value (0 or 1). |
| 422 | amount\_invalid | The amount must be at least 1. Please try again with a valid amount. | Provide an amount of 1 or more. |
| 422 | cashgram\_id\_length\_exceeded | The Cashgram ID cannot exceed 36 characters. Please try again with a valid Cashgram ID. | Provide a Cashgram ID of 36 characters or fewer. |
| 422 | phone\_invalid | The phone number must be numeric and valid. Please try again with the correct phone number. | Provide a valid numeric phone number. |
| 422 | expiry\_date\_invalid | The link expiry date must be in the format `YYYY/MM/DD` and within 30 days from the creation date. | Provide a valid expiry date in the correct format. |
| 422 | amount\_below\_minimum | The requested Cashgram amount is below the minimum allowed amount of ₹x. | Increase the amount or update the minimum amount preference. |
| 422 | amount\_above\_maximum | The requested Cashgram amount exceeds the maximum allowed amount of ₹x. | Decrease the amount or update the maximum amount preference. |
| 500 | internal\_error | An internal error occurred. Please try again later. | Retry after some time. If the issue persists, contact support. |
| 500 | no\_fund\_source\_active | No active fund source is available for your account. | Activate a fund source and try again. |
| 500 | rates\_not\_configured | Rates have not been configured. Please contact Cashfree. | Reach out to Cashfree to configure rates. |
| 520 | unknown\_error | An unknown error occurred. Please try again later. | Retry after some time. If the issue persists, contact support. |
### Get Cashgram Status
| HTTP status code | Error code | Message | Next action |
| - | - | - | - |
| 200 | - | Cashgram details retrieved successfully. | N/A |
| 404 | cashgram\_not\_found | A Cashgram with the given ID does not exist. | Provide a valid Cashgram ID. |
| 422 | cashgram\_id\_invalid | Please provide a valid Cashgram ID. | Provide a valid Cashgram ID. |
| 422 | cashgram\_id\_length\_exceeded | The Cashgram ID cannot exceed 37 characters. Please try again. | Provide a Cashgram ID of 37 characters or fewer. |
| 500 | internal\_error | An internal error occurred. Please try again later. | Retry after some time. If the issue persists, contact support. |
### Deactivate Cashgram
| HTTP status code | Error code | Message | Next action |
| - | - | - | - |
| 200 | - | Cashgram with ID - ABC123 successfully deactivated. | N/A |
| 404 | cashgram\_not\_found | The given Cashgram ID does not exist. Please provide a valid Cashgram ID. | Provide a valid Cashgram ID. |
| 412 | cashgram\_already\_processed | Cashgram with ID - ABC123 has already been processed and cannot be deactivated. | No action possible. |
| 412 | cashgram\_expired | Cashgram with ID - ABC123 has already expired and cannot be deactivated. | No action possible. |
| 412 | status\_update\_not\_allowed | The status of the given Cashgram is not active. Only active Cashgrams can be deactivated. | Ensure the Cashgram status is active before deactivating. |
| 412 | cashgram\_already\_redeemed | The Cashgram provided in the request has already been redeemed and cannot be deactivated. | No action possible. |
| 500 | internal\_error | An internal error occurred. Please try again later. | Retry after some time. If the issue persists, contact support. |
# Self Withdrawal
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/self-withdrawal
post /payout/v1/selfWithdrawal
Use this API to request a self withdrawal at Cashfree. Self withdrawal is allowed a maximum of 3 times a day. The API response will either result in an ERROR or SUCCESS response. The status of the withdrawal request is available on the dashboard.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | | - |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 412 | ERROR | withdrawalId missing in the request | Enter a withdrawal ID. |
| 412 | ERROR | Token missing in the request | Enter the generated token as the value for Authorization under Headers |
# Standard Transfer Async
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/standard-transfer-async
post /payout/v1/requestAsyncTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is an async transfer request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Once you trigger the requestAsyncTransfer API, Cashfree verifies your request and returns the Cashfree referenceId. The transfer to beneficiary account will be attempted within the next 60 seconds and you may query the transfer status after 60 seconds.
Use this API to process very high volumes.
**Benefits**:
1. The API response is much faster for the async transfer endpoint. The async transfer response takes \<100 ms as compared to a median value of 2-5 sec for the sync payout transfer API.
2. The asynchronous API can handle a higher TPM (transactions per minute) as compared to the synchronous API. The async API allows us to handle up to 1000 transactions per minute.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message |
| :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. |
| 201 | SUCCESS | Transfer Scheduled for next working day. |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. |
| 201 | PENDING | Transfer request pending at the bank. |
| 202 | PENDING | Request received. Please check status after some time. |
| 403 | ERROR | Token is not valid |
| 403 | ERROR | IP not whitelisted |
| 403 | ERROR | This feature is not available for your account. |
| 403 | ERROR | Transfer mode is not available for your account. |
| 412 | ERROR | Token missing in the request. |
| 412 | ERROR | BeneId missing in the request. |
| 412 | ERROR | Amount missing in the request. |
| 412 | ERROR | TransferId missing in the request. |
| 422 | ERROR | Invalid amount passed. |
| 422 | ERROR | Invalid transferId passed. |
| 422 | ERROR | No Payee Virtual Address associated with the beneficiary. |
| 422 | ERROR | Remarks can have only numbers, alphabets and whitespaces. |
| 409 | ERROR | Transfer Id already exists. |
| 404 | ERROR | Beneficiary does not exist. |
| 422 | ERROR | Beneficiary details not valid. |
| 422 | ERROR | No Bank account or IFSC associated with the beneficiary. |
| 412 | ERROR | Not enough available balance in the account. |
| 412 | ERROR | Please wait 30 minutes after adding the beneficiary. |
| 412 | ERROR | Transfer amount is less than minimum amount of Rs. 100. |
| 412 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. |
| 422 | ERROR | Invalid IFSC code provided for bank account. |
| 422 | ERROR | Invalid bank account number or IFSC provided. |
| 422 | ERROR | Transfer request to paytm wallet failed. |
| 400/520 | ERROR | Transfer attempt failed at the bank. |
| 520 | ERROR | Transfer request triggered. No response from bank. |
| 403 | ERROR | Transfer to this beneficiary not allowed. |
| 412 | ERROR | Transfer limit for beneficiary exceeded. |
| 412 | ERROR | Transfer limit for your account exceeded. |
| 412 | ERROR | Invalid transfer mode passed in the request. |
| 412 | ERROR | Transfer mode not enabled for the account. |
| 412 | ERROR | Invalid Tag passed in the request. |
# Standard Transfer Async v1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/standard-transfer-async-v12
post /payout/v1.2/requestAsyncTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is an async transfer request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Once you trigger the requestAsyncTransfer API, Cashfree verifies your request and returns the Cashfree referenceId. The transfer to beneficiary account will be attempted within the next 60 seconds and you may query the transfer status after 60 seconds.
Use this API to process very high volumes.
**Benefits**:
1. The API response is much faster for the async transfer endpoint. The async transfer response takes \<100 ms as compared to a median value of 2-5 sec for the sync payout transfer API.
2. The asynchronous API can handle a higher TPM (transactions per minute) as compared to the synchronous API. The async API allows us to handle up to 1000 transactions per minute.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. | - |
| 201 | PENDING | Transfer Scheduled for next working day. | - |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. | - |
| 201 | PENDING | Transfer request pending at the bank. | - |
| 202 | PENDING | Request received. Please check status after some time. | - |
| 400 | ERROR | Transfer amount is less than minimum amount of Rs.1 | Enter a transfer amount that is equal to or more than Rs. 1. |
| 400 | ERROR | Not enough available balance in the account. | Retry with sufficient balance in the account. |
| 400 | ERROR | Transfer Id already exists. | Enter a different transfer ID. |
| 400 | ERROR | Please wait 30 minutes after adding the beneficiary. | - |
| 400 | ERROR | Transfer amount is less than minimum amount of Rs. 100. | Enter a transfer amount that is equal to or more than Rs. 100. |
| 400 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. | Enter a transfer amount that is equal to or less than Rs. 100000. |
| 400 | ERROR | Transfer attempt failed at the bank. | |
| 400 | ERROR | Transfer to this beneficiary not allowed. | Enter a different beneficiary ID. |
| 400 | ERROR | Transfer limit for your account exceeded. | |
| 400 | ERROR | Transfer limit for beneficiary exceeded. | |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 404 | ERROR | Beneficiary does not exist. | Enter a valid beneficiary ID. |
| 412 | ERROR | Transfer mode not enabled for the account. | |
| 422 | ERROR | Please provide a valid beneId | Enter a valid beneficiary ID. |
| 422 | ERROR | Invalid Amount Passed. Only 2 decimal places are allowed. | Enter an amount with a maximum of only 2 decimal places. |
| 422 | ERROR | Please provide a valid transferId. | Enter a valid transfer ID. |
| 422 | ERROR | Invalid IFSC code provided for bank account. | Enter a valid IFSC. |
| 422 | ERROR | Invalid bank account number or IFSC provided. | Enter a valid bank account number and IFSC. |
# Standard Transfer Sync
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/standard-transfer-sync
post /payout/v1/requestTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is a sync transfer request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Once you trigger the requestTransfer API, the transfer to the beneficiary account will be attempted immediately and the bank's reference number will be returned in the API response. The median time for the response is 2 to 5 seconds.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. | |
| 201 | SUCCESS | Transfer Scheduled for next working day. | |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. | |
| 201 | PENDING | Transfer request pending at the bank. | |
| 202 | PENDING | Request received. Please check status after some time. | |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 403 | ERROR | This feature is not available for your account. | |
| 403 | ERROR | Transfer mode is not available for your account. | |
| 412 | ERROR | Token missing in the request. | |
| 412 | ERROR | BeneId missing in the request. | Enter a valid beneficiary ID. |
| 412 | ERROR | Amount missing in the request. | Enter a valid transfer amount. |
| 412 | ERROR | TransferId missing in the request. | Enter a valid transfer ID. |
| 422 | ERROR | Invalid amount passed. | Enter a valid transfer amount. |
| 422 | ERROR | Invalid transferId passed. | Enter a valid transfer ID. |
| 422 | ERROR | No Payee Virtual Address associated with the beneficiary. | |
| 422 | ERROR | Remarks can have only numbers, alphabets and whitespaces. | Enter any remarks of a maximum of 70 alphanumeric characters and white spaces. |
| 409 | ERROR | Transfer Id already exists. | Enter a different transfer ID. |
| 404 | ERROR | Beneficiary does not exist. | Enter valid beneficiary details. |
| 422 | ERROR | Beneficiary details not valid. | Enter valid beneficiary details. |
| 422 | ERROR | No Bank account or IFSC associated with the beneficiary. | Enter valid bank account details. |
| 412 | ERROR | Not enough available balance in the account. | Retry with sufficient balance in the account. |
| 412 | ERROR | Please wait 30 minutes after adding the beneficiary. | |
| 412 | ERROR | Transfer amount is less than minimum amount of Rs. 100. | Enter a transfer amount that is equal to or more than Rs. 100. |
| 412 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. | Enter a transfer amount that is equal to or less than Rs. 100000. |
| 422 | ERROR | Invalid IFSC code provided for bank account. | Enter valid bank account details. |
| 422 | ERROR | Invalid bank account number or IFSC provided. | Enter a valid bank account number and IFSC. |
| 422 | ERROR | Transfer request to paytm wallet failed. | |
| 400/520 | ERROR | Transfer attempt failed at the bank. | |
| 520 | ERROR | Transfer request triggered. No response from bank. | |
| 403 | ERROR | Transfer to this beneficiary not allowed. | Enter a different beneficiary ID. |
| 400 | ERROR | Transfer limit for beneficiary exceeded. | |
| 412 | ERROR | Transfer limit for your account exceeded. | |
| 412 | ERROR | Invalid transfer mode passed in the request. | |
| 412 | ERROR | Transfer mode not enabled for the account. | |
| 412 | ERROR | Invalid Tag passed in the request. | |
# Standard Transfer Sync v1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/standard-transfer-sync-v12
post /payout/v1.2/requestTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is a sync transfer request.
This API will be retired soon. Please plan to migrate to the latest version, [Transfers V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2).
Once you trigger the requestTransfer API, the transfer to the beneficiary account will be attempted immediately and the bank's reference number will be returned in the API response. The median time for the response is 2 to 5 seconds.
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
| Sub code | Status | Message | Next action |
| :- | :- | :- | :- |
| 200 | SUCCESS | Transfer completed successfully. | - |
| 201 | SUCCESS | Transfer Scheduled for next working day. | - |
| 201 | PENDING | Awaiting confirmation from beneficiary bank. | - |
| 201 | PENDING | Transfer request pending at the bank. | - |
| 201 | ERROR | Transfer request triggered. No response from bank. | - |
| 202 | PENDING | Request received. Please check status after some time. | - |
| 400 | ERROR | Mode Not valid for Beneficiary. | Enter a different transfer mode for the beneficiary. |
| 400 | ERROR | Transfer Id already exists. | Enter a different transfer ID. |
| 400 | ERROR | Not enough available balance in the account. | Retry with sufficient balance in the account. |
| 400 | ERROR | Please wait 30 minutes after adding the beneficiary. | - |
| 400 | ERROR | Transfer amount is less than minimum amount of Rs. 100. | Enter a transfer amount that is equal to or more than Rs. 100. |
| 400 | ERROR | Transfer amount is greater than the maximum amount of Rs.100000. | Enter a transfer amount that is equal to or less than Rs. 100000. |
| 400 | ERROR | Transfer request to paytm wallet failed. | Retry the request with a different transfer mode. |
| 400 | ERROR | Transfer attempt failed at the bank. | |
| 400 | ERROR | Transfer to this beneficiary not allowed. | Enter a different beneficiary ID. |
| 400 | ERROR | Transfer amount is less than minimum amount of Rs.1 | Enter a transfer amount that is equal to or more than Rs. 1. |
| 400 | ERROR | Transfer limit for your account exceeded. | |
| 400 | ERROR | Transfer mode not enabled for the account. | |
| 400 | ERROR | Specified paymentInstrumentId not available. | Enter a valid payment instrument ID. |
| 400 | ERROR | Specified paymentInstrumentId not valid for this payment mode. | Enter a valid payment instrument ID. |
| 400 | ERROR | Multiple PaymentInstruments available for this payment mode. | |
| 400 | ERROR | Transfer limit for beneficiary exceeded. | |
| 403 | ERROR | Token is not valid | Verify the generated token. |
| 403 | ERROR | IP not whitelisted | Whitelist the IP address. |
| 404 | ERROR | Beneficiary does not exist. | Enter a valid beneficiary ID. |
| 412 | ERROR | Please provide a valid transferId. | Enter a valid transfer ID. |
| 422 | ERROR | Please provide a valid beneId. | Enter a valid beneficiary ID. |
| 422 | ERROR | Invalid bank account number or IFSC provided. | Enter a valid bank account number and IFSC. |
| 422 | ERROR | Invalid IFSC code provided for bank account. | Enter a valid IFSC. |
| 422 | ERROR | Invalid Amount Passed. Only 2 decimal places are allowed. | |
| 422 | ERROR | Please provide a valid transferId. | Enter a valid transfer ID. |
| 422 | ERROR | Remarks is invalid. | Enter any remarks of a maximum of 70 alphanumeric characters and white spaces. |
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/transfer
Transfer funds to your beneficiaries through Cashfree Payouts v1 using bank transfers, Paytm, Amazon Pay, UPI, IMPS, and NEFT, with sync and async modes.
These APIs will be retired soon. Please plan to migrate to the latest version, Transfers V2.
You can perform the following tasks using the transfers API:
* Transfer money to your beneficiaries accounts through Sync, Async, Direct, and Batch APIs.
* Check the status of each transfer using the referenceId or transferId.
The flow diagram will help you understand the different transfer APIs and their use cases.
Learn how each API functions using the following table and use the best-suited API for your transactions.
| | [Transfer sync](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Transfer async](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Direct transfer](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Batch transfer](/docs/api-reference/payouts/v1/batch-transfer-v12) |
| - | - | - | - | - |
| **Functionality** | Initiate an amount transfer request | Initiate an amount transfer request | Initiate an amount transfer request directly to the beneficiary not added in your Payouts account (add beneficiary details in the API request) | Initiate amount transfer request to multiple beneficiaries |
| **Sync / Async** | Sync | Async | Async | Async |
| **UTR / Cashfree Reference ID** | Both UTR and Cashfree Reference ID | Cashfree Reference ID | Cashfree Reference ID | Cashfree Reference ID |
| **Required Body Params** | beneId \namount \ntransferId | beneId \namount \ntransferId | amount \ntransferId \ntransferMode \nbeneDetails | batchTransferId \nbatchFormat |
| **Default Transfer Mode** | Bank Transfer | Bank Transfer | Not Applicable | Not Applicable |
| **Available Transfer Modes** | Bank, UPI, Paytm, Amazon Pay | Bank, UPI, Paytm, Amazon Pay, Card | Bank, UPI, Paytm, Amazon Pay, Card, IMPS, NEFT | Bank, UPI, Paytm, Amazon Pay |
| **Response Time** | 9.77 s | 25.0 ms | 9.04 s | 182 ms |
| **Transactions Volume** | Low | High: up to 1000 transactions per minute | High: up to 1000 transactions per minute | High: up to 1000 transactions per minute |
**Transfers APIs**
The version 1.2 APIs include **paymentInstrumentId** as one of the body parameters. Find the list of transfer APIs below:
| API version 1.2 | API version 1 | Response time |
| :- | :- | :- |
| [Standard Transfer Sync V1.2](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Standard Transfer Sync](/docs/api-reference/payouts/v1/standard-transfer-sync) | 9.77 s |
| [Standard Transfer Async V1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Standard Transfer Async](/docs/api-reference/payouts/v1/standard-transfer-async) | 25.0 ms |
| [Direct Transfer V1.2](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Direct Transfer](/docs/api-reference/payouts/v1/direct-transfer) | 9.04 s |
| [Get Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) | [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) | 244 ms |
| [Batch Transfer V1.2](/docs/api-reference/payouts/v1/batch-transfer-v12) | [Batch Transfer](/docs/api-reference/payouts/v1/batch-transfer) | 182 ms |
| [Get Batch Transfer Status V1.2](/docs/api-reference/payouts/v1/get-batch-transfer-status-v12) | [Get Batch Transfer Status](/docs/api-reference/payouts/v1/get-batch-transfer-status) | 6.19 ms |
***
## What does the response parameter 'acknowledged' mean?
The acknowledged parameter value conveys if the beneficiary received the funds by checking its value. Ack = 1 or 0. 1 denotes the beneficiary received funds, and 0 denotes the beneficiary had not received funds.
The cash flow happens as explained below:
1. `Debit`: The debit of the transfers happens on the remitter account. After a successful debit, the beneficiary bank does further processing. When only the debit is successful, Ack = 0.
2. Credit: The beneficiary bank credits the fund to the account. The transfer is sent from the remitter bank to the beneficiary bank after a successful debit. When the credit to the end beneficiary is successful, Ack = 1.
To confirm the status of a payout, you need to check the acknowledged parameter value. If the value is 1, you can mark the transfer as successful. However, if the value is 0, you must either wait for the TRANSFER\_ACKNOWLEDGED webhook event or use the [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status-v12) API and confirm the acknowledged value.
***
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/transfer-v12
Use the Payouts Transfers v1.2 API to disburse funds to beneficiaries through bank accounts, UPI, IMPS, NEFT, Paytm, and Amazon Pay wallets.
These APIs will be retired soon. Please plan to migrate to the latest version, Transfers V2.
You can perform the following tasks using the transfers API:
* Transfer money to your beneficiaries accounts through Sync, Async, Direct, and Batch APIs.
* Check the status of each transfer using the referenceId or transferId.
The flow diagram will help you understand the different transfer APIs and their use cases.
Learn how each API functions using the following table and use the best-suited API for your transactions.
| | [Transfer sync](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Transfer async](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Direct transfer](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Batch transfer](/docs/api-reference/payouts/v1/batch-transfer-v12) |
| - | - | - | - | - |
| **Functionality** | Initiate an amount transfer request | Initiate an amount transfer request | Initiate an amount transfer request directly to the beneficiary not added in your Payouts account (add beneficiary details in the API request) | Initiate amount transfer request to multiple beneficiaries |
| **Sync / Async** | Sync | Async | Async | Async |
| **UTR / Cashfree Reference ID** | Both UTR and Cashfree Reference ID | Cashfree Reference ID | Cashfree Reference ID | Cashfree Reference ID |
| **Required Body Params** | beneId \namount \ntransferId | beneId \namount \ntransferId | amount \ntransferId \ntransferMode \nbeneDetails | batchTransferId \nbatchFormat |
| **Default Transfer Mode** | Bank Transfer | Bank Transfer | Not Applicable | Not Applicable |
| **Available Transfer Modes** | Bank, UPI, Paytm, Amazon Pay, | Bank, UPI, Paytm, Amazon Pay, Card | Bank, UPI, Paytm, Amazon Pay, Card, IMPS, NEFT | Bank, UPI, Paytm, Amazon Pay |
| **Response Time** | 9.77 s | 25.0 ms | 9.04 s | 182 ms |
| **Transactions Volume** | Low | High: up to 1000 transactions per minute | High: up to 1000 transactions per minute | High: up to 1000 transactions per minute |
**Transfers APIs**
The version 1.2 APIs include **paymentInstrumentId** as one of the body parameters. Find the list of transfer APIs below:
| API version 1.2 | API version 1 | Response time |
| :- | :- | :- |
| [Standard Transfer Sync V1.2](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Standard Transfer Sync](/docs/api-reference/payouts/v1/standard-transfer-sync) | 9.77 s |
| [Standard Transfer Async V1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Standard Transfer Async](/docs/api-reference/payouts/v1/standard-transfer-async) | 25.0 ms |
| [Direct Transfer V1.2](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Direct Transfer](/docs/api-reference/payouts/v1/direct-transfer) | 9.04 s |
| [Get Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) | [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) | 244 ms |
| [Batch Transfer V1.2](/docs/api-reference/payouts/v1/batch-transfer-v12) | [Batch Transfer](/docs/api-reference/payouts/v1/batch-transfer) | 182 ms |
| [Get Batch Transfer Status V1.2](/docs/api-reference/payouts/v1/get-batch-transfer-status-v12) | [Get Batch Transfer Status](/docs/api-reference/payouts/v1/get-batch-transfer-status) | 6.19 ms |
***
## What does the response parameter 'acknowledged' mean?
The acknowledged parameter value conveys if the beneficiary received the funds by checking its value. Ack = 1 or 0. 1 denotes the beneficiary received funds, and 0 denotes the beneficiary had not received funds.
The cash flow happens as explained below:
1. Debit: The debit of the transfers happens on the remitter account. After a successful debit, the beneficiary bank does further processing. When only the debit is successful, Ack = 0.
2. Credit: The beneficiary bank credits the fund to the account. The transfer is sent from the remitter bank to the beneficiary bank after a successful debit. When the credit to the end beneficiary is successful, Ack = 1.
To confirm the status of a payout, you need to check the acknowledged parameter value. If the value is 1, you can mark the transfer as successful. However, if the value is 0, you must either wait for the TRANSFER\_ACKNOWLEDGED webhook event or use the [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status-v12) API and confirm the acknowledged value.
# Validate Payout V1
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/validate-payout-v1
post /payout/v1/validatePayout
Validates a UPI VPA or phone number and returns a single-use transfer token valid for one hour. Pass this token to the [Process Validated Payout API](/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1) to initiate the payout.
In the request body, pass the value for exactly one of `vpa` or `phone`, not both.
The response contains either basic or advanced VPA details. Advanced details include IFSC branch information. To enable advanced details for your account, contact your account manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1).
# Validate Payout V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/validate-payout-v1-2
post /payout/v1.2/validatePayout
Validates either a Virtual Payment Address (VPA) on UPI or a phone number, and returns a single-use transfer token valid for one hour. Pass this token to the [Process Validated Payout API](/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1-2) to initiate the payout.
In the request body, pass the value for exactly one of `vpa` or `phone`, not both.
The response contains either basic or advanced VPA details. Advanced details include Indian Financial System Code (IFSC) branch information. To enable advanced details for your account, contact your account manager or fill in the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1).
# Verify
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/verify
post /payout/v1/verifyToke
Use this API to verify the bearer token generated. If the token does not exist/invalid/expired, the response "Token is not valid" is returned. Regenerate token in case of token expiry to make API calls (use /payout/v1/authorize for this).
# Verify
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/verify-1
post /payout/v1/verifyToken
Verify the bearer token generated. If the token does not exist, is invalid, or has expired, the response "Token is not valid" is returned. Regenerate token in case of token expiry for making API calls ( use /payout/v1/authorize for this).
Please use this Authorization token in headers to call any payout API (Refresh this page if the token is expired)
# Direct Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1
post /payout/v1/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
# Direct Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1-2
post /payout/v1.2/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/payouts/v1/webhooks
Configure Cashgram webhooks to receive real-time HTTP callbacks for redeemed, reversed, and expired events, and learn how Cashfree polls bank status updates.
Webhooks are events that notify you about the payment status. All Cashgram integrations should establish a webhook to listen for cashgram events, like status changes on payments. Webhooks are HTTP callbacks that receive notification messages for events.
Webhooks help you receive automatic updates and are significant for completing the integration with Cashfree. Webhooks are triggered with a request from your side, for example, when a transfer fails or when a daily report is available. Requests get processed both synchronously and asynchronously. In rare scenarios, for some payment methods, the outcome may take a longer duration to confirm. Cashfree notifies you once we get updates from the bank about the payment status.
Do not go live without signature verification if you are using webhooks.
## Webhook events
Cashfree Cashgram API enables you to receive updates about all event-driven activities originating from your account. Below is the list of Cashgram webhooks:
**CASHGRAM\_REDEEMED**: Cashgram redeemed by the customer\
**CASHGRAM\_TRANSFER\_REVERSAL**: Cashgram transfer reversed by the bank\
**CASHGRAM\_EXPIRED**: Cashgram is inactive
Cashfree gets a response from the bank with the status of the transfer. At times the notifications may get delayed due to various reasons, and the transaction status will be marked as Pending, till Cashfree gets a response.
Cashfree polls the transaction status from the bank for the next 72 hours. In case we do not receive the status of a transaction after 72 hours, the transaction will be marked as Failed.
## CASHGRAM\_REDEEMED
Sent whenever a Cashgram is redeemed.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = CASHGRAM\_REDEEMED |
| cashgramid | Id of the cashgram passed by the merchant |
| referenceId | Id of the transfer generated by Cashfree |
| eventTime | Transfer initiation time |
| utr | Unique transaction reference number provided by the bank |
| signature | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. |
## CASHGRAM\_TRANSFER\_REVERSAL
Sent whenever the bank reverses a Cashgram.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = CASHGRAM\_TRANSFER\_REVERSAL |
| cashgramid | Id of the cashgram passed by the merchant |
| referenceId | Id of the transfer generated by Cashfree |
| eventTime | Transfer initiation time |
| signature | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. |
## CASHGRAM\_EXPIRED
Cashgram can become inactive for various reasons. An inactive Cashgram cannot be re-activated. You need to create a new Cashgram to send to your customer. A Cashgram gets reversed if one of the following events occurs:
1. **Redeeming post Expiry time**: If the customer does not redeem the Cashgram before the expiration time (set by the Merchant while creating the Cashgram), the Cashgram gets deactivated.
2. **Reaching the maximum number of retries**: A maximum of three attempts is allowed to redeem the Cashgram. If the customer enters incorrect details more than three times, the Cashgram gets deactivated.
3. **OTP verification attempts exceeded**: A maximum of three attempts is allowed to verify the OTP. If the customer fails to verify the OTP successfully, the Cashgram gets deactivated.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = CASHGRAM\_EXPIRED |
| cashgramid | Id of the cashgram passed by the merchant |
| reason | Reason for reversal |
| signature | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. |
## Signature verification
Cashfree sends a signature alongside every webhook, verifying this signature ( passed along with the POST parameters ) is mandatory before processing any response. It helps authenticate that the webhook is from Cashfree.
We strongly recommend whitelisting Cashfree's production IP to help make your communication with Cashfree more secure.
Following are the steps to verify Cashfree's signature:
1. Get all the POST parameters except ‘signature’ and assign it to an array as key-value pair
2. Sort the array based on keys
3. Concatenate all the values in this array and the resultant is the post data (say, postData)
4. **postData** needs to be encrypted using SHA-256, and then base64 encoded
5. Now verify if both the signature calculated and the signature received match
6. Proceed further if it matches, else discards the request
Cashfree's libraries also support signature verification. To verify the signature returned by Cashfree call the following methods from the library.
Below code snippets can help you verify Cashfree Signature:
```php theme={"dark"}
$value){
if (strlen($value) > 0) {
$postData .= $value;
}
}
$hash_hmac = hash_hmac('sha256', $postData, $clientSecret, true) ;
// Use the clientSecret from the oldest active Key Pair.
$computedSignature = base64_encode($hash_hmac);
if ($signature == $computedSignature) {
// Proceed based on $event
} else {
// Reject this call
}
?>
```
```java theme={"dark"}
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import org.apache.commons.codec.binary.Base64;
public class ComputedSignature {
public static String generateHMAC(String clientSecret, String data) {
String hash = null;
try {
String secret = clientSecret;
String message = data;
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(),"HmacSHA256");
sha256_HMAC.init(secret_key);
hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
}
catch (Exception e){
//Log it
}
return hash;
}
}
```
```javascript Node theme={"dark"}
const Cashfree = require("cashfree-sdk");
//convert post response recived in the notification end point to json
//and pass that to the SDK.
Cashfree.Payouts.VerifySignature(webhookPostDataJson, signature, clientSecret);
```
```python theme={"dark"}
from cashfree_sdk import verification
#webhook_data = response.content
webhook_data = '{"cashgramId": "5b8283182e0711eaa4c531df6a4f439b-28", "event": "CASHGRAM_EXPIRED", "eventTime": "2020-01-03 15:01:06", "reason": "OTP_ATTEMPTS_EXCEEDED", "signature": "TBpM+4nr1DsWsov7QiHSTfRJP4Z9BD8XrDgEhBlf9ss="}'
verification.verify_webhook(webhook_data, 'JSON')
```
## Webhook retries
Cashfree webhooks service does its best to deliver events to your webhook endpoint. It is best practice for your application to respond to the callback. Our webhook service may send many payloads to a single endpoint in quick succession. You will need to build an application and configure your server to receive the response we send when events get triggered during the process.
Your server should return a 200 HTTP status code to acknowledge that you received the webhook without any issues. Any other information you return in the request headers or request body gets ignored. Any response code outside the 200 range, including 3xx codes, indicates that you did not receive the webhook.
When Cashfree does not get the acknowledgement due to any reason, we retry to establish the communication at regular intervals. If we do not receive a response after a few attempts, we gradually decrease the rate of retries. Based on this count, the service is disabled if it fails more than five times.
If you are not receiving notifications from Cashfree as expected, please reach out to our support team by filling the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
# Add Beneficiary
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/add-beneficiary
post /payout/v1/addBeneficiary
Use this API to add a beneficiary to your Cashfree account by providing the bank account number, IFSC, and other required details. Before you request a transfer, ensure the account has been successfully added as a beneficiary.
# Authorize
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/authorize
post /payout/v1/authorize
Use this API to authenticate with the Cashfree system and obtain the authorization bearer token. All other API calls must have this token as Authorization header in the format 'Bearer ' (without quotes) for them to get processed.
# Batch Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/batch-transfer
post /payout/v1/requestBatchTransfer
Use this API to create multiple transfers to multiple beneficiaries. This API accepts an array of transfer objects under the batch field.
# Batch Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/batch-transfer-v12
post /payout/v1.2/requestBatchTransfer
Use this API to create transfers to multiple beneficiaries. This API accepts an array of transfer objects under the batch field.
# Create Beneficiary V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/beneficiary-v2/create-beneficiary-v2
post /beneficiary
Use this API to add a beneficiary to your Cashfree account by providing the bank account number, IFSC, and other required details. Ensure the successful creation of the benficiary in your account before initiating a transfer.
Cashfree no longer support adding beneficiaries with Paytm UPI handles.
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 201 | - | - | - |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | bank\_ifsc\_missing | bank\_ifsc : should be provided with the request if bank\_account\_number is provided | Provide a valid bank\_ifsc if bank\_account\_number is provided. |
| 400 | bank\_account\_number\_missing | bank\_account\_number: should be provided with the request if bank\_ifsc is provided | Provide a valid bank\_account\_number is bank\_ifsc is provided. |
| 400 | bank\_account\_number\_length\_exceeded | bank\_account\_number : should not be more than 25 characters long. value received: 235142352346523462456345263452345 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_length\_short | bank\_account\_number : should not be less than 4 characters long. value received: 12 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_invalid | bank\_account\_number : should be alphanumeric. value received: 123@ | Provide a valid bank\_account\_number. |
| 400 | bank\_ifsc\_invalid | bank\_ifsc : please provide a valid IFSC. value received: SBIN00708410 | Provide a valid bank\_ifsc. |
| 400 | beneficiary\_purpose\_invalid | beneficiary\_purpose : invalid value provided. Value received: paytm | Provide a valid beneficiary\_purpose. |
| 409 | beneficiary\_id\_already\_exists | Beneficiary already exists with the given beneficiary\_id | Provide a beneficiary\_id that is not in use |
| 409 | beneficiary\_already\_exists | Beneficiary already exists with the given bank\_account\_number and bank\_ifsc | Use the GET API to get the details of the existing beneficiary using bank\_account\_number and bank\_ifsc |
| 422 | bank\_account\_number\_same\_as\_source | bank\_account\_number provided is the same as source bank account | Enter a bank\_account\_number that is different from the source bank account |
| 422 | vba\_beneficiary\_not\_allowed | Virtual bank account as bank\_account\_number for the beneficiary is not allowed | Enter the actual bank\_account\_number instead of the virtual account number |
# Get Beneficiary V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2
get /beneficiary
Use this API to get the details of a particular beneficiary from your account. You can pass either beneficiary_id or the combination of bank_account_number and bank_ifsc to fetch the details.
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 200 | - | - | - |
| 400 | too\_many\_parameters\_in\_request | Please provide either bank\_account\_number and bank\_ifsc together or beneficiary\_id alone. Do not include all three parameters in the request | Please provide either bank\_account\_number and bank\_ifsc together or beneficiary\_id alone. Do not include all three parameters in the request. |
| 400 | bank\_ifsc\_missing | bank\_ifsc: should be provided with the request if bank\_account\_number is provided | Provide a valid bank\_ifsc if bank\_account\_number is provided. |
| 400 | bank\_account\_number\_missing | bank\_account\_number: should be provided with the request if bank\_ifsc is provided | Provide a valid bank\_account\_number is bank\_ifsc is provided. |
| 400 | beneficiary\_identifiers\_missing | beneficiary\_identifiers\_missing beneficiary\_identifiers: Either beneficiary\_id or the combination of bank\_account\_number and bank\_ifsc has to be provided with the request | Please provide either beneficiary\_id or the combination of bank\_account\_number and bank\_ifsc. |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid beneficiary\_id |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | bank\_account\_number\_length\_exceeded | bank\_account\_number : should not be more than 25 characters long. value received: 235142352346523462456345263452345 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_length\_short | bank\_account\_number : should not be less than 4 characters long. value received: 12 | Provide a valid bank\_account\_number. |
| .400 | bank\_account\_number\_invalid | bank\_account\_number : should be alphanumeric. value received: 123@ | Provide a valid bank\_account\_number. |
| 400 | bank\_ifsc\_invalid | bank\_ifsc : please provide a valid IFSC. value received: SBIN00708410 | Provide a valid bank\_ifsc. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide the details of an existing beneficiary. If such a beneficiary does not exist, use CREATE API to create a new beneficiary. |
| 404 | beneficiary\_not\_found | Beneficiary with the given bank\_account\_number and bank\_ifsc does not exist | Provide the details of an existing beneficiary. If such a beneficiary does not exist, use CREATE API to create a new beneficiary |
| 404 | beneficiary\_not\_found | Beneficiary exists with the given bank\_account\_number but a different bank\_ifsc | If the required a beneficiary does not exist, use CREATE API to create a new beneficiary |
# Remove Beneficiary V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/beneficiary-v2/remove-beneficiary-v2
delete /beneficiary
Use this API to remove an existing beneficiary from the list of added beneficiaries.
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 201 | - | - | - |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid a beneficiary\_id |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide the beneficiary\_id of an existing beneficiary |
# CardPay
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/cardpay
post /payout/v1/cardpay
Use this API to transfer money to beneficiary cards. Provide details such as beneficiary name, card type, network type, and transfer ID.
You need to pass the tokenised card number or card token for this transfer.
# Create Cashgram
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/create-cashgram
post /payout/v1/createCashgram
Use this API to create a Cashgram.
# Deactivate Cashgram
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/deactivate-cashgram
post /payout/v1/deactivateCashgram
# Direct Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/direct-transfer
post /payout/v1/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
# Direct Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/direct-transfer-v12
post /payout/v1.2/directTransfer
Use this API to initiate amount transfers directly to the beneficiary account via a bank transfer or UPI. You can add the beneficiary details in the same API request.
# Get Balance
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-balance
get /payout/v1/getBalance
Use this API to get the ledger balance and available balance of your account. Available balance is ledger balance minus the sum of all pending transfers (transfers triggered and processing or pending now).
# Get Balance V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-balance-v12
get /payout/v1.2/getBalance
Use this API to get the ledger balance and available balance of your account. Available balance is ledger balance minus the sum of all pending transfers (transfers triggered and processing or pending now).
# Get Batch Transfer Status - WIP
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-batch-transfer-status--wip
get /payout/v1/getBatchTransferStatus-wip
Use this API to get the status of the Batch Transfer.
# Get Batch Transfer Status V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-batch-transfer-status-v12
get /payout/v1.2/getBatchTransferStatus
Use this API to get the status of the Batch Transfer.
# Get Beneficiary Details
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-beneficiary-details
get /payout/v1/getBeneficiary/{beneId}
Use this API to get the details of a particular beneficiary in your account.
# Get Beneficiary History
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-beneficiary-history
get /payout/v1/beneHistory
Use this API to fetch the transaction history for a particular beneficiary and for a desired period of time.
# Get Beneficiary ID
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-beneficiary-id
get /payout/v1/getBeneId
Use this API to get the beneficiary ID by providing the bank account number and ifsc.
# Get Cashgram Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-cashgram-status
get /payout/v1/getCashgramStatus
Use this API to get the status of the Cashgram created.
# Get Incidents
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-incidents
get /payout/v1/incidents
Use this API to get the list of incidents on banks(Resolved,Unresolved,All) for a given time range.
# Get Transfer Status
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-transfer-status
get /payout/v1.1/getTransferStatus
Use these details to get details of a particular transfer. You can pass referenceId or transferId to fetch the details.
# Get Transfer Status V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/get-transfer-status-v12
get /payout/v1.2/getTransferStatus
Use these details to get details of a particular transfer. You can pass referenceId or transferId to fetch the details.
# Internal Transfer
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/internal-transfer
post /payout/v1/internalTransfer
Use this API to request an internal transfer at Cashfree. The internal transfer API is useful for multiple Payouts accounts. The API response will either result in an ERROR or SUCCESS response.
# Internal Transfer V1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/internal-transfer-v12
post /payout/v1.2/internalTransfer
Use this API to request an internal transfer. It is useful for accounts with multiple fund sources. You need to provide either the rechargeAccount or paymentInstrumentId and toPaymentInstrumentId along with the amount.
# Lend
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/lend
post /payout/v1/lend
Use this API to send requests for loan disbursement to the beneficiary. The service charges are pooled for the respective party and disbursed at the end of day. Disbursement amount = (Amount - total service charges).
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/overview
Use Cashfree Payouts v2 APIs to disburse funds to bank accounts, UPI IDs, cards, and wallets with enhanced beneficiary management and transfer modes.
**You can perform the following tasks using the Payouts API:**
* Add and manage your beneficiaries efficiently
* Transfer money to your beneficiaries' accounts using different transfer methods
* Track the transfer status
* Check the ledger and available balance instantly
## Beneficiary APIs
| API name | Description |
| :- | :- |
| [Add Beneficiary](/docs/api-reference/payouts/v1/add-beneficiary) | Add a beneficiary to your Payouts account. |
| [Retrieve Beneficiary Details](/docs/api-reference/payouts/v1/get-beneficiary-details) | Retrieve a beneficiary's details. |
| [Find Beneficiary ID](/docs/api-reference/payouts/v1/get-beneficiary-id) | Find the ID of a specific beneficiary. |
| [Remove Beneficiary](/docs/api-reference/payouts/v1/remove-beneficiary) | Remove a beneficiary from your Payouts account. |
| [Retrieve Beneficiary Transfers](/docs/api-reference/payouts/v1/get-beneficiary-history) | Retrieve transfer data of a specific beneficiary. |
## Account APIs
| API name | Description |
| :- | :- |
| [View Balance](/docs/api-reference/payouts/v1/get-balance) | View the ledger and available balance of your account. |
| [View Balance V1.2](/docs/api-reference/payouts/v1/get-balance-v12) | Version 1.2 allows you to specify the payment instrument Id. |
| [Self Withdrawal](/docs/api-reference/payouts/v1/self-withdrawal) | Request a self-withdrawal from your Payouts account. |
| [Internal Transfer](/docs/api-reference/payouts/v1/internal-transfer) | Request an internal transfer between your Payouts accounts. |
## Transfers APIs
| API version 1.2 | API version 1 | Description | Transactions per minute (TPM) | Response time |
| :- | :- | :- | :- | :- |
| [Standard Transfer Sync V1.2](/docs/api-reference/payouts/v1/standard-transfer-sync-v12) | [Standard Transfer Sync](/docs/api-reference/payouts/v1/standard-transfer-sync) | Initiate a sync transfer request | N/A | 9.77 s |
| [Standard Transfer Async V1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) | [Standard Transfer Async](/docs/api-reference/payouts/v1/standard-transfer-async) | Initiate an async transfer request | 1000 | 25.0 ms |
| [Direct Transfer V1.2](/docs/api-reference/payouts/v1/direct-transfer-v12) | [Direct Transfer](/docs/api-reference/payouts/v1/direct-transfer) | Initiate an amount transfer request directly to the beneficiary not in the database. | 1000 | 9.04 s |
| [Get Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) | [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) | Get the status of the transfer request. | - | 244 ms |
| [Batch Transfer V1.2](/docs/api-reference/payouts/v1/batch-transfer-v12) | [Batch Transfer](/docs/api-reference/payouts/v1/batch-transfer) | Initiate a transfer request to multiple beneficiaries. | 1000 | 182 ms |
| [Get Batch Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) | [Get Batch Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) | Get the status of the batch transfer request. | - | 6.19 ms |
| [Validate Payout V1.2](/docs/api-reference/payouts/v1/validate-payout-v1-2) | [Validate Payout V1](/docs/api-reference/payouts/v1/validate-payout-v1) | Validates a UPI VPA or phone number and returns a single-use transfer token. | - | - |
| [Process Validated Payout V1.2](/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1-2) | [Process Validated Payout V1](/docs/api-reference/payouts/v1/verify-and-pay-direct-transfer-v1) | Initiates a payout using the transfer token from the corresponding Validate Payout API. | - | - |
## Version 2 APIs
### Beneficiary V2
| API | Description |
| :- | :- |
| [Create Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/create-beneficiary-v2) | Use this API to add a beneficiary to your Cashfree account by providing the bank account number, IFSC, and other required details. |
| [Get Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2) | Use this API to get the details of a particular beneficiary from your account. |
| [Remove Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/remove-beneficiary-v2) | Use this API to remove an existing beneficiary from the list of added beneficiaries. |
### Transfers V2
| API | Description |
| :- | :- |
| [Standard Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2) | Use this API to initiate an amount transfer at Cashfree. It's an async request by default. |
| [Get Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2) | Use this API to get the status of the initiated transfer. |
| [Batch Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/batch-transfer-v2) | Use this API to initiate a batch transfer request at Cashfree. You can transfer money to multiple beneficiaries. |
| [Get Batch Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2) | Use this API to get the status of the initiated batch transfer. |
### Verify and pay
| API | Description |
| :- | :- |
| [Validate Payout V2](/docs/api-reference/payouts/v2/validate-payout-v2) | Validates a UPI VPA or phone number and returns a single-use transfer token for the Process Validated Payout call. |
| [Process Validated Payout V2](/docs/api-reference/payouts/v2/verify-and-pay-transfers-v2) | Initiates a UPI payout using the transfer token from Validate Payout V2. |
***
## Payouts - Postman Collection
This collection can save you time because of easy access to different requests.
Download Cashfree Payouts Postman Collection
# Overview
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/payouts-api-v2-new
Learn the benefits of upgrading to Cashfree Payouts v2 APIs, including the unified transfers endpoint, richer beneficiary management, and v1 to v2 migration.
Payouts version 2 (v2) represents the next generation of our payout integration capabilities. These APIs are designed to provide a more streamlined, standardised, and developer-friendly experience for businesses looking to automate their payout processes.
## Benefits
This update delivers several key improvements over the previous version to enhance your integration experience.
* **Enhanced versioning**:
Experience seamless incorporation of future breaking and non-breaking changes on existing endpoints. This strategy provides a better balance between innovation and stability.
* **Standardised API request and response**:
Parameters follow a consistent standard for clarity, simplifying the integration process and making it easier to manage your workflows.
* **Standardised error codes**:
Uniform error codes provide quick diagnosis of issues and clear resolution steps, reducing the need for support tickets.
* **Platform-wide standardisation**:
Consistent standards across all Cashfree services facilitate easier onboarding and familiarity with our various products.
* **Consolidated transfer APIs**:
Streamlined operations simplify selecting the correct API for your use case, reducing integration complexity and potential issues.
## End points
Use the following base URLs to access the Payouts version 2 APIs in different environments.
| Environment | Base URL |
| :- | :- |
| Production | [https://api.cashfree.com/payout](https://api.cashfree.com/payout) |
| Test | [https://sandbox.cashfree.com/payout](https://sandbox.cashfree.com/payout) |
## Available APIs
The following tables list the available API endpoints for beneficiary management and transfers.
### Beneficiary management
Use these APIs to manage beneficiaries in your Cashfree account.
| API | Description |
| :- | :- |
| [Create Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/create-beneficiary-v2) | Use this API to add a beneficiary to your Cashfree account by providing the bank account number, IFSC, and other required details. |
| [Get Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2) | Use this API to retrieve the details of a particular beneficiary from your account. |
| [Remove Beneficiary](/docs/api-reference/payouts/v2/beneficiary-v2/remove-beneficiary-v2) | Use this API to remove an existing beneficiary from the list of added beneficiaries. |
### Transfers
Use these APIs to initiate and track money transfers to your beneficiaries.
| API | Description |
| :- | :- |
| [Standard Transfer](/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2) | Use this API to initiate an amount transfer at Cashfree. This is an asynchronous request by default. |
| [Get Transfer Status](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2) | Use this API to retrieve the status of an initiated transfer. |
| [Batch Transfer](/docs/api-reference/payouts/v2/transfers-v2/batch-transfer-v2) | Use this API to initiate a batch transfer request at Cashfree. You can transfer money to multiple beneficiaries. |
| [Get Batch Transfer Status](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2) | Use this API to retrieve the status of an initiated batch transfer. |
### Verify and pay
Use these APIs for the Verify and Pay UPI flow: validate the beneficiary, then initiate the payout with the returned transfer token.
| API | Description |
| :- | :- |
| [Validate Payout](/docs/api-reference/payouts/v2/validate-payout-v2) | Validates a UPI VPA or phone number and returns a single-use transfer token for the Process Validated Payout call. |
| [Process Validated Payout](/docs/api-reference/payouts/v2/verify-and-pay-transfers-v2) | Initiates a UPI payout using the transfer token from Validate Payout. |
When you receive a 5XX response, do not initiate another transaction. Check the status of the standard transfer using **Get Transfer Status**, or check the status of the batch transfer using **Get Batch Transfer Status** before proceeding.
# API Rate Limits
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/payouts-rate-limiting
Learn the per-minute and per-day rate limits Cashfree applies to each Payouts API so you can plan retries, batch requests, and avoid throttling errors.
To maintain service reliability, protect against abuse, and ensure a consistent quality of service for all users interacting with the Payouts APIs, we have devised the following rate limits.
## 9000 TPM
| API |
| :- |
| [Standard Transfer Async](/docs/api-reference/payouts/v1/standard-transfer-async) |
## 7800 TPM
| API |
| :- |
| [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status) |
## 3500 TPM
| API |
| :- |
| [Create Cashgram](/docs/api-reference/payouts/v1/create-cashgram) |
## 3000 TPM
| API |
| :- |
| [Get Balance](/docs/api-reference/payouts/v1/get-balance) |
| [Authorize](/docs/api-reference/payouts/v1/authorize) |
| [Verify](/docs/api-reference/payouts/v1/verify-1) |
| [Direct Transfer](/docs/api-reference/payouts/v1/direct-transfer) |
## 2000 TPM
| API |
| :- |
| [Get payout-transfers-v2](/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2) |
| [Standard Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2) |
| [Get Batch Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2) |
| [Batch Transfer V2](/docs/api-reference/payouts/v2/transfers-v2/batch-transfer-v2) |
| [Get Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/get-beneficiary-v2) |
| [Create Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/create-beneficiary-v2) |
| [Remove Beneficiary V2](/docs/api-reference/payouts/v2/beneficiary-v2/remove-beneficiary-v2) |
| [Get Cashgram Status](/docs/api-reference/payouts/v1/get-cashgram-status) |
## 1200 TPM
| API |
| :- |
| [Standard Transfer Sync v1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) |
| [Direct Transfer V1.2](/docs/api-reference/payouts/v1/direct-transfer-v12) |
## 900 TPM
| API |
| :- |
| [Add Beneficiary](/docs/api-reference/payouts/v1/add-beneficiary) |
| [Get Beneficiary ID](/docs/api-reference/payouts/v1/get-beneficiary-id) |
| [Remove Beneficiary](/docs/api-reference/payouts/v1/remove-beneficiary) |
| [Get Beneficiary Details](/docs/api-reference/payouts/v1/get-beneficiary-details) |
## 500 TPM
| API |
| :- |
| [Get Batch Transfer Status](/docs/api-reference/payouts/v1/get-batch-transfer-status) |
| [Batch Transfer](/docs/api-reference/payouts/v1/batch-transfer) |
## 100 TPM
| API |
| :- |
| [Internal Transfer](/docs/api-reference/payouts/v1/internal-transfer) |
| [Self Withdrawal](/docs/api-reference/payouts/v1/self-withdrawal) |
| [Get Balance V1.2](/docs/api-reference/payouts/v1/get-balance-v12) |
| [Internal Transfer V1.2](/docs/api-reference/payouts/v1/internal-transfer-v12) |
| [Get Batch Transfer Status V1.2](/docs/api-reference/payouts/v1/get-batch-transfer-status-v12) |
| [Standard Transfer Async v1.2](/docs/api-reference/payouts/v1/standard-transfer-async-v12) |
| [Batch Transfer V1.2](/docs/api-reference/payouts/v1/batch-transfer-v12) |
| [Get Transfer Status V1.2](/docs/api-reference/payouts/v1/get-transfer-status-v12) |
| [Create Virtual Account](/docs/api-reference/payouts/v1/oneescrow/create-virtual-account) |
| [Transfer Funds Between VAs](/docs/api-reference/payouts/v1/oneescrow/transfer-funds-between-vas) |
| [Get Account Statement](/docs/api-reference/payouts/v1/oneescrow/get-account-statement) |
| [Allocate Funds to Virtual Account](/docs/api-reference/payouts/v1/oneescrow/recharge-oneescrow-account) |
| [Get Fund Source Details](/docs/api-reference/payouts/v1/oneescrow/get-fund-source-details) |
| [Add Registered Recharge Account](/docs/api-reference/payouts/v1/oneescrow/add-registered-recharge-accountwhitelist-bank-account) |
| [Debit Connected Wallet](/docs/api-reference/payouts/v1/oneescrow/debit-connected-wallet) |
| [CardPay](/docs/api-reference/payouts/v1/cardpay) |
| [Lend](/docs/api-reference/payouts/v1/lend) |
| [Get Beneficiary History](/docs/api-reference/payouts/v1/get-beneficiary-history) |
| [Get Incidents](/docs/api-reference/payouts/v1/get-incidents) |
| [Deactivate Cashgram](/docs/api-reference/payouts/v1/deactivate-cashgram) |
| [Get Batch Transfer Status V1.3](/docs/api-reference/payouts/v1/get-batch-transfer-status-1) |
# Remove Beneficiary
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/remove-beneficiary
post /payout/v1/removeBeneficiary
Use this API to remove an existing beneficiary from a list of added beneficiaries.
# Response Codes
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/response-codes
Look up Cashfree Payouts v2 response codes for beneficiary and transfer APIs, with HTTP status, error subcodes, sample messages, and recommended next actions.
## Beneficiary V2
### Create Beneficiary V2
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 201 | - | - | - |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | bank\_ifsc\_missing | bank\_ifsc : should be provided with the request if bank\_account\_number is provided | Provide a valid bank\_ifsc if bank\_account\_number is provided. |
| 400 | bank\_account\_number\_missing | bank\_account\_number: should be provided with the request if bank\_ifsc is provided | Provide a valid bank\_account\_number is bank\_ifsc is provided. |
| 400 | bank\_account\_number\_length\_exceeded | bank\_account\_number : should not be more than 25 characters long. value received: 235142352346523462456345263452345 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_length\_short | bank\_account\_number : should not be less than 4 characters long. value received: 12 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_invalid | bank\_account\_number : should be alphanumeric. value received: 123@ | Provide a valid bank\_account\_number. |
| 400 | bank\_ifsc\_invalid | bank\_ifsc : please provide a valid IFSC. value received: SBIN00708410 | Provide a valid bank\_ifsc. |
| 400 | beneficiary\_purpose\_invalid | beneficiary\_purpose : invalid value provided. Value received: paytm | Provide a valid beneficiary\_purpose. |
| 409 | beneficiary\_id\_already\_exists | Beneficiary already exists with the given beneficiary\_id | Provide a beneficiary\_id that is not in use |
| 409 | beneficiary\_already\_exists | Beneficiary already exists with the given bank\_account\_number and bank\_ifsc | Use the GET API to get the details of the existing beneficiary using bank\_account\_number and bank\_ifsc |
| 422 | bank\_account\_number\_same\_as\_source | bank\_account\_number provided is the same as source bank account | Enter a bank\_account\_number that is different from the source bank account |
| 422 | vba\_beneficiary\_not\_allowed | Virtual bank account as bank\_account\_number for the beneficiary is not allowed | Enter the actual bank\_account\_number instead of the virtual account number |
### Get Beneficiary V2
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 200 | - | - | - |
| 400 | too\_many\_parameters\_in\_request | Please provide either bank\_account\_number and bank\_ifsc together or beneficiary\_id alone. Do not include all three parameters in the request | Please provide either bank\_account\_number and bank\_ifsc together or beneficiary\_id alone. Do not include all three parameters in the request. |
| 400 | bank\_ifsc\_missing | bank\_ifsc: should be provided with the request if bank\_account\_number is provided | Provide a valid bank\_ifsc if bank\_account\_number is provided. |
| 400 | bank\_account\_number\_missing | bank\_account\_number: should be provided with the request if bank\_ifsc is provided | Provide a valid bank\_account\_number is bank\_ifsc is provided. |
| 400 | beneficiary\_identifiers\_missing | beneficiary\_identifiers\_missing beneficiary\_identifiers: Either beneficiary\_id or the combination of bank\_account\_number and bank\_ifsc has to be provided with the request | Please provide either beneficiary\_id or the combination of bank\_account\_number and bank\_ifsc. |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid beneficiary\_id |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | bank\_account\_number\_length\_exceeded | bank\_account\_number : should not be more than 25 characters long. value received: 235142352346523462456345263452345 | Provide a valid bank\_account\_number. |
| 400 | bank\_account\_number\_length\_short | bank\_account\_number : should not be less than 4 characters long. value received: 12 | Provide a valid bank\_account\_number. |
| .400 | bank\_account\_number\_invalid | bank\_account\_number : should be alphanumeric. value received: 123@ | Provide a valid bank\_account\_number. |
| 400 | bank\_ifsc\_invalid | bank\_ifsc : please provide a valid IFSC. value received: SBIN00708410 | Provide a valid bank\_ifsc. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide the details of an existing beneficiary. If such a beneficiary does not exist, use CREATE API to create a new beneficiary. |
| 404 | beneficiary\_not\_found | Beneficiary with the given bank\_account\_number and bank\_ifsc does not exist | Provide the details of an existing beneficiary. If such a beneficiary does not exist, use CREATE API to create a new beneficiary |
| 404 | beneficiary\_not\_found | Beneficiary exists with the given bank\_account\_number but a different bank\_ifsc | If the required a beneficiary does not exist, use CREATE API to create a new beneficiary |
### Remove Beneficiary
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 201 | - | - | - |
| 400 | beneficiary\_id\_invalid | beneficiary\_id : should contain only letters, numbers, hyphen, underscore, pipe, and dot. Value received: .\qewqefwqev | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_id\_length\_exceeded | beneficiary\_id : should not be more than 50 characters long. value received: test\_bene\_id | Enter a valid a beneficiary\_id |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide the beneficiary\_id of an existing beneficiary |
## Transfer V2
### Standard Transfer V2
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPOVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree to reattempt with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode. |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC. |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/merchants). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary. |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating model |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked. |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
\| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
\| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted. | After correcting the amount, you can reinitiate the transfer. | Yes, after correcting amount. |
\| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer. | Yes, after correcting remarks. |
\| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneId, you can reinitiate the transfer. | Yes, after correcting beneficiary id. |
\| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer. | Yes, after correcting name. |
\| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer. | Yes, after correcting email. |
\| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabets and numbers. | After correcting the iban, you can reinitiate the transfer. | Yes, after correcting IBAN. |
\| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode invalid (allowed: banktransfer, upi, paytm, amazonpay, imps, neft, rtgs, ppc). | After correcting the transferMode, you can reinitiate the transfer. | Yes, after correcting mode. |
\| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer. | Yes, after correcting currency. |
\| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as risk product detected an anomaly. | Reinitiate after validation at your end. | Yes, after validation. |
\| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as risk product detected an anomaly. | Approve / reject on dashboard (Payout Protect). | - |
\| 200 | FAILED | BAD\_CONNECTION | Intermittent internal error between Cashfree and partner bank. | Reinitiate the transfer. | Yes, after some time. |
\| 200 | REJECTED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_NOT\_REGISTERED | Beneficiary not registered with partner bank. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | VALIDATION\_PENDING| BENE\_VERIFICATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Check Status API or webhooks. | - |
\| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | Beneficiary bank offline. | Reinitiate after some time. | Yes, after some time. |
\| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | DUPLICATE\_FAILED | Bank claims duplicate request. | Reinitiate with different transfer id. | Yes, with new id. |
\| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | Intermittent issue at partner bank retrieving balance. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | FAILED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_MODE\_FAIL | Transfer mode not supported for beneficiary account. | Change mode then reinitiate. | Yes, after changing mode. |
\| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | Phone number not linked to any VPA. | Add correct phone beneficiary then reinitiate. | Yes, after correcting phone. |
\| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | KYC verification failed. | Reinitiate after resolving KYC. | Yes, after KYC resolution. |
\| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | KYC requirements not satisfied. | Complete KYC then reinitiate. | Yes, after completing KYC. |
\| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | Beneficiary account reached max transaction amount limit. | Reinitiate after 24 hours. | Yes, after 24 hours. |
\| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | Intermittent issue at Cashfree. | Reinitiate transfer. | Yes, after some time. |
\| 200 | PENDING | LOW\_BALANCE\_QUEUED | Balance in the fund source is exhausted; will auto process post recharge. | Recharge fund source; rely on status API/webhook. | - |
\| 200 | REJECTED | MANUALLY\_REJECTED | Transfer manually rejected by you. | Reinitiate if required. | Yes, if needed. |
\| 200 | REJECTED | PAYOUT\_INACTIVE | Payout account inactive. | Activate account then reinitiate. | Yes, after activation. |
\| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | Connection issue with partner bank. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | Quick transfer disabled for payout account. | Enable quick transfer then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | REJECTED | Transfer rejected (generic). | Review request and correct issues. | Yes, after correction. |
\| 200 | REVERSED | REVERSED | Transfer reversed by beneficiary bank; credit failed. | Reinitiate after correcting issue. | Yes, after correction. |
\| 200 | FAILED | RTGS\_MODE\_FAIL | Beneficiary account does not support RTGS transfers. | Try NEFT or other channels. | Yes, via different mode. |
\| 200 | FAILED | SUSPECTED\_FAILED | Partner bank suspects transfer is fraudulent. | Contact support / investigate before retry. | No (investigate). |
\| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | Transfers to virtual bank accounts not enabled. | Enable payouts to VBAs then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | Issue with account configuration selecting fund source. | Contact care team; fix config then reinitiate. | Yes, after fixing config. |
\| 200 | VALIDATION\_PENDING| VALIDATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Status API / webhooks. | - |
\| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | Beneficiary code invalid. | Correct beneficiary code then reinitiate. | Yes, after correcting code. |
\| 200 | REJECTED | DUPLICATE\_TRANSFER | Transfer already present / processed; duplicate transferId. | Change transferId and reinitiate. | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | transfer\_id\_missing | transfer\_id is missing in the request | Enter a valid transfer\_id in the request. |
| 400 | transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer\_id in the request. |
| 400 | transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter an amount greater than 1.00. |
| 400 | transfer\_amount\_missing | transfer\_amount is missing in the request | Provide a value for the transfer\_amount parameter in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Enter a valid bank\_account\_number. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | Bank account number passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_account\_number associated with the beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Enter a valid bank\_ifsc. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | Bank ifsc passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_ifsc associated with the beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Enter a valid VPA. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | Vpa passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct vpa associated with the beneficiary\_id. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Enter a valid beneficiary\_id. |
### Get Transfer Status V2
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as it is a high risk transaction detected by Payout Protect model. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BENE\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | YES |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s) | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/merchants). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | - | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging the account |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the merchant dashboard, so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_PEOPLE | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting the account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number. |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
\| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
\| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted. | After correcting the amount, you can reinitiate the transfer. | Yes, after correcting amount. |
\| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer. | Yes, after correcting remarks. |
\| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneId, you can reinitiate the transfer. | Yes, after correcting beneficiary id. |
\| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer. | Yes, after correcting name. |
\| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer. | Yes, after correcting email. |
\| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabets and numbers. | After correcting the iban, you can reinitiate the transfer. | Yes, after correcting IBAN. |
\| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode invalid (allowed: banktransfer, upi, paytm, amazonpay, imps, neft, rtgs, ppc). | After correcting the transferMode, you can reinitiate the transfer. | Yes, after correcting mode. |
\| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer. | Yes, after correcting currency. |
\| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as risk product detected an anomaly. | Reinitiate after validation at your end. | Yes, after validation. |
\| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as risk product detected an anomaly. | Approve / reject on dashboard (Payout Protect). | - |
\| 200 | FAILED | BAD\_CONNECTION | Intermittent internal error between Cashfree and partner bank. | Reinitiate the transfer. | Yes, after some time. |
\| 200 | REJECTED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_NOT\_REGISTERED | Beneficiary not registered with partner bank. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | VALIDATION\_PENDING| BENE\_VERIFICATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Check Status API or webhooks. | - |
\| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | Beneficiary bank offline. | Reinitiate after some time. | Yes, after some time. |
\| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | DUPLICATE\_FAILED | Bank claims duplicate request. | Reinitiate with different transfer id. | Yes, with new id. |
\| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | Intermittent issue at partner bank retrieving balance. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | FAILED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_MODE\_FAIL | Transfer mode not supported for beneficiary account. | Change mode then reinitiate. | Yes, after changing mode. |
\| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | Phone number not linked to any VPA. | Add correct phone beneficiary then reinitiate. | Yes, after correcting phone. |
\| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | KYC verification failed. | Reinitiate after resolving KYC. | Yes, after KYC resolution. |
\| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | KYC requirements not satisfied. | Complete KYC then reinitiate. | Yes, after completing KYC. |
\| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | Beneficiary account reached max transaction amount limit. | Reinitiate after 24 hours. | Yes, after 24 hours. |
\| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | Intermittent issue at Cashfree. | Reinitiate transfer. | Yes, after some time. |
\| 200 | PENDING | LOW\_BALANCE\_QUEUED | Balance in the fund source is exhausted; will auto process post recharge. | Recharge fund source; rely on status API/webhook. | - |
\| 200 | REJECTED | MANUALLY\_REJECTED | Transfer manually rejected by you. | Reinitiate if required. | Yes, if needed. |
\| 200 | REJECTED | PAYOUT\_INACTIVE | Payout account inactive. | Activate account then reinitiate. | Yes, after activation. |
\| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | Connection issue with partner bank. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | Quick transfer disabled for payout account. | Enable quick transfer then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | REJECTED | Transfer rejected (generic). | Review request and correct issues. | Yes, after correction. |
\| 200 | REVERSED | REVERSED | Transfer reversed by beneficiary bank; credit failed. | Reinitiate after correcting issue. | Yes, after correction. |
\| 200 | FAILED | RTGS\_MODE\_FAIL | Beneficiary account does not support RTGS transfers. | Try NEFT or other channels. | Yes, via different mode. |
\| 200 | FAILED | SUSPECTED\_FAILED | Partner bank suspects transfer is fraudulent. | Contact support / investigate before retry. | No (investigate). |
\| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | Transfers to virtual bank accounts not enabled. | Enable payouts to VBAs then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | Issue with account configuration selecting fund source. | Contact care team; fix config then reinitiate. | Yes, after fixing config. |
\| 200 | VALIDATION\_PENDING| VALIDATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Status API / webhooks. | - |
\| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | Beneficiary code invalid. | Correct beneficiary code then reinitiate. | Yes, after correcting code. |
\| 200 | REJECTED | DUPLICATE\_TRANSFER | Transfer already present / processed; duplicate transferId. | Change transferId and reinitiate. | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | transfer\_id\_missing | transfer\_id is missing in the request | Enter a transfer\_id in the request. |
| 400 | transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer\_id. |
| 400 | transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter a transfer\_amount greater than 1.00. |
| 400 | transfer\_amount\_missing | transfer\_amount is missing in the request | Enter a transfer\_amount in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode\_invalid transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Provide a valid beneficiary\_id in the request. |
| 400 | beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Provide a valid beneficiary\_name in the request. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Provide a valid bank\_account\_number in the request |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | Bank account number passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct bank\_account\_number in the request. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Provide a valid bank\_ifsc. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | Bank ifsc passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct bank\_ifsc for the beneficiary. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Provide a valid vpa. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | Vpa passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct vpa for the beneficiary. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide an existing beneficiary. |
### Batch Transfer V2
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on merchant dashboard. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | | |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the right beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode. |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting the beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s) | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limit |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the new details or getting the account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
\| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
\| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted. | After correcting the amount, you can reinitiate the transfer. | Yes, after correcting amount. |
\| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer. | Yes, after correcting remarks. |
\| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneId, you can reinitiate the transfer. | Yes, after correcting beneficiary id. |
\| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer. | Yes, after correcting name. |
\| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer. | Yes, after correcting email. |
\| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabets and numbers. | After correcting the iban, you can reinitiate the transfer. | Yes, after correcting IBAN. |
\| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode invalid (allowed: banktransfer, upi, paytm, amazonpay, imps, neft, rtgs, ppc). | After correcting the transferMode, you can reinitiate the transfer. | Yes, after correcting mode. |
\| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer. | Yes, after correcting currency. |
\| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as risk product detected an anomaly. | Reinitiate after validation at your end. | Yes, after validation. |
\| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as risk product detected an anomaly. | Approve / reject on dashboard (Payout Protect). | - |
\| 200 | FAILED | BAD\_CONNECTION | Intermittent internal error between Cashfree and partner bank. | Reinitiate the transfer. | Yes, after some time. |
\| 200 | REJECTED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_NOT\_REGISTERED | Beneficiary not registered with partner bank. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | VALIDATION\_PENDING| BENE\_VERIFICATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Check Status API or webhooks. | - |
\| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | Beneficiary bank offline. | Reinitiate after some time. | Yes, after some time. |
\| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | DUPLICATE\_FAILED | Bank claims duplicate request. | Reinitiate with different transfer id. | Yes, with new id. |
\| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | Intermittent issue at partner bank retrieving balance. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | FAILED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_MODE\_FAIL | Transfer mode not supported for beneficiary account. | Change mode then reinitiate. | Yes, after changing mode. |
\| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | Phone number not linked to any VPA. | Add correct phone beneficiary then reinitiate. | Yes, after correcting phone. |
\| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | KYC verification failed. | Reinitiate after resolving KYC. | Yes, after KYC resolution. |
\| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | KYC requirements not satisfied. | Complete KYC then reinitiate. | Yes, after completing KYC. |
\| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | Beneficiary account reached max transaction amount limit. | Reinitiate after 24 hours. | Yes, after 24 hours. |
\| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | Intermittent issue at Cashfree. | Reinitiate transfer. | Yes, after some time. |
\| 200 | PENDING | LOW\_BALANCE\_QUEUED | Balance in the fund source is exhausted; will auto process post recharge. | Recharge fund source; rely on status API/webhook. | - |
\| 200 | REJECTED | MANUALLY\_REJECTED | Transfer manually rejected by you. | Reinitiate if required. | Yes, if needed. |
\| 200 | REJECTED | PAYOUT\_INACTIVE | Payout account inactive. | Activate account then reinitiate. | Yes, after activation. |
\| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | Connection issue with partner bank. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | Quick transfer disabled for payout account. | Enable quick transfer then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | REJECTED | Transfer rejected (generic). | Review request and correct issues. | Yes, after correction. |
\| 200 | REVERSED | REVERSED | Transfer reversed by beneficiary bank; credit failed. | Reinitiate after correcting issue. | Yes, after correction. |
\| 200 | FAILED | RTGS\_MODE\_FAIL | Beneficiary account does not support RTGS transfers. | Try NEFT or other channels. | Yes, via different mode. |
\| 200 | FAILED | SUSPECTED\_FAILED | Partner bank suspects transfer is fraudulent. | Contact support / investigate before retry. | No (investigate). |
\| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | Transfers to virtual bank accounts not enabled. | Enable payouts to VBAs then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | Issue with account configuration selecting fund source. | Contact care team; fix config then reinitiate. | Yes, after fixing config. |
\| 200 | VALIDATION\_PENDING| VALIDATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Status API / webhooks. | - |
\| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | Beneficiary code invalid. | Correct beneficiary code then reinitiate. | Yes, after correcting code. |
\| 200 | REJECTED | DUPLICATE\_TRANSFER | Transfer already present / processed; duplicate transferId. | Change transferId and reinitiate. | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | batch\_transfer\_id\_missing | batch\_transfer\_id\_missing is missing in the request | Enter a batch transfer ID in the request. |
| 400 | batch\_transfer\_id\_invalid | batch\_transfer\_id\_invalid should be alphanumeric | Enter a valid batch transfer ID. |
| 400 | transfers\[0].transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer ID. |
| 400 | transfers\[0].transfer\_id\_missing | transfer\_id is missing in the request | Enter a transfer ID in the request. |
| 400 | transfers\[0].transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter an amount greater than 1.00. |
| 400 | transfers\[0].transfer\_amount\_missing | transfer\_amount is missing in the request | Enter a transfer amount in the request. |
| 400 | transfers\[0].transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Enter a valid transfer mode. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Enter a valid beneficiary ID. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Enter a valid beneficiary name. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Enter a valid bank account number. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Enter a valid IFSC. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Enter a valid VPA. |
### Get Batch Transfer Status V2
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as it is a high risk transaction detected by Payout Protect model. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time |
| 200 | FAILED | DEST\_LIMIT\_BREACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount. |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/merchants). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/merchants), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument details |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC information |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA information. |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURENED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number. |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name. |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
\| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
\| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted. | After correcting the amount, you can reinitiate the transfer. | Yes, after correcting amount. |
\| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer. | Yes, after correcting remarks. |
\| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneId, you can reinitiate the transfer. | Yes, after correcting beneficiary id. |
\| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer. | Yes, after correcting name. |
\| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer. | Yes, after correcting email. |
\| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabets and numbers. | After correcting the iban, you can reinitiate the transfer. | Yes, after correcting IBAN. |
\| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode invalid (allowed: banktransfer, upi, paytm, amazonpay, imps, neft, rtgs, ppc). | After correcting the transferMode, you can reinitiate the transfer. | Yes, after correcting mode. |
\| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer. | Yes, after correcting currency. |
\| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. After correcting the account number/ VPA, you can reinitiate the transfer. | After correcting the account number / VPA, reinitiate the transfer. | Yes, after correcting details. |
\| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The amount entered breaches the limits set for the beneficiary's Amazon account. | After verifying the limits, reinitiate the transfer. | Yes, after verifying limits. |
\| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as risk product detected an anomaly. | Reinitiate after validation at your end. | Yes, after validation. |
\| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as risk product detected an anomaly. | Approve / reject on dashboard (Payout Protect). | - |
\| 200 | FAILED | BAD\_CONNECTION | Intermittent internal error between Cashfree and partner bank. | Reinitiate the transfer. | Yes, after some time. |
\| 200 | REJECTED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_INVALID | Beneficiary in the request does not exist. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | FAILED | BENE\_NOT\_REGISTERED | Beneficiary not registered with partner bank. | Add correct beneficiary then reinitiate. | Yes, after adding beneficiary. |
\| 200 | VALIDATION\_PENDING| BENE\_VERIFICATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Check Status API or webhooks. | - |
\| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | Beneficiary bank offline. | Reinitiate after some time. | Yes, after some time. |
\| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | Beneficiary name differs per partner bank. | Add correct beneficiary then reinitiate. | Yes, after correcting name. |
\| 200 | REJECTED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | CARD\_UNSUPPORTED | Card not supported. | Change payment instrument then reinitiate. | Yes, after changing instrument. |
\| 200 | FAILED | DUPLICATE\_FAILED | Bank claims duplicate request. | Reinitiate with different transfer id. | Yes, with new id. |
\| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | Intermittent issue at partner bank retrieving balance. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | FAILED | INVALID\_CARD | Card details not correct. | Enter correct card details then reinitiate. | Yes, after correcting card. |
\| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | Transfer currency not supported for payment instrument id. | Change currency to INR and reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_MODE\_FAIL | Transfer mode not supported for beneficiary account. | Change mode then reinitiate. | Yes, after changing mode. |
\| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | Beneficiary account type invalid / unsupported. | Get new account from beneficiary then reinitiate. | Yes, after new account. |
\| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | Phone number not linked to any VPA. | Add correct phone beneficiary then reinitiate. | Yes, after correcting phone. |
\| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | Transfer currency not supported. | Change currency to INR then reinitiate. | Yes, after changing currency. |
\| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | KYC verification failed. | Reinitiate after resolving KYC. | Yes, after KYC resolution. |
\| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | KYC requirements not satisfied. | Complete KYC then reinitiate. | Yes, after completing KYC. |
\| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | Beneficiary account reached max transaction amount limit. | Reinitiate after 24 hours. | Yes, after 24 hours. |
\| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | Intermittent issue at Cashfree. | Reinitiate transfer. | Yes, after some time. |
\| 200 | PENDING | LOW\_BALANCE\_QUEUED | Balance in the fund source is exhausted; will auto process post recharge. | Recharge fund source; rely on status API/webhook. | - |
\| 200 | REJECTED | MANUALLY\_REJECTED | Transfer manually rejected by you. | Reinitiate if required. | Yes, if needed. |
\| 200 | REJECTED | PAYOUT\_INACTIVE | Payout account inactive. | Activate account then reinitiate. | Yes, after activation. |
\| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | Connection issue with partner bank. | Reinitiate after some time. | Yes, after some time. |
\| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | Quick transfer disabled for payout account. | Enable quick transfer then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | REJECTED | Transfer rejected (generic). | Review request and correct issues. | Yes, after correction. |
\| 200 | REVERSED | REVERSED | Transfer reversed by beneficiary bank; credit failed. | Reinitiate after correcting issue. | Yes, after correction. |
\| 200 | FAILED | RTGS\_MODE\_FAIL | Beneficiary account does not support RTGS transfers. | Try NEFT or other channels. | Yes, via different mode. |
\| 200 | FAILED | SUSPECTED\_FAILED | Partner bank suspects transfer is fraudulent. | Contact support / investigate before retry. | No (investigate). |
\| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | Transfers to virtual bank accounts not enabled. | Enable payouts to VBAs then reinitiate. | Yes, after enabling. |
\| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | Issue with account configuration selecting fund source. | Contact care team; fix config then reinitiate. | Yes, after fixing config. |
\| 200 | VALIDATION\_PENDING| VALIDATION\_PENDING | Beneficiary verification pending; transfer will be attempted post validation. | Rely on Status API / webhooks. | - |
\| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | Beneficiary code invalid. | Correct beneficiary code then reinitiate. | Yes, after correcting code. |
\| 200 | REJECTED | DUPLICATE\_TRANSFER | Transfer already present / processed; duplicate transferId. | Change transferId and reinitiate. | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 404 | batch\_transfer\_id\_not\_found | batch\_transfer\_id does not exist | Enter an existing batch transfer ID. |
| 404 | cf\_batch\_transfer\_id\_invalid | cf\_batch\_transfer\_id does not exist | Enter an existing cf batch transfer ID. |
# Self Withdrawal
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/self-withdrawal
post /payout/v1/selfWithdrawal
Use this API to request a self withdrawal at Cashfree. Self withdrawal is allowed a maximum of 3 times a day. The API response will either result in an ERROR or SUCCESS response. The status of the withdrawal request is available on the dashboard.
# Standard Transfer Async
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/standard-transfer-async
post /payout/v1/requestAsyncTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is an async transfer request.
# Standard Transfer Async v1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/standard-transfer-async-v12
post /payout/v1.2/requestAsyncTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is an async transfer request.
# Standard Transfer Sync
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/standard-transfer-sync
post /payout/v1/requestTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is a sync transfer request.
# Standard Transfer Sync v1.2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/standard-transfer-sync-v12
post /payout/v1.2/requestTransfer
Use this API to initiate an amount transfer request at Cashfree by providing beneficiary id, amount, and transfer id. This is a sync transfer request.
# Batch Transfer V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/transfers-v2/batch-transfer-v2
post /transfers/batch
Use this API to initiate a batch transfer request at Cashfree. You can transfer money to multiple beneficiaries. The batch transfer limit is 5,000 in the production environment and 1,000 by default in the test environment.
**5XX error**
When you get a 5XX response, don't initiate another transaction.
Check the status of the batch transfer using Get Batch Transfer Status V2 and then proceed further.
**Get Transfer Status**
Use the [Get Batch Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2) API to get the status of the batch transfer request. The Get Transfer Status V2 API does not give you the status of the batch transfer requests.
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc, have breached the limit. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires approval as the transfer amount etc, has breached the limit. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as it is a high risk transaction detected by the Payout Protect model. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_MANUAL\_REVIEW\_REQ | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_ANOMALY\_DETECTED | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review due to anomaly detection. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_BENEFICIARY\_HIGH\_RISK | The transfer requires approval as the beneficiary has been identified as high risk by the Payout Protect model. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_VELOCITY\_THRESHOLD | The transfer requires approval as it breaches the velocity threshold set in the Payout Protect rules. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_TIME\_WINDOW\_BREACH | The transfer requires approval as it falls outside the allowed time window defined in the Payout Protect rules. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_AMOUNT\_THRESHOLD | The transfer requires approval as it exceeds the amount threshold set in the Payout Protect rules. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | HIGH\_RISK\_BENEFICIARY | The transfer requires approval as the beneficiary is identified as high risk. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | UNUSUAL\_ACTIVITY\_DETECTED | The transfer requires approval as unusual activity has been detected in the transfer pattern. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | BLACKOUT\_WINDOW\_RULE | The transfer requires approval as it falls within the blackout window defined in the Payout Protect rules. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | CUSTOM\_RULE\_TRIGGERED | The transfer requires approval as it has triggered a custom rule defined in the Payout Protect settings. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | MANUAL\_APPROVAL\_REQUIRED | The transfer requires manual approval as per the configured workflow. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. | - |
| 200 | APPROVAL\_PENDING | COMPLIANCE\_REVIEW\_PENDING | The transfer requires approval as it is pending compliance review. You can approve or reject the transfer request from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | Approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account does not support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | | |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the right beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode. |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting the beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s) | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limit |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the new details or getting the account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account does not support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | batch\_transfer\_id\_missing | batch\_transfer\_id\_missing is missing in the request | Enter a batch transfer ID in the request. |
| 400 | batch\_transfer\_id\_invalid | batch\_transfer\_id\_invalid should be alphanumeric | Enter a valid batch transfer ID. |
| 400 | transfers\[0].transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer ID. |
| 400 | transfers\[0].transfer\_id\_missing | transfer\_id is missing in the request | Enter a transfer ID in the request. |
| 400 | transfers\[0].transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter an amount greater than 1.00. |
| 400 | transfers\[0].transfer\_amount\_missing | transfer\_amount is missing in the request | Enter a transfer amount in the request. |
| 400 | transfers\[0].transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Enter a valid transfer mode. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Enter a valid beneficiary ID. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Enter a valid beneficiary name. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Enter a valid bank account number. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Enter a valid IFSC. |
| 400 | transfers\[0].beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Enter a valid VPA. |
# Get Batch Transfer Status V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2
get /transfers/batch
Use this API to get the status of the initiated batch transfer. You can use either the batch_transfer_id or cf_batch_transfer_id to fetch the details.
To check the status of batch transfers, use the [Get Batch Transfer Status API](/docs/api-reference/payouts/v2/transfers-v2/get-batch-transfer-status-v2). Do not use the Get Transfer Status API; it applies only to individual transfers and may not provide accurate results for batch transactions.
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as it is a high risk transaction detected by Payout Protect model. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_MANUAL\_REVIEW\_REQ | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_ANOMALY\_DETECTED | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review due to anomaly detection. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_BENEFICIARY\_HIGH\_RISK | The transfer requires approval as the beneficiary has been identified as high risk by the Payout Protect model. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_VELOCITY\_THRESHOLD | The transfer requires approval as it breaches the velocity threshold set in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_TIME\_WINDOW\_BREACH | The transfer requires approval as it falls outside the allowed time window defined in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_AMOUNT\_THRESHOLD | The transfer requires approval as it exceeds the amount threshold set in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | HIGH\_RISK\_BENEFICIARY | The transfer requires approval as the beneficiary is identified as high risk. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | UNUSUAL\_ACTIVITY\_DETECTED | The transfer requires approval as unusual activity has been detected in the transfer pattern. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | BLACKOUT\_WINDOW\_RULE | The transfer requires approval as it falls within the blackout window defined in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | CUSTOM\_RULE\_TRIGGERED | The transfer requires approval as it has triggered a custom rule defined in the Payout Protect settings. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | MANUAL\_APPROVAL\_REQUIRED | The transfer requires manual approval as per the configured workflow. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Transfers > Approve** tab. | - |
| 200 | APPROVAL\_PENDING | COMPLIANCE\_REVIEW\_PENDING | The transfer requires approval as it is pending compliance review. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Transfers > Approve** tab. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time |
| 200 | FAILED | DEST\_LIMIT\_BREACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount. |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument details |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC information |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA information. |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REJECTED | BENE\_INVALID\_MODE | The transfer has been rejected because the mode is invalid for the given beneficiary. After correcting the mode and beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the mode and beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the details |
| 200 | REJECTED | INVALID\_PHONE\_BENEFICIARY | The transfer has been rejected because the beneficiary is Invalid. After correcting the beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary details |
| 200 | REJECTED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has been rejected because the beneficiary account or ifsc is Invalid. After correcting the beneficiary details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the beneficiary details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary details |
| 200 | REJECTED | NAME\_INVALID | The transfer has been rejected because the name is Invalid. Please refer Cashfree official documentation and after correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the name |
| 200 | REJECTED | EMAIL\_INVALID | The transfer has been rejected because the email is Invalid. Please refer Cashfree official documentation and after correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the email |
| 200 | REJECTED | REMARKS\_INVALID | The transfer has been rejected because the remark is Invalid. Please refer Cashfree official documentation and after correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the remarks |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURENED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number. |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name. |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 404 | batch\_transfer\_id\_not\_found | batch\_transfer\_id does not exist | Enter an existing batch transfer ID. |
| 404 | cf\_batch\_transfer\_id\_invalid | cf\_batch\_transfer\_id does not exist | Enter an existing cf batch transfer ID. |
| 404 | transfer\_id\_not\_found | transfer\_id does not exist | Enter an existing transfer ID. |
# Get Transfer Status V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/transfers-v2/get-transfer-status-v2
get /transfers
Use this API to get the status of the initiated transfer. You can use either the transfer_id or cf_transfer_id to fetch the details.
For batch transfers, check the status of individual transfers **only after** the batch status is `PROCESSED`.
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree - Yes or no |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as it is a high risk transaction detected by Payout Protect model. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers**. | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. Post the transfer is approved, the request is sent to the partner bank for further processing. | |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_MANUAL\_REVIEW\_REQ | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_ANOMALY\_DETECTED | The transfer requires approval as it has been flagged by the Payout Protect risk model for manual review due to anomaly detection. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_BENEFICIARY\_HIGH\_RISK | The transfer requires approval as the beneficiary has been identified as high risk by the Payout Protect model. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_VELOCITY\_THRESHOLD | The transfer requires approval as it breaches the velocity threshold set in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_TIME\_WINDOW\_BREACH | The transfer requires approval as it falls outside the allowed time window defined in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | RISK\_CHECK\_AMOUNT\_THRESHOLD | The transfer requires approval as it exceeds the amount threshold set in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | HIGH\_RISK\_BENEFICIARY | The transfer requires approval as the beneficiary is identified as high risk. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | UNUSUAL\_ACTIVITY\_DETECTED | The transfer requires approval as unusual activity has been detected in the transfer pattern. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | BLACKOUT\_WINDOW\_RULE | The transfer requires approval as it falls within the blackout window defined in the Payout Protect rules. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | CUSTOM\_RULE\_TRIGGERED | The transfer requires approval as it has triggered a custom rule defined in the Payout Protect settings. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Payout Protect > Risky Transfers > Flagged Transfers** tab. | - |
| 200 | APPROVAL\_PENDING | MANUAL\_APPROVAL\_REQUIRED | The transfer requires manual approval as per the configured workflow. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Transfers > Approve** tab. | - |
| 200 | APPROVAL\_PENDING | COMPLIANCE\_REVIEW\_PENDING | The transfer requires approval as it is pending compliance review. You can approve or reject the transfer request from the Cashfree Merchant Dashboard. | Approve/reject the transfer on the Merchant Dashboard and go to **Transfers > Approve** tab. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENE | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode |
| 200 | FAILED | SOURCE\_BENE\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | YES |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s) | Yes |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | - | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging the account |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_PEOPLE | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating the mode |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details |
| 200 | REJECTED | BENE\_INVALID\_MODE | The transfer has been rejected because the mode is invalid for the given beneficiary. After correcting the mode and beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the mode and beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the details |
| 200 | REJECTED | INVALID\_PHONE\_BENEFICIARY | The transfer has been rejected because the beneficiary is Invalid. After correcting the beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary details |
| 200 | REJECTED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has been rejected because the beneficiary account or ifsc is Invalid. After correcting the beneficiary details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the beneficiary details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary details |
| 200 | REJECTED | NAME\_INVALID | The transfer has been rejected because the name is Invalid. Please refer Cashfree official documentation and after correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the name |
| 200 | REJECTED | EMAIL\_INVALID | The transfer has been rejected because the email is Invalid. Please refer Cashfree official documentation and after correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the email |
| 200 | REJECTED | REMARKS\_INVALID | The transfer has been rejected because the remark is Invalid. Please refer Cashfree official documentation and after correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Please refer Cashfree official documentation and after correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the remarks |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting the account unblocked |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing the mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number. |
| 200 | REVERSED | BENE\_NAME\_DIFFERS | The transfer has been reversed by the beneficiary bank because the Account Name of the beneficiary is different. After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the beneficiary name, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account name |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | transfer\_id\_missing | transfer\_id is missing in the request | Enter a transfer\_id in the request. |
| 400 | transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer\_id. |
| 400 | transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter a transfer\_amount greater than 1.00. |
| 400 | transfer\_amount\_missing | transfer\_amount is missing in the request | Enter a transfer\_amount in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode\_invalid transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Provide a valid beneficiary\_id in the request. |
| 400 | beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Provide a valid beneficiary\_name in the request. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Provide a valid bank\_account\_number in the request |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | Bank account number passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct bank\_account\_number in the request. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Provide a valid bank\_ifsc. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | Bank ifsc passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct bank\_ifsc for the beneficiary. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Provide a valid vpa. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | Vpa passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Provide the correct vpa for the beneficiary. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Provide an existing beneficiary. |
# Standard Transfer V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2
post /transfers
Use this API to initiate an amount transfer at Cashfree. It is an async request by default.
**5XX error**
When you get a 5XX response, do not initiate another transaction.
Check the status of the batch transfer using Get Batch Transfer Status V2 and then proceed further.
**Get Transfer Status**
Use the [Get Transfer Status V2](/docs/api-reference/payouts/v2/transfers-v2/standard-transfer-v2) API to get the status of the batch transfer request. The Get Transfer Status V2 API does not give you the status of the batch transfer requests.
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPOVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree to reattempt with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode. |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PAYOUT\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC. |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary. |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in Payout Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating model |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your payout account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your payout account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PAYOUT\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your payout account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked. |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting amount. |
| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting remarks. |
| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary id. |
| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting email. |
| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabet and numbers. | After correcting the iban, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting IBAN. |
| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode can contain in one of banktransfer upi paytm amazonpay imps neft rtgs ppc. | After correcting the transfermode, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting mode. |
| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting currency. |
| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The transfer has been rejected because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The transfer has failed because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as Cashfree risk product has detected an anamoly. | You can reinitiate the transfer request after validation at your end. | Yes, after validation. |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as Cashfree risk product has detected an anamoly. | You can approve/reject the transfer on the merchant dashboard. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | BAD\_CONNECTION | The transfer has failed because there was an intermittent internal error between Cashfree and the partner bank. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | BENE\_INVALID | The transfer has been rejected because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_INVALID | The transfer has failed because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_NOT\_REGISTERED | The transfer has been rejected because the beneficiary added in the transfer request is not registered with the partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | VALIDATION\_PENDING | BENE\_VERIFICATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | - | - |
| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | The transfer has failed because the respective beneficiary bank is offline. | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | The transfer has failed because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | CARD\_UNSUPPORTED | The transfer has been rejected because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | CARD\_UNSUPPORTED | The transfer has failed because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | DUPLICATE\_FAILED | The transfer has failed as the bank claims of receiving a duplicate request at their end as of now. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new id. |
| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | The transfer has failed because there was an intermittent issue at the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | INVALID\_CARD | The transfer has been rejected because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | FAILED | INVALID\_CARD | The transfer has failed because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_MODE\_FAIL | The transfer has failed because the requested transfer mode is not supported for this beneficiary account as per the partner bank. | After changing the transfer mode, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has been rejected because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has failed because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | The transfer has failed because the beneficiary's phone number is not linked to any VPA. | After adding the right phone beneficiary, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting phone. |
| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | The transfer has failed because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | The transfer has failed because the KYC verification has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after KYC resolution. |
| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | The transfer has failed because the KYC requirements have not been satisfied. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after completing KYC. |
| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | The transfer has failed because the beneficiaries account has reached maximum transaction amount limit. | After 24 hours, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after 24 hours. |
| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | The transfer has failed because of an intermittent issue at Cashfree's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | PENDING | LOW\_BALANCE\_QUEUED | The transfer is pending because the balance in the fund source is exhausted. This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. | This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. Please rely on check status API or webhook for checking the status of this transfer. | - |
| 200 | REJECTED | MANUALLY\_REJECTED | The transfer has been manually rejected by you. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. | Yes, if needed. |
| 200 | REJECTED | PAYOUT\_INACTIVE | The transfer has been rejected because your payout account has been inactive. | After getting the account activated, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after activation. |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. | Rely on Check Status API or Webhooks | - |
| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | The transfer has failed because there was a connection issue with the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | The transfer has been rejected because quick transfer is disabled for your payout account. | After getting quick transfer enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after enabling. |
| 200 | REJECTED | REJECTED | Transfer rejected. | - | Yes, after correction. |
| 200 | REVERSED | REVERSED | The transfer has been reversed by the beneficiary bank as the credit to end-beneficiary's account has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correction. |
| 200 | FAILED | RTGS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support RTGS transfers. | You can try NEFT or other channels to do the disbursals. | Yes, via different mode. |
| 200 | FAILED | SUSPECTED\_FAILED | The transfer has failed, as the partner bank suspects that the transfer is of fraudulent nature. | - | No (investigate). |
| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | The transfer has been rejected because transfers to virtual bank accounts are not enabled for your Cashfree Account. | After getting payouts to virtual bank accounts enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree for enabling payouts to virtual bank accounts. | Yes, after enabling. |
| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | The transfer has been rejected because their is some issue with your account configuration. | You can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after fixing config. |
| 200 | VALIDATION\_PENDING | VALIDATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | Rely on Check Status API or Webhooks | - |
| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | The transfer has been rejected because the bene code is Invalid. | After correcting the beneficiary code, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting code. |
| 200 | REJECTED | DUPLICATE\_TRANSFER | The transfer is already present in the file or has been processed previously. Please change the transferId in the api request. | After changing the Transfer Id, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | transfer\_id\_missing | transfer\_id is missing in the request | Enter a valid transfer\_id in the request. |
| 400 | transfer\_id\_invalid | transfer\_id should be alphanumeric | Enter a valid transfer\_id in the request. |
| 400 | transfer\_amount\_invalid | transfer\_amount should be greater then 1.00 | Enter an amount greater than 1.00. |
| 400 | transfer\_amount\_missing | transfer\_amount is missing in the request | Provide a value for the transfer\_amount parameter in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi, paytm, amazonpay, card and cardupi | Provide a valid transfer\_mode in the request. |
| 400 | beneficiary\_details.beneficiary\_id\_invalid | beneficiary\_id should be alphanumeric | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_name\_invalid | beneficiary\_name is invalid. only alphabets and whitespaces are allowed | Enter a valid beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Enter a valid bank\_account\_number. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_account\_number\_invalid | Bank account number passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_account\_number associated with the beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Enter a valid bank\_ifsc. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.bank\_ifsc\_invalid | Bank ifsc passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_ifsc associated with the beneficiary\_id. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | vpa is in invalid format | Enter a valid VPA. |
| 400 | beneficiary\_details.beneficiary\_instrument\_details.vpa\_invalid | Vpa passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct vpa associated with the beneficiary\_id. |
| 404 | beneficiary\_not\_found | Beneficiary does not exist | Enter a valid beneficiary\_id. |
# Validate Payout
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/validate-payout-v2
post /payout/validatePayout
Validates a UPI VPA or phone number and returns a single-use transfer token valid for one hour. Pass this token to the [Process Validated Payout API](/docs/api-reference/payouts/v2/verify-and-pay-transfers-v2) (`POST /payout/transfers`) to initiate the payout.
In the request body, pass the value for exactly one of `vpa` or `phone`, not both.
The response contains either basic or advanced VPA details. Advanced details include IFSC branch information. To enable advanced details for your account, fill the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod&raise_issue=1).
# Verify
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/verify
post /payout/v1/verifyToke
Use this API to verify the bearer token generated. If the token does not exist/invalid/expired, the response "Token is not valid" is returned. Regenerate token in case of token expiry to make API calls (use /payout/v1/authorize for this).
# Verify
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/verify-1
post /payout/v1/verifyToken
Verify the bearer token generated. If the token does not exist, is invalid, or has expired, the response "Token is not valid" is returned. Regenerate token in case of token expiry for making API calls ( use /payout/v1/authorize for this).
# Process Validated Payout
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/verify-and-pay-transfers-v2
post /payout/transfers
Initiates a UPI payout using the transfer token returned by the [Validate Payout API](/docs/api-reference/payouts/v2/validate-payout-v2). The token is single-use and expires after one hour. When you use a transfer token, only `upi` is supported as the transfer mode.
The `transfer_id` in this request must match the `transfer_id` you used in that Validate Payout call.
Optionally set `fundsource_id` to the connected bank account to use as the fund source.
# Webhook Version V1
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/webhooks/webhooks-v1
Configure Cashfree Payouts v1 webhooks to receive HTTP callbacks for transfer events, set the webhook URL in the dashboard, and verify signatures.
Webhooks are events that notify you about the payment status. All Payout integrations should establish a webhook to listen to payout events, like status changes on payments. Webhooks are HTTP callbacks that receive notification messages for events.
Webhooks help you receive automatic updates and are significant for completing the integration with Cashfree. Webhooks are triggered with a request from your side, for example, when a transfer fails or when a daily report is available. Requests get processed both synchronously and asynchronously. In rare scenarios, for some payment methods, the outcome may take a longer duration to confirm. Cashfree notifies you once we get updates from the bank about the payment status.
Do not go live without signature verification if you are using webhooks.
The oldest API keys, that are active, for Webhook signature verification to
avoid signature mismatch errors.
### Add a webhook
Follow the instructions below to configure webhooks for version 2 APIs:
1. Log in to the *Payouts* dashboard using your credentials.
2. Navigate to **Developers** > **Webhooks**.
3. Click **Add Webhook URL** in the *Webhooks* page.
4. In the *Add Webhook* popup, enter the following information:
* **Webhook URL**: Enter the URL where you want to receive the transfer related notifications.
* **Select a webhook version**: Select **V1** from the dropdown menu.
5. Click **Test & Add Webhook**.
***
## Webhook events
Payouts webhooks enable you to receive updates about all event-driven activities originating from your account. Below is the list of payouts webhooks:
| Events | Notifications |
| :- | :- |
| TRANSFER\_SUCCESS | Transfer successful at the bank and account debited. |
| TRANSFER\_FAILED | Sent whenever a transfer attempt fails. |
| TRANSFER\_REVERSED | Transfer reversed by the beneficiary bank. |
| CREDIT\_CONFIRMATION | Confirmation of balance credit. |
| TRANSFER\_ACKNOWLEDGED | After the beneficiary bank has deposited the money it confirms the transfer. |
| TRANSFER\_REJECTED | Transfer rejected by Cashfree. |
| BENEFICIARY\_INCIDENT | Sent whenever a beneficiary incident is created/resolved. |
| LOW\_BALANCE\_ALERT | Payouts recharge account low balance alert. |
| [BULK\_TRANSFER\_REJECTED](/docs/api-reference/payouts/v2/webhooks/webhooks-v1#bulk_transfer_rejected) | One of the transfers in the batch transfer file has been rejected. |
## TRANSFER\_SUCCESS
Sent when a transfer is attempted successfully.
| Parameters | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = TRANSFER\_SUCCESS. |
| transferId | Id of the transfer passed by the merchant. |
| referenceId | Id of the transfer generated by Cashfree. |
| acknowledged | The flag indicates if the beneficiary bank has acknowledged the transfer. |
| eventTime | Transfer initiation time. |
| utr | Unique transaction reference number provided by the bank. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
### What does the response parameter 'acknowledged' mean
The acknowledged parameter value conveys if the beneficiary received the funds by checking its value. Ack = 1 or 0. 1 denotes the beneficiary received funds, and 0 denotes the beneficiary had not received funds.
The cash flow happens as explained below:
1. Debit: The debit of the transfers happens on the remitter account. After a successful debit, the beneficiary bank does further processing. When only the debit is successful, Ack = 0.
2. Credit: The beneficiary bank credits the fund to the account. The transfer is sent from the remitter bank to the beneficiary bank after a successful debit. When the credit to the end beneficiary is successful, Ack = 1.
To confirm the status of a payout, you need to check the acknowledged parameter value. If the value is 1, you can mark the transfer as successful. However, if the value is 0, you must either wait for the TRANSFER\_ACKNOWLEDGED webhook event or use the [Get Transfer Status](/docs/api-reference/payouts/v1/get-transfer-status-v12) API and confirm the acknowledged value.
***
## TRANSFER\_FAILED
Sent when a transfer attempt fails.
| Parameters | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = TRANSFER\_FAILED. |
| transferId | Id of the transfer passed by the merchant |
| referenceId | Id of the transfer generated by Cashfree. |
| reason | Reason for failure. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
## TRANSFER\_REVERSED
Sent when the beneficiary bank reverses a transfer.
| Parameters | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = TRANSFER\_REVERSED. |
| transferId | Id of the transfer passed by the merchant. |
| referenceId | Id of the transfer generated by Cashfree. |
| eventTime | Time at which the transfer was reversed. |
| reason | Reason for failure. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
## CREDIT\_CONFIRMATION
Sent when the balance credit is confirmed.
| Parameters | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = CREDIT\_CONFIRMATION. |
| ledgerBalance | The overall balance of the ledger. |
| amount | Amount deposited. |
| utr | Unique transaction reference number provided by the bank. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
## TRANSFER\_ACKNOWLEDGED
Sent when the bank acknowledges a transfer.
| Parameters | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = TRANSFER\_ACKNOWLEDGED. |
| transferId | Id of the transfer passed by the merchant. |
| referenceId | Id of the transfer generated by Cashfree. |
| acknowledged | The flag illustrates if the beneficiary bank acknowledges the transfer. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
## TRANSFER\_REJECTED
Sent when a transfer is rejected.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = TRANSFER\_REJECTED. |
| transferId | Id of the transfer passed by the merchant. |
| referenceId | Id of the transfer generated by Cashfree. |
| reason | Reason for rejection. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
## BENEFICIARY\_INCIDENT
Sent when a beneficiary incident is created or resolved.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = BENEFICIARY\_INCIDENT. |
| beneEntity | The entity of the beneficiary (BANK). |
| id | Identifier of the incident. |
| mode | Mode of the incident (IMPS/NEFT) |
| startedAt | Start time of the incident. |
| status | Status of the incident (ACTIVE/RESOLVED). |
| isScheduled | Scheduled or unscheduled incident (true or false). |
| severity | The severity of the incident (LOW/HIGH). |
| entityName | Name of the entity on which the incident is created (Bank Name). |
| entityCode | Code of the entity on which the incident is created. |
| resolvedAt | Resolution time of the incident. |
## LOW\_BALANCE\_ALERT
Sent when the payout balance is low.
| Parameter | Description |
| :- | :- |
| event | It contains the name of the event which just occurred. Value = LOW\_BALANCE\_ALERT |
| currentBalance | The current balance of the beneficiary account |
| alertTime | Alert initiation time. |
| signature | A unique string that helps distinguish that the request is genuine and initiated by Cashfree. |
### BULK\_TRANSFER\_REJECTED
Sent when one of the transfers in the batch transfer file has been rejected.
| Parameter | Description |
| :- | :- |
| event | One of the transfers in the batch transfer file has been rejected |
| transferId | It is the unique ID you created to identify the transfer |
| batchTransferReferenceId | It is the ID created by Cashfree for internal reference. |
| eventTime | Event initiation time |
| reason | It describes the reason for the rejection. |
| signature | A unique string which helps distinguish that the request is genuine and initiated by Cashfree. |
**Delay in Receiving the Response**
Cashfree receives a response from the bank with the status of the transfer instantly. At times the response may get delayed due to various reasons, and the transaction status will be marked as Pending, till we get a response.
Cashfree polls the transaction status from the bank for the next 72 hours. If we do not receive the status after 72 hours, you must manually reconcile the transaction.
***
### Signature Verification
Cashfree sends a signature alongside every webhook, verifying this signature ( passed along with the POST parameters ) is mandatory before processing any response. It helps authenticate that the webhook is from Cashfree.
We strongly recommend whitelisting Cashfree production IP to help make your communication with us more secure.
Following are the steps to verify Cashfree signature:
1. Get all the POST parameters except ‘signature’ and assign it to an array as key-value pair.
2. Sort the array based on keys.
3. Concatenate all the values in this array and the resultant is the post data (say, postData).
4. Encrypt **postData** using SHA-256, then base64-encode it.
5. Now verify if both the signature calculated and the signature received a match.
6. Proceed further if it matches, else discard the request.
Our libraries also support signature verification. To verify the signature returned by Cashfree call the following methods from the library.
Below are the code snippets that can help you verify the signature:
```php PHP theme={"dark"}
$value){
if (strlen($value) > 0) {
$postData .= $value;
}
}
$hash_hmac = hash_hmac('sha256', $postData, $clientSecret, true) ;
// Use the clientSecret from the oldest active Key Pair.
$computedSignature = base64_encode($hash_hmac);
if ($signature == $computedSignature) {
// Proceed based on $event
} else {
// Reject this call
}
?>
```
```java Java theme={"dark"}
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Mac;
import org.apache.commons.codec.binary.Base64;
public class ComputedSignature {
public static boolean checkSignature(String clientSecret, String data) {
// write your code here
ObjectMapper objectMapper = new ObjectMapper();
String signatureKey = "signature";
String hash = "";
try {
Map jsonMap = objectMapper.readValue(data, new TypeReference
## Webhook Retries
Cashfree webhooks service does its best to deliver events to your webhook endpoint. It's best practice for your application to respond to the callback. Our webhook service may send many payloads to a single endpoint in quick succession. You will need to build an application and configure your server to receive the response we send when events get triggered during the payout process.
Your server should return a 200 HTTP status code to acknowledge that you received the webhook without any issues. Any other information you return in the request headers or request body is ignored. Any response code outside the 200 range, including 3xx codes, indicates that you didn't receive the webhook.
When Cashfree doesn't receive the acknowledgement for any reason, we retry to establish communication at regular intervals. If we don't receive the response after several attempts, we gradually decrease the rate of retries. Based on this count, the service is disabled if it fails more than five times.
If you don't receive notifications from Cashfree as expected, please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
## IPs to whitelist
When you decide to consume the webhooks, first, you need to verify whether your systems need IP whitelisting to be done at your end or not. Accordingly, you can whitelist the below IPs of Cashfree:
| UAT |
| :- |
| 52.66.25.127 |
| 15.206.45.168 |
| Prod |
| :- |
| 52.66.101.190 |
| 3.109.102.144 |
| 18.60.134.245 |
| 18.60.183.142 |
| Port |
| :- |
| 443 (secured) |
# Webhooks Version V2
Source: https://www.cashfree.com/docs/api-reference/payouts/v2/webhooks/webhooks-v2
Set up Cashfree Payouts v2 webhooks to receive HTTP callbacks for transfer events, configure retries, whitelist Cashfree IPs, and explore sample event payloads.
Webhooks are HTTP callbacks that Cashfree sends to your server when specific events occur in your payout transactions. They provide real-time notifications about transfer status changes, enabling you to automate your business processes and keep your systems synchronised with transaction updates.
Version 2 webhooks offer enhanced reliability, improved payload structure, and additional event types compared to the previous version. They're essential for maintaining accurate transaction records and providing timely updates to your end users about their transfer status.
For seamless integration and security in handling your transactions, refer to the following essential guidelines:
* [Add a webhook](#add-a-webhook)
* [Webhook retries](#webhook-retries)
* [IPs to whitelist](#ips-to-whitelist)
### Add a webhook
Follow the instructions below to configure webhooks for version 2 APIs:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/merchants/landing).
2. Select **Payouts**.
3. Navigate to **Developers** > **Webhooks**.
4. Click **Add Webhook URL** on the *Webhooks* page.
5. In the *Add Webhook* popup, enter the following information:
* **Webhook URL**: Enter the URL where you want to receive transfer-related notifications.
* **Select a webhook version**: Select **V2** from the dropdown menu.
**Webhook Version: V2**: You will receive V2 webhooks only if you select the option as described and configure the respective URL.
6. Click **Test & Add Webhook**.
## Webhook signature verification code
These code snippets provide functionality to verify the authenticity of webhook requests and parse the payload data. They ensure that incoming webhook requests are from a trusted source by checking their signature and then processing the request data.
```go Go theme={"dark"}
type PayoutWebhookEvent struct {
Type string
Raw string
Object interface{}
}
func PayoutVerifyWebhookSignature(signature string, rawBody string, timestamp string) (*PayoutWebhookEvent, error) {
signatureString := timestamp + rawBody
hmacInstance := hmac.New(sha256.New, []byte(*XClientSecret))
hmacInstance.Write([]byte(signatureString))
bytesData := hmacInstance.Sum(nil)
generatedSignature := base64.StdEncoding.EncodeToString(bytesData)
if generatedSignature == signature {
var object interface{}
err := json.Unmarshal([]byte(rawBody), &object)
if err != nil {
return nil, errors.New("something went wrong when unmarshalling raw body")
}
if objectAsMapInterface, ok := object.(map[string]interface{}); ok {
if webhookType, ok := objectAsMapInterface["type"].(string); ok {
return &PayoutWebhookEvent{Type: webhookType, Raw: rawBody, Object: object}, nil
}
}
return &PayoutWebhookEvent{Type: "", Raw: rawBody, Object: object}, nil
}
return nil, errors.New("generated signature and received signature did not match")
}
```
```jsx Node theme={"dark"}
import crypto from "crypto";
class PayoutWebhookEvent {
constructor(type, rawBody, object) {
this.type = type;
this.raw = rawBody;
this.object = object;
}
}
class Cashfree {
static XClientSecret;
static XApiVersion = "2024-01-01";
/**
* Use this API to verify your webhook signature once you receive from Cashfree's server.
* @summary Verify Webhook Signatures
* @param {string} signature that is present in the header of the webhook ("x-webhook-signature")
* @param {string} rawBody is the entire body sent to the server in string format
* @param {string} timestamp that is present in the header of the webhook ("x-webhook-timestamp")
* @throws {Error}
*/
static PayoutVerifyWebhookSignature(signature, rawBody, timestamp) {
const body = timestamp + rawBody;
const secretKey = Cashfree.XClientSecret;
let generatedSignature = crypto
.createHmac("sha256", secretKey)
.update(body)
.digest("base64");
if (generatedSignature === signature) {
let jsonObject = JSON.parse(rawBody);
return new PayoutWebhookEvent(jsonObject.type, rawBody, jsonObject);
}
throw new Error(
"Generated signature and received signature did not match."
);
}
}
```
**Client secret for webhooksignature**
Please ensure that the oldest active client secret is used to generate the webhook signature. Using any other client secret will lead to a signature mismatch.
### Components
The webhook signature verification implementation uses the following key components to ensure secure processing of webhook events:
#### PayoutWebhookEvent class
This class represents the structure of a webhook event and contains the following properties:
| Property | Type | Description |
| :- | :- | :- |
| `Type` | string | The type of the event. |
| `Raw` | string | The raw JSON body of the webhook request. |
| `Object` | object | The parsed JSON object from the raw body. |
#### PayoutVerifyWebhookSignature method
This method verifies the signature of a webhook request and parses the data. Use the following parameters when calling this method:
| Parameter | Type | Description |
| :- | :- | :- |
| `signature` | string | The HMAC signature provided in the header information of the webhook. |
| `rawBody` | string | The raw JSON body of the request in string format. |
| `timestamp` | string | The timestamp provided in the header information of the webhook. |
#### Cashfree class
This class provides the method for verifying webhook signatures and includes the following properties:
| Property | Type | Description |
| :- | :- | :- |
| `XClientSecret` | string | Secret key. |
| `XAPIVersion` | string | The API version: 2024-01-01. |
## Webhook events
Payouts webhooks enable you to receive updates about all event-driven activities originating from your account. Below is the list of payout webhooks:
| Events | Notifications |
| :- | :- |
| `TRANSFER_ACKNOWLEDGED` | You receive this event when the transfer is successful, the amount is debited from the account, and the funds are credited to the end user. |
| `TRANSFER_SUCCESS` | You receive this event when the transferred amount is deposited in the beneficiary's bank account. |
| `TRANSFER_FAILED` | You receive this event when the transfer attempt fails. |
| `TRANSFER_REVERSED` | You receive this event when the beneficiary's bank reverses the transfer request. |
| `TRANSFER_REJECTED` | You receive this event when Cashfree rejects the transfer request. |
| `BULK_TRANSFER_REJECTED` | You receive this event when one or more transfers in the batch transfer request are rejected. |
| `BENEFICIARY_INCIDENT` | You receive this event when there is a service disruption or incident affecting a specific beneficiary bank or payment mode. |
| `CREDIT_CONFIRMATION` | You receive this event when funds are credited to your account balance, providing confirmation of the credit transaction. |
| `LOW_BALANCE_ALERT` | You receive this event when your account balance falls below a predefined threshold, alerting you to add funds. |
### Sample payload
The following examples show the JSON payload structure for each webhook event type listed above. Each payload contains event-specific data that helps you understand the transfer status and take appropriate action in your application.
```json ACKNOWLEDGED theme={"dark"}
{
"data": {
"transfer_id": "JUNOB2018",
"cf_transfer_id": "123456",
"status": "SUCCESS",
"status_code": "COMPLETED",
"status_description": "The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary.",
"beneficiary_details": {
"beneficiary_id": "JOHN18011",
"beneficiary_instrument_details": {
"bank_account_number": "7766671501729",
"bank_ifsc": "SBIN0000003"
}
},
"transfer_amount": 1,
"transfer_service_charge": 1,
"transfer_service_tax": 0.18,
"transfer_mode": "BANK",
"transfer_utr": "TESTR92023012200543116",
"fundsource_id": "CASHFREE_1",
"added_on": "2021-11-24T13:39:25Z",
"updated_on": "2021-11-24T13:40:27Z"
},
"event_time": "2024-07-25T17:43:37",
"type": "TRANSFER_ACKNOWLEDGED"
}
```
```json SUCCESS theme={"dark"}
{
"data": {
"transfer_id": "JUNOB2018",
"cf_transfer_id": "123456",
"status": "SUCCESS",
"status_code": "SENT_TO_BENEFICIARY",
"status_description": "The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary.",
"beneficiary_details": {
"beneficiary_id": "JOHN18011",
"beneficiary_instrument_details": {
"bank_account_number": "7766671501729",
"bank_ifsc": "SBIN0000003"
}
},
"transfer_amount": 1,
"transfer_service_charge": 1,
"transfer_service_tax": 0.18,
"transfer_mode": "BANK",
"transfer_utr": "TESTR92023012200543116",
"fundsource_id": "CASHFREE_1",
"added_on": "2021-11-24T13:39:25Z",
"updated_on": "2021-11-24T13:40:27Z"
},
"event_time": "2024-07-25T17:43:37",
"type": "TRANSFER_SUCCESS"
}
```
```json FAILED theme={"dark"}
{
"data": {
"transfer_id": "JUNOB2018",
"cf_transfer_id": "123456",
"status": "FAILED",
"status_code": "IMPS_MODE_FAIL",
"status_description": "The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals.",
"beneficiary_details": {
"beneficiary_id": "JOHN18011",
"beneficiary_instrument_details": {
"bank_account_number": "7766671501729",
"bank_ifsc": "SBIN0000003"
}
},
"transfer_amount": 1,
"transfer_service_charge": 1,
"transfer_service_tax": 0.18,
"transfer_mode": "BANK",
"transfer_utr": "TESTR92023012200543116",
"fundsource_id": "CASHFREE_1",
"added_on": "2021-11-24T13:39:25Z",
"updated_on": "2021-11-24T13:40:27Z"
},
"event_time": "2024-07-25T17:43:37",
"type": "TRANSFER_FAILED"
}
```
```json REVERSED theme={"dark"}
{
"data": {
"transfer_id": "JUNOB2018",
"cf_transfer_id": "123456",
"status": "REVERSED",
"status_code": "INVALID_ACCOUNT_FAIL",
"status_description": "The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s).",
"beneficiary_details": {
"beneficiary_id": "JOHN18011",
"beneficiary_instrument_details": {
"bank_account_number": "7766671501729",
"bank_ifsc": "SBIN0000003"
}
},
"transfer_amount": 1,
"transfer_mode": "BANK",
"fundsource_id": "CASHFREE_1",
"added_on": "2021-11-24T13:39:25Z",
"updated_on": "2021-11-24T13:40:27Z"
},
"event_time": "2024-07-25T17:43:37",
"type": "TRANSFER_REVERSED"
}
```
```json REJECTED theme={"dark"}
{
"data": {
"transfer_id": "JUNOB2018",
"cf_transfer_id": "123456",
"status": "REJECTED",
"status_code": "INVALID_MODE_FOR_PYID",
"status_description": "The transfer has been rejected because the fundsource does not support this mode of transfer. You should get this mode activated on the fundsource by contacting Cashfree, and then initiate a new transfer request.",
"beneficiary_details": {
"beneficiary_id": "JOHN18011"
},
"transfer_amount": 1,
"transfer_mode": "BANK",
"fundsource_id": "CASHFREE_1",
"added_on": "2021-11-24T13:39:25Z",
"updated_on": "2021-11-24T13:40:27Z"
},
"event_time": "2024-07-25T17:43:37",
"type": "TRANSFER_REJECTED"
}
```
```json BULK_TRANSFER_REJECTED theme={"dark"}
{
"data": {
"batch_transfer_id": "test_batch_transfer_id",
"cf_batch_transfer_id": "123456",
"status": "REJECTED"
},
"event_time": "2024-07-25T17:43:37",
"type": "BULK_TRANSFER_REJECTED"
}
```
```json LOW_BALANCE theme={"dark"}
{
"data" : {
"current_balance": "8.53",
"fundsource_id": "astring"
},
"type": "LOW_BALANCE_ALERT",
"event_time": "2024-07-25T17:43:37"
}
```
```json CREDIT_CONFIRMATION theme={"dark"}
{
"data" : {
"ledger_balance": "8.53",
"utr": "ledgerEntryUTR654321",
"amount": "10.50",
"fundsource_id": "astring"
},
"type": "CREDIT_CONFIRMATION",
"event_time": "2024-07-25T17:43:37"
}
```
```json BENEFICIARY_INCIDENT theme={"dark"}
{
"data" : {
"bene_entity": "BANK",
"id": 789,
"mode": "UPI",
"started_at": "yyyy-MM-dd HH:mm:ss",
"status": "ACTIVE",
"is_scheduled": true,
"severity": "High",
"entity_name": "name",
"entity_code": "code",
"resolved_at": "yyyy-MM-dd HH:mm:ss"
},
"event_time": "2024-07-25T17:43:37",
"type": "BENEFICIARY_INCIDENT"
}
```
### Parameters
Find the parameters and their descriptions for the events `TRANSFER_ACKNOWLEDGED`, `TRANSFER_SUCCESS`, `TRANSFER_FAILED`, `TRANSFER_REVERSED`, and `TRANSFER_REJECTED` below:
| Parameter | Description |
| :- | :- |
| `transfer_id` | The unique ID you created to identify the transfer request. |
| `cf_transfer_id` | The unique ID created by Cashfree for reference purposes. |
| `status` | The status of the transfer. |
| `status_code` | The specific status of the transfer. |
| `status_description` | The detailed explanation of the transfer status. |
| `beneficiary_details` | Information about the beneficiary. |
| `beneficiary_id` | The unique ID to identify the beneficiary. |
| `beneficiary_instrument_details` | The account information of the beneficiary. |
| `bank_account_number` | The bank account number of the beneficiary. |
| `bank_ifsc` | The IFSC information of the bank. |
| `transfer_amount` | The transfer amount. |
| `transfer_service_charge` | The service charge applied for the transfer amount. |
| `transfer_service_tax` | The taxable amount for the service charge. |
| `transfer_mode` | The transfer mode. |
| `transfer_utr` | The unique transaction reference number. |
| `fundsource_id` | The unique ID to identify the fund source. |
| `added_on` | The date and time of the addition. |
| `updated_on` | The date and time of the update. |
| `event_time` | The date and time of the webhook event initiation. |
| `type` | The event type. |
Find the parameters and their descriptions for the event `BULK_TRANSFER_REJECTED` below:
| Parameter | Description |
| :- | :- |
| `batch_transfer_id` | The unique ID you created to identify the batch transfer request. |
| `cf_batch_transfer_id` | The unique ID created by Cashfree for reference purposes. |
| `status` | The status of the batch transfer request. |
| `event_time` | The date and time of the webhook event initiation. |
| `type` | The event type. |
A transfer is considered successful only when both the status is `SUCCESS` and the status code is `COMPLETED`.
### Webhook retries
Cashfree webhooks service does its best to deliver events to your webhook endpoint. It's best practice for your application to respond to the callback. Our webhook service may send many payloads to a single endpoint in quick succession. You will need to build an application and configure your server to receive the response we send when events get triggered during the payout process.
Your server should return a 200 HTTP status code to acknowledge that you received the webhook without any issues. Any other information you return in the request headers or request body is ignored. Any response code outside the 200 range, including 3xx codes, indicates that you didn't receive the webhook.
When Cashfree doesn't receive the acknowledgement for any reason, we retry to establish communication at regular intervals. If we don't receive the response after several attempts, we gradually decrease the rate of retries. Based on this count, the service is disabled if it fails more than five times.
If you don't receive notifications from Cashfree as expected, please fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
### IPs to whitelist
When you decide to consume the webhooks, first, you need to verify whether your systems need IP whitelisting to be done at your end or not. Accordingly, you can whitelist the below IPs of Cashfree:
| UAT |
| :- |
| 52.66.25.127 |
| 15.206.45.168 |
| Prod |
| :- |
| 52.66.101.190 |
| 3.109.102.144 |
| 18.60.134.245 |
| 18.60.183.142 |
| Port |
| :- |
| 443 (secured) |
## FAQs
Yes, you can subscribe to **Webhooks V2** even if you're currently using **Payout APIs v1 and v1.2**.
Yes, you can typically subscribe to **Webhooks V1** even if you're using **Payout APIs V2**.
To configure your Payouts webhook URL in the sandbox (UAT) environment:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/auth/login).
2. Click the 9-dot (Apps) icon and select **Payouts**.
3. Click **Switch to Test** to move to the sandbox environment.
4. Go to **Developers > Webhooks**.
5. Add your webhook URL.
6. Click **Test & Add Webhook** to verify the configuration and save your changes.
After you configure the URL, retry the transfer to receive webhook events. See [Payouts webhooks](/docs/payouts/payouts/make-payouts/webhooks).
You need Admin access to add or configure webhooks. If you do not see the option to configure webhooks, log in with the email address associated with the Admin account, or ask your account Admin to complete the configuration.
No.
This is a validation event, not a real low-balance alert.
When you configure a Payouts webhook endpoint and select **Test & Add Webhook**, Cashfree sends a test `LOW_BALANCE_ALERT` payload to confirm the endpoint is reachable and returns HTTP 200. Cashfree sends real `LOW_BALANCE_ALERT` events only when your wallet balance falls below the configured threshold. Ensure your endpoint returns HTTP 200 to all incoming payloads, including test ones. See [Payouts webhooks](/docs/payouts/payouts/make-payouts/webhooks) for the full explanation.
# Payouts Webhooks
Source: https://www.cashfree.com/docs/api-reference/payouts/webhooks-overview
Consolidated index for Payouts webhook documentation, including V2 JSON webhooks, legacy V1 webhooks, Cashgram, dashboard setup, and signature rules.
Payouts can emit webhooks for transfer lifecycle updates, batch outcomes, beneficiary incidents, and balance signals. **Payouts Webhooks V2** uses JSON bodies and **header-based** HMAC verification. **Cashgram** and some legacy flows use different payload and verification rules. For shared webhook behaviour (retries, IP allow lists), see the [Cashfree webhooks overview](/docs/api-reference/webhooks/overview).
## API reference
Use the following pages for payload shapes, headers, and event names.
Transfer status notifications with payloads, header signatures, retries, and IP addresses.
Transfer status notifications and setup notes when using the V2 webhook configuration surface.
Cashgram redemption, reversal, and expiry event reference.
## Product guides
The same webhook events, covered from a dashboard and operational perspective.
Dashboard configuration steps and operational guidance for the Webhooks V1 (V2 dashboard) events above, described in product language.
Cashgram redemption, reversal, expiry events, and form-parameter signature verification.
For payout **status codes** returned in APIs and webhooks, see the [Payouts V2 response codes API](/docs/api-reference/payouts/v2/response-codes).
# Create Embeddable Onboarding Link (does not require login)
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/create-embeddable-onboarding-link-does-not-require-login
post /merchants/{merchant_id}/onboarding_link
Use this API to create a pre-built onboarding link for the sub-merchant account. Embed this link within your platform so that merchants can complete their KYC process. The link remains active for 1 hour only.
# Create Merchant
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/create-merchant
post /merchants
Use this API to create a sub-merchant account. You can provide basic merchant details during creation. KYC documents are required to activate the account.
# Create Standard Onboarding Link (with login required by merchant)
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/create-standard-onboarding-link-with-login-required-by-merchant
post /merchants/{merchant_id}/onboarding_link/standard
Use this API to create a pre-built onboarding link for the sub-merchant account. Share this link with the sub-merchant so they can complete their KYC process. The merchant needs to log in using their Cashfree password or OTP received on their registered email.
# Get Merchant Status
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/get-merchant-status
get /merchants/{merchant_id}
Use this API to get merchant onboarding details for the sub-merchant account.
# Getting Started
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/getting-started
Set up Cashfree Merchant Onboarding APIs for your platform with API keys, sandbox access, webhooks, and KYC document flows for sub-merchant lifecycles.
Embedded Payments by Cashfree is an end-to-end payment product for your platform to facilitate direct payments between your businesses and their customers. You can use Embedded Payments to provide your businesses a seamless onboarding experience and a fully compliant payments module within your platform.
Merchant Onboarding APIs is a feature of Embedded Payments through which you can onboard your merchants to your platform. Through the merchant onboarding APIs, you can perform various actions such as adding a merchant, updating the merchant's details, fetching the merchant's status, and creating onboarding links.
## View end points
| Environment | Base URL |
| :- | :- |
| Test | [https://api-sandbox.cashfree.com/partners](https://api-sandbox.cashfree.com/partners) |
| Production | [https://api.cashfree.com/partners](https://api.cashfree.com/partners) |
| Latest version | v3, 2023-01-01 |
The table below provides the list of Merchant Onboarding APIs along with their description.
**Merchant Onboarding APIs**
| API name | Description |
| :- | :- |
| [Create Merchant](/docs/api-reference/platforms/latest/merchant-onboarding/create-merchant) | Use this API to create a sub-merchant account. You can provide additional basic details. KYC documents are then required to activate the account. |
| [Update Merchant](/docs/api-reference/platforms/latest/merchant-onboarding/update-merchant) | Use this API to update a sub-merchant account. You can provide basic details only if the account is not yet active. |
| [Get Merchant Status](/docs/api-reference/platforms/latest/merchant-onboarding/get-merchant-status) | Use this API to get Merchant onboarding details for the sub-merchant account. |
| [Create Onboarding Link](/docs/api-reference/platforms/latest/merchant-onboarding/create-embeddable-onboarding-link-does-not-require-login) | Use this API to create a pre-built onboarding link for the sub-merchant account. Embed within your platform and Merchant can fill their KYC per compliance. |
**Get started in the test environment**
To get started with Merchant Onboarding API requests, you must follow the steps below:
1. Create an account on the Test Environment using this [signup link](https://test.cashfree.com/partner-ui/authentication/signup?product=embedded)
2. Once logged in, go to the **Developers** section and click **Generate API Key**. Copy and download the API keys for future reference. You can also add a webhook endpoint to use the merchant activation status webhook.
# Update Merchant
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/update-merchant
patch /merchants/{merchant_id}
Use this API to update a sub-merchant account. You can modify basic details only if the account is not yet active.
# Upload Documents
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/upload-documents
post /merchants/{merchant_id}/documents
Use this API to upload KYC documents for merchants.
The `document_type` parameter accepts the following values organised by document category:
### Business proof documents
| Document type | Description |
| - | - |
| `businessproof_saecertificate` | Certificate or licence issued by the appropriate authorities under Shops and Establishment Act and any other Acts as applicable to the firm |
| `businessproof_regproof` | Other government-issued registration proof |
| `businessproof_municipal` | Municipal certificate |
| `businessproof_udhyog` | Udyog Aadhaar |
| `businessproof_taxreturn` | Sales tax and income tax return |
| `businessproof_roc` | Registration certificate from ROC (Registrar of Company for a Jurisdiction) |
| `businessproof_taxreturnfull` | Full tax return |
| `businessproof_customeragreement` | Customer agreement |
| `businessproof_platformconfirm` | Platform confirmation |
| `businessproof_invoices` | Business invoices |
### Entity proof documents
| Document type | Description |
| - | - |
| `entityproof_partnershipdeed` | Partnership deed |
| `entityproof_trustdeed` | Trust deed |
| `entityproof_societycertificate` | Society certificate |
| `entityproof_hufdeed` | HUF deed |
| `entityproof_llp` | LLPIN document |
### Line of business proof documents
| Document type | Description |
| - | - |
| `lobproof_nonprofit` | Domestic: 80 G, 12 A or International: FCRA |
| `lobproof_travel` | IATA certificate or IRCTC agency certificate |
| `lobproof_pcidss` | AOC for PCI-DSS compliance |
| `lobproof_gaming` | RNG certificate (if applicable), legal opinion |
| `lobproof_food` | FSSAI |
| `lobproof_bbps` | BBPS certificate |
| `lobproof_jewellery` | BIS certificate, 916 Hallmark, 925 Hallmark, or GII certificate |
| `lobproof_nbfc` | NBFCs or Service Level Agreements with RBI approved NBFCs |
| `lobproof_papg` | PA-PG licence |
| `lobproof_pharmacy` | Pharmacy licence, retail or wholesale drug licence, undertaking of authorised signatory under Drugs and Cosmetics Act 1940, declaration (Form 20, Form 21, Form 21B, Form 20B) |
| `lobproof_ppi` | Bank PPI licence or Non Bank PPI licence |
| `lobproof_mutualfunds` | AMFI certificate |
| `lobproof_fema` | FEMA registration, FFMC certificate (FFMC state wise) |
| `lobproof_ayush` | Ayush (manufacturing licence - Form 24D) |
| `lobproof_sebi` | SEBI certificate |
| `lobproof_insurance` | IRDA: Life insurance, general insurance, health insurance or SLA with the insurer if this is being issued by a different party |
| `lobproof_education` | UGC certificate, ICSE, CBSE, or AICTE |
### Other documents
| Document type | Description |
| - | - |
| `bank_statement` | Bank statement |
| `certificate_of_incorporation` | Certificate of incorporation |
| `board_resolution` | Board resolution |
| `gst_certificate` | GST certificate |
| `localtax_identifier` | Local tax identifier |
| `bene_owner_id_proof_1` to `bene_owner_id_proof_6` | Beneficial owner ID proofs |
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/merchant-onboarding/webhooks
This is list of webhooks triggered from the Cashfree system. These webhooks allow partners to remain alert to state changes for their merchants.
## Configure webhook
To configure the webhook, go to [**Partner Dashboard**](https://partner.cashfree.com/auth/login) > **Developers** > **Webhooks**. Add your webhook endpoint where you want to receive alerts. Ensure you do not process duplicate events.
Webhook will be sent to your configured endpoint as a POST request with the body containing the various parameters specifying the details of each event. Each request contains an event parameter that identifies its type.
We support webhooks in both encoded and JSON formats.
The following are the webhook header parameters and their corresponding descriptions:
| Parameter | Description |
| - | - |
| x-cashfree-timestamp | Timestamp in ISO format. Time at which the webhook is triggered. |
| x-cashfree-signature | String. It is a base64 encoded entity of the hash (SHA256) of the raw payload sorted by alphabetical order of keys and the latest partner API key. This signature should be used to verify authenticity of the webhook. |
## Webhook event
The following is the webhook event type and its corresponding description:
| Event type | Description |
| :- | :- |
| `MERCHANT_ONBOARDING_STATUS` | Triggered when the merchant's onboarding status changes (e.g., email verified, KYC approved, account activated). |
### Sample webhook events
The following is an example of a webhook event that you may receive:
```Text MERCHANT_ONBOARDING_STATUS theme={"dark"} theme={"dark"}
{
"type":"MERCHANT_ONBOARDING_STATUS",
"event_time":"2006-01-02T15:04:05Z",
"data":{
"merchant_id": "CF89797",
"merchant_name": "Business A",
"created_at": "2021-06-23T23:15:20+05:30",
"onboarding_status": "ACTIVE"
}
}
```
## Webhook payload fields
The following are the webhook payload fields and their corresponding descriptions:
| Field | Type | Description |
| - | - | - |
| `type` | `string` | Indicates the type of event that triggered the webhook. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `data` | `object` | Contains event-specific details related to merchant onboarding. |
The following are the webhook parameters and their corresponding descriptions:
| Parameter | Description |
| :- | :- |
| data.merchant\_id | Unique merchant ID provided by the partner at the time of merchant creation. |
| data.merchant\_name | Name of the merchant. |
| data.created\_at | Timestamp in ISO format for when the merchant was created in CF system. |
| data.onboarding\_status | Onboarding status for the merchant. |
| event\_time | Timestamp in ISO format. Time when event was created. |
| type | Type of webhook. Value is "MERCHANT\_ONBOARDING\_STATUS". |
| version | Version of webhook. Default is 1. |
## Webhook signature
The following is a sample header from a webhook request containing the signature:
| Header name | Header value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
| Header name | Header value |
| - | :-: |
| x-cashfree-timestamp | 2021-04-16T14:10:36+05:30 |
| x-cashfree-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
Always capture the webhook payload in its raw text format before parsing into JSON. Parsing and re-serialising the payload can change the structure (for example, array ordering, spacing, or `null` handling) and cause a signature mismatch during verification. Use the exact raw body string from the request when computing the signature.
## Verify signature
Use the signature received in webhooks to verify if the request has not been tampered. This is generally a good security practice to avoid abuse via a fraudulent party.
To verify the signature at your end, you need your Cashfree Partner API Key along with the webhook object.
* The timestamp is present in the webhook object header `x-webhook-timestamp`.
* The actual signature generated by Cashfree is present in the webhook object header `x-webhook-signature`.
The signature creation logic is as below:
```php Signature theme={"dark"}
timestamp := 1617695238078;
signedPayload := $timestamp.$payload;
expectedSignature := Base64Encode(HMACSHA256($signedPayload, $partnerApiKey));
```
***
## Activation lifecycle
The following are the status stages included in the merchant onboarding process:
1. **Pending Email verification**: The merchant must first verify their registered Email address. An Email is sent automatically from Cashfree to the merchant Email ID you specified when you added the merchant details. If the merchant has not received the Email in their primary inbox, please ask them to check the spam folder. If the merchant still has not received the Email, you can use the resend Email option or contact the [support form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) for further assistance.
2. **Email verified**: This means that the merchant has verified their Email address and can now start their KYC verification process.
## KYC status
The following are the status stages involved in the merchant KYC process:
1. **Min KYC Pending**: Merchant must submit the required KYC details and documents.
2. **Min KYC Submitted**: Merchant has submitted their KYC details and documents and the documents are being reviewed by Cashfree.
3. **Min KYC Rejected**: Merchant KYC has discrepancies and corresponding KYC details and documents need to be provided.
4. **Min KYC Approved**: Merchant KYC has been approved and **Payment Gateway** product is activated.
If the merchants have verified their email you can fill out the KYC on behalf of the merchant and activate the account for your merchants.
# Partner Platform Webhooks
Source: https://www.cashfree.com/docs/api-reference/platforms/latest/webhooks-overview
Consolidated index for partner and platform APIs, including merchant onboarding webhooks and where to configure them in the Partner or platform flow.
Platform and partner integrations use webhooks to notify your systems about merchant onboarding and related asynchronous state changes. Payload and header conventions follow the specific API group you integrate with. For generic webhook operations (HTTPS, `200` acknowledgement, idempotency), see the [Cashfree webhooks overview](/docs/api-reference/webhooks/overview).
## References
Onboarding lifecycle events, sample payloads, and configuration notes for embedded and standard onboarding links are documented on the [merchant onboarding webhooks](/docs/api-reference/platforms/latest/merchant-onboarding/webhooks) page.
For product context outside the API reference, see [Add merchants](/docs/partners/embedded/add-merchants).
# Overview
Source: https://www.cashfree.com/docs/api-reference/platforms/overview
Use Cashfree Platform APIs to onboard merchants, manage their lifecycle, and process payments inside your marketplace or SaaS application end to end.
Cashfree’s Platform APIs enable platforms to integrate payment solutions seamlessly within their applications or marketplaces. These APIs allow you to onboard merchants, manage their lifecycle, and process payments efficiently, following standard web conventions.
You can use these APIs to integrate a seamless payment experience into your platform, manage merchant details, and ensure compliance throughout the process.
Use this API to create a pre-built onboarding link for the sub-merchant account. Requires merchant login via password or OTP for secure access.
## Getting started
Use the following resources to begin implementing Platform APIs:
Introduction to Partners and Platforms, partnership models, and key benefits
Base URLs, API keys, and steps to run your first Merchant Onboarding API request in test
# Postman Collections
Source: https://www.cashfree.com/docs/api-reference/postman-collections
Download Cashfree Postman collections for payments, payouts, and verification APIs to test endpoints with preconfigured requests and sample data.
Cashfree provides comprehensive Postman collections for all API products, making it easy to test and integrate APIs. Each collection includes pre-configured requests, sample data, and environment variables to get you started.
## Available collections
Complete collection for payment processing, orders, refunds, settlement, and subscription APIs.
Transfer funds and manage company finances through payout APIs.
Identity verification APIs for PAN, Aadhaar, and other document verification services.
Testing APIs in Postman
## Getting started
To import a Postman collection, choose your preferred method:
1. Click on any collection link above.
2. Click the **Fork** button in Postman.
3. Choose your workspace.
4. The collection will be available in your workspace with automatic updates.
1. Download the collection JSON file from the workspace.
2. Open Postman.
3. Click **Import** → **Upload Files**.
4. Select the downloaded JSON file.
To configure your environment variables:
1. Create a new environment in Postman.
2. Add the following variables:
* `base_url`: Set to `https://sandbox.cashfree.com` (sandbox) or `https://api.cashfree.com` (production)
* `client_id`: Your Cashfree Client ID
* `client_secret`: Your Cashfree Client Secret
* `x-api-version`: API version (for example, `2025-01-01`)
Never share your production credentials. Use sandbox credentials for testing and development.
The following examples show the environment variable configuration for both environments:
Sandbox:
```json theme={"dark"}
{
"base_url": "https://sandbox.cashfree.com",
"client_id": "your_sandbox_client_id",
"client_secret": "your_sandbox_client_secret",
"x-api-version": "2025-01-01"
}
```
Production:
```json theme={"dark"}
{
"base_url": "https://api.cashfree.com",
"client_id": "your_production_client_id",
"client_secret": "your_production_client_secret",
"x-api-version": "2025-01-01"
}
```
To test your first request:
1. Select your environment from the dropdown in the top-right corner.
2. Choose a simple request like "Get Order" or "Create Order."
3. Review the request parameters and body.
4. Click **Send** to execute the request.
## Features and best practices
Each Postman collection includes the following features:
* Pre-configured requests with correct HTTP methods and headers.
* Sample request bodies with placeholder data.
* Environment variables for dynamic URLs and authentication.
* Example data including test card numbers and mock account details.
* Test scripts for automatic response validation.
Collections automatically handle authentication using your credentials. Tokens are generated and refreshed as needed, so you don't need to manually manage authorisation headers.
Use environment variables for dynamic data, update placeholder values with real test data, and keep sensitive information in environment variables rather than in requests.
Review response status codes and error messages, check the **Tests** tab for automated validations, and use the **Console** view to debug request/response details.
## Troubleshooting common issues
The following are common Postman collection errors and solutions:
* Verify your `client_id` and `client_secret` are correct.
* Ensure you're using the right environment (sandbox vs production).
* Check that your credentials are active and not expired.
* Confirm the `x-api-version` header is set correctly.
* Use `2026-01-01` for the latest API version.
* Check the API documentation for supported versions.
* Ensure you've selected the correct environment.
* Verify all required variables are defined.
* Check for typos in variable names (case-sensitive).
* Review the API documentation for required fields.
* Check data types and formats in request body.
* Ensure all mandatory parameters are included.
## Support
If you need help with Postman collections or API integration, you can use the following resources:
* Documentation: Review the detailed [API documentation](/docs/api-reference/overview).
* Support form: Submit a ticket through the [support form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) for technical assistance.
* Support: Contact the [developer support team](mailto:developers@cashfree.com).
* Community: Join the [developer community](https://discord.gg/ed9VWDnrh7).
# Getting Started
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/getting-started
Get started with the Cashfree PPI APIs by reviewing endpoints, generating API keys, configuring webhooks, and contacting Cashfree for production access.
Follow these setup steps to get started with the PPI APIs:
* [View end points](/docs/api-reference/prepaid-payment-instruments/getting-started#view-end-points)
* [Generate API keys](/docs/api-reference/prepaid-payment-instruments/getting-started#generate-api-keys)
* [Contact us](/docs/api-reference/prepaid-payment-instruments/getting-started#contact-us)
## View end points
Cashfree uses API keys to authenticate and authorise access to the API. You must include your API keys in all API requests to the server.
| Environment | URL |
| :- | :- |
| Production | [https://api.cashfree.com/ppi](https://api.cashfree.com/ppi) |
| Test | [https://sandbox.cashfree.com/ppi](https://sandbox.cashfree.com/ppi) |
## Generate API keys
During onboarding, Cashfree provides merchants with the required API keys **Client ID** and **Client Secret** directly, typically via email. These credentials can be used immediately to authenticate and access the PPI API.
Do not share your API keys with anyone, as they are confidential.
## Contact us
Submit a request through the [raise an issue support form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1), completing the fields as specified below:
* **Subject**: Provide a clear one-line summary of the issue.
* **Product**: Select the relevant product under which the issue was raised or specify it as Other queries.
* **Description**: Provide a detailed description of the issue specifying the endpoint URL, HTTP method, and relevant request or response details.
* **Notify People**: You may add your account manager to be notified.
* **Attachment**: Upload any file for context to highlight the specific issue.
For dashboard issues, attach a screenshot and the HAR file.
# Get Video KYC Details
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/get-video-kyc-status
openapi/ppi/ppi.yaml post /ppi/kyc/vkyc/details
Retrieves the current status and other details of a Video KYC verification request, using the `user_id` and `verification_id` you supplied while initiating the request.
Refer to the [Status and Status Code reference](/docs/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-statuscode-mapping) page for a comprehensive list of status and status\_code combinations.
# Min KYC Verification
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/min-kyc-verification
openapi/ppi/ppi.yaml post /ppi/kyc/min
Completes the minimum KYC verification process by validating user documents and OTP verification.
This endpoint processes document information (PAN card details) along with the OTP verification ID
to complete the minimum KYC requirements for the user.
# Generate OTP
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/send-otp
openapi/ppi/ppi.yaml post /ppi/otp/generate
Sends an OTP (One-Time Password) to the user via the specified notification modes.
Supports multiple delivery channels including SMS and WhatsApp for secure user verification.
# Submit OTP
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/verify-otp
openapi/ppi/ppi.yaml post /ppi/otp/submit
Verifies the OTP (One-Time Password) sent to the user for verification.
This endpoint validates the OTP provided by the user against the OTP verification ID.
# Initiate Video KYC
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/video-kyc-verification
openapi/ppi/ppi.yaml post /ppi/kyc/vkyc
Initiates Video KYC for a user and generates a VKYC link.
This endpoint creates a VKYC verification request and sends the notification across
the requested channels.
Refer to the [Status and Status Code reference](/docs/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-statuscode-mapping) page for a comprehensive list of status and status\_code combinations.
# VKYC Status and Status-Code Mapping
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions
Reference for PPI Video KYC status and status-code combinations returned by VKYC APIs and webhooks, with recommended actions for each scenario.
This reference guide explains the status and status-code values returned by PPI Video KYC APIs and webhooks. Use this information to interpret responses and configure your verification flow.
## Status and status-code reference
The following table describes all possible status and status-code combinations returned by the VKYC API, along with recommended actions for each scenario.
### Verification phase statuses
Statuses are organised by verification phase. Each phase contains specific status codes that indicate the current state and required actions.
| Status code | Description | Recommended action |
| - | - | - |
| `LINK_GENERATED` | Cashfree generated the Video KYC link successfully. | Share the link with the user through your preferred channel |
| Status code | Description | Recommended action |
| - | - | - |
| `VKYC_EXPIRED` | The Video KYC link has expired. | Initiate a new Video KYC request for the user |
| Status code | Description | Recommended action |
| - | - | - |
| `AADHAAR_VERIFICATION_SUCCESS` | Aadhaar verification succeeded. | Proceed to the next verification step |
| `AADHAAR_VERIFICATION_FAILED` | Aadhaar verification failed. | Ask the user to retry with correct Aadhaar information |
| `AADHAAR_VERIFICATION_EXPIRED` | The Aadhaar verification session expired. | Restart the Aadhaar verification process |
| `USER_IP_VERIFICATION_SUCCESSFUL` | IP address verification succeeded. | Continue with the verification flow |
| `USER_PROXY_DETECTED` | Cashfree detected a proxy or VPN. | Ask the user to disable the proxy or VPN and retry |
| `TECHNICAL_FAILURE` | A technical issue occurred during verification. | Retry after some time or contact Cashfree support |
| `USER_LOCATION_VERIFICATION_SUCCESS` | Location verification succeeded. | Proceed to device checks |
| `USER_LOCATION_OUTSIDE_INDIA` | The user is outside India. | Reject the request or ask the user to retry from India |
| `USER_AUDIO_CHECK_FAILED` | Microphone access is not enabled. | Ask the user to enable microphone access |
| `USER_VIDEO_CHECK_FAILED` | Camera access is not enabled. | Ask the user to enable camera access |
| `USER_LOCATION_PERMISSION_DISABLED` | The user did not grant location access. | Ask the user to allow location permissions |
| `USER_DEVICE_CHECK_SUCCESS` | The device passed all checks. | Proceed to agent assignment |
| `USER_QUEUED` | The user is waiting for an available agent. | Display the queue position and estimated wait time |
| `SCHEDULED_USER_QUEUED` | The user is queued for a scheduled appointment. | Notify the user of the scheduled time |
| `NO_AGENT_FOUND` | No agent is available at this time. | Retry after some time or offer scheduling |
| `AGENT_ASSIGNED_TO_USER` | Cashfree assigned an agent to the user. | Notify the user that verification will begin |
| `USER_MEETING_SCHEDULED` | Cashfree scheduled the user meeting successfully. | Send the meeting details to the user |
| `USER_MEETING_CANCELLED` | The user meeting was cancelled. | Offer rescheduling options |
| Status code | Description | Recommended action |
| - | - | - |
| `USER_ACCEPTED_MEETING` | The user accepted the meeting invitation. | Start the VKYC verification process |
| `USER_REJECTED_MEETING` | The user rejected the meeting invitation. | Reschedule or mark verification as failed |
| `USER_MISSED_MEETING` | The user missed the scheduled meeting. | Offer rescheduling options |
| `USER_DROPPED_OFF` | The user disconnected during verification. | Log the issue and offer reconnection |
| `AGENT_DROPPED_OFF` | The agent disconnected during verification. | Retry with another agent |
| `USER_ENDED_CALL` | The user ended the call. | Review session completeness |
| `AGENT_ENDED_CALL` | The agent ended the call. | Review the agent remarks and next steps |
| Status code | Description | Recommended action |
| - | - | - |
| `TECHNICAL_ERROR` | A technical error occurred during verification. | Retry the verification or escalate to Cashfree support |
| Status code | Description | Recommended action |
| - | - | - |
| `AGENT_APPROVED` | The agent approved the KYC verification. | Proceed to the auditor review stage |
| `AGENT_REJECTED` | The agent rejected the KYC verification. | Notify the user with the rejection reason |
| `AGENT_UNABLE_TO_VALIDATE` | The agent could not complete validation. | Retry with another agent or initiate a new session |
| Status code | Description | Recommended action |
| - | - | - |
| `AUDITOR_APPROVED` | The auditor approved the KYC verification. | Mark verification as complete |
| `AUDITOR_REJECTED` | The auditor rejected the KYC verification. | Mark verification as failed |
# Video KYC Webhooks
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/kyc-verification/webhook-vkyc
Configure Video KYC webhooks to receive real-time notifications when VKYC verification status changes in your PPI integration.
Cashfree sends event-based notifications when specific Video KYC events occur. Use these notifications to track the status and progress of VKYC in real time.
Network retries, read timeouts, processing delays, or delivery failures can cause the same webhook to be delivered more than once for the same event. To prevent unintended side effects, implement idempotency in your webhook handler to handle duplicate deliveries.
## Webhook signature
You receive the webhook signature in the webhook header. The following table shows a sample header from a webhook request.
| Header name | Header value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
Always capture the webhook payload in its raw text format before parsing into JSON. Parsing and reserialising the payload can change the structure — for example, array ordering, spacing, or `null` handling — and cause a signature mismatch during verification. Use the exact raw body string from the request when computing the signature.
## VKYC webhook events
The following events are triggered at different stages of the Video KYC process.
| Event | Description |
| :- | :- |
| `VKYC_USER_LINK_GENERATED` | Cashfree generated the VKYC link for the user. |
| `VKYC_USER_LINK_EXPIRED` | The VKYC link expired. |
| `VKYC_USER_AADHAAR_VERIFIED` | Cashfree verified the Aadhaar details. |
| `VKYC_USER_CALL_SCHEDULED` | Cashfree scheduled the VKYC call for the user. |
| `VKYC_USER_PRECHECK_FAILED` | Pre-verification checks failed. |
| `VKYC_USER_CALL_QUEUED` | The user joined and is waiting in the queue for an agent. |
| `VKYC_USER_CALL_STARTED` | The VKYC call started with an agent. |
| `VKYC_USER_DROPOFF_FROM_CALL` | The user dropped off from the VKYC call. |
| `VKYC_USER_CALL_COMPLETED` | The VKYC call completed successfully. |
| `VKYC_AUDITOR_REVIEW_COMPLETED` | The auditor approved or rejected the VKYC packet. |
```json theme={"dark"}
{
"event_type": "VKYC_USER_LINK_GENERATED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "RECEIVED",
"status_code": "LINK_GENERATED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_LINK_EXPIRED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "EXPIRED",
"status_code": "VKYC_EXPIRED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2025-05-22",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_AADHAAR_VERIFIED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "PRE_VIDEO_CALL",
"status_code": "AADHAAR_VERIFICATION_SUCCESS",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_CALL_SCHEDULED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "PRE_VIDEO_CALL",
"status_code": "USER_MEETING_SCHEDULED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": "2025-05-23T14:30:00Z",
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_PRECHECK_FAILED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "PRE_VIDEO_CALL",
"status_code": "USER_VIDEO_CHECK_FAILED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_CALL_QUEUED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "PRE_VIDEO_CALL",
"status_code": "USER_QUEUED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_CALL_STARTED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "VIDEO_CALL",
"status_code": "USER_ACCEPTED_MEETING",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_DROPOFF_FROM_CALL",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "VIDEO_CALL",
"status_code": "USER_DROPPED_OFF",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": null
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_USER_CALL_COMPLETED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "POST_VIDEO_CALL",
"status_code": "AGENT_APPROVED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": null,
"agent_remarks": "Good to go"
}
}
```
```json theme={"dark"}
{
"event_type": "VKYC_AUDITOR_REVIEW_COMPLETED",
"event_time": "2025-05-22T03:51:14Z",
"data": {
"verification_id": "TestVkycVerification",
"cf_verification_id": "8901234567890123458",
"user_id": "USER827364",
"status": "AUDITOR_REVIEWED",
"status_code": "AUDITOR_APPROVED",
"link": "https://vkyc.cashfree.com/session/abc123",
"link_expiry": "2026-06-27",
"meeting_schedule": null,
"auditor_remarks": "Looks Good",
"agent_remarks": "Good to go"
}
}
```
## Webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `data` | `object` | Contains event-specific details related to this feature. |
### Data object fields
The following table describes the fields returned inside the `data` object.
| Field | Type | Description |
| - | - | - |
| `verification_id` | `string` | The unique ID for the VKYC verification request, as provided by you during initiation. |
| `cf_verification_id` | `string` | The unique ID for the VKYC verification request, generated by Cashfree. |
| `user_id` | `string` | The user ID provided when initiating Video KYC. |
| `status` | `string` | The current status of the VKYC request. |
| `status_code` | `string` | The sub-status providing additional detail about the current state. |
| `link` | `string` | The URL shared with the user to complete the VKYC process. |
| `link_expiry` | `string` | The date on which the VKYC link expires. |
| `meeting_schedule` | `string` or `null` | The scheduled UTC timestamp for the VKYC meeting. Returns `null` if no meeting is scheduled. |
| `auditor_remarks` | `string` or `null` | Remarks provided by the auditor after reviewing the VKYC session. Returns `null` if not yet reviewed. |
| `agent_remarks` | `string` or `null` | Remarks provided by the agent at the end of the VKYC call. Returns `null` if the call is not completed. |
## Important status information
For certain webhook events, specifically `VKYC_USER_PRECHECK_FAILED` and `VKYC_USER_CALL_SCHEDULED`, you may encounter more than one `status_code` value.
See the [Status and status-code reference](/docs/api-reference/prepaid-payment-instruments/kyc-verification/vkyc-status-descriptions#status-and-status-code-reference) page for a comprehensive list of status and status\_code combinations.
Verifying the signature is mandatory before processing any response. For more information, see [Signature verification](/docs/api-reference/prepaid-payment-instruments/webhook-signature-verification).
# Overview
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/overview
Integrate and manage PPI APIs for wallet creation, balance checks, and transaction management in digital payments.
Use the Prepaid Payment Instrument (PPI) APIs to create and manage digital wallets, sub-wallets, gift cards, and prepaid cards for your users. They enable secure fund transactions, ensure compliance with RBI guidelines, and support integration across multiple business use cases.
## Key features
The key features offered by Cashfree's PPI APIs are:
* **Create and manage users, wallets, and sub-wallets:** Onboard users and create wallets or sub-wallets with program-based configuration, and update them as needed.
* **Fund transfers:** Handle credits, debits, and refunds securely with duplicate-transaction protection.
* **RBI-compliant KYC and rules:** Enforce KYC verification, balance limits, and transaction rules in line with RBI guidelines.
* **Wallet balances:** Retrieve total and sub-wallet balances in real time.
## Program structure
A Program defines the wallet type and rules for your integration.
* **Definition:** A Program specifies the type of wallet or instrument you can offer.
* **Functions:** It lets you configure limits, validity, and usage rules.
* **Sub-programs:** A Program can include multiple categories, such as meal, reward, or gift wallets, to support different use cases.
For example, the main program may have an overall load limit of ₹50,000 per month. Within it, the Meal sub-wallet could allow only ₹2,000 per month and be restricted to food merchants.
Fetch statement details for a specific sub-wallet.
## Getting started
Use the following resources to begin implementing PPI APIs:
Base URLs, API keys, and steps to run your first PPI API request
Authenticate requests and keep credentials safe with Client ID and Client Secret
# Get Transfer Details
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/transfers/get-transfer-details
openapi/ppi/ppi.yaml post /ppi/wallet/transfer/details
Retrieves detailed information about a specific transfer transaction, including current status, beneficiary details.
This endpoint provides comprehensive transfer information including:
- Current transfer status and bank status
- Beneficiary and instrument details
- Transaction timestamps and reference numbers if transaction successfully completed
- Sub-wallet balance after the transfer
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPOVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree to reattempt with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode. |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC. |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary. |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in PPI Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating model |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your ppi account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your ppi account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your ppi account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your ppi account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked. |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account doesnot support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elpase so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting amount. |
| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting remarks. |
| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary id. |
| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting email. |
| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabet and numbers. | After correcting the iban, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting IBAN. |
| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode can contain in one of banktransfer upi paytm amazonpay imps neft rtgs ppc. | After correcting the transfermode, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting mode. |
| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting currency. |
| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The transfer has been rejected because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The transfer has failed because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as Cashfree risk product has detected an anamoly. | You can reinitiate the transfer request after validation at your end. | Yes, after validation. |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as Cashfree risk product has detected an anamoly. | You can approve/reject the transfer on the merchant dashboard. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | BAD\_CONNECTION | The transfer has failed because there was an intermittent internal error between Cashfree and the partner bank. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | BENE\_INVALID | The transfer has been rejected because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_INVALID | The transfer has failed because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_NOT\_REGISTERED | The transfer has been rejected because the beneficiary added in the transfer request is not registered with the partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | VALIDATION\_PENDING | BENE\_VERIFICATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | - | - |
| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | The transfer has failed because the respective beneficiary bank is offline. | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | The transfer has failed because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | CARD\_UNSUPPORTED | The transfer has been rejected because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | CARD\_UNSUPPORTED | The transfer has failed because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | DUPLICATE\_FAILED | The transfer has failed as the bank claims of receiving a duplicate request at their end as of now. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new id. |
| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | The transfer has failed because there was an intermittent issue at the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | INVALID\_CARD | The transfer has been rejected because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | FAILED | INVALID\_CARD | The transfer has failed because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_MODE\_FAIL | The transfer has failed because the requested transfer mode is not supported for this beneficiary account as per the partner bank. | After changing the transfer mode, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has been rejected because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has failed because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | The transfer has failed because the beneficiary's phone number is not linked to any VPA. | After adding the right phone beneficiary, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting phone. |
| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | The transfer has failed because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | The transfer has failed because the KYC verification has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after KYC resolution. |
| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | The transfer has failed because the KYC requirements have not been satisfied. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after completing KYC. |
| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | The transfer has failed because the beneficiaries account has reached maximum transaction amount limit. | After 24 hours, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after 24 hours. |
| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | The transfer has failed because of an intermittent issue at Cashfree's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | PENDING | LOW\_BALANCE\_QUEUED | The transfer is pending because the balance in the fund source is exhausted. This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. | This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. Please rely on check status API or webhook for checking the status of this transfer. | - |
| 200 | REJECTED | MANUALLY\_REJECTED | The transfer has been manually rejected by you. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. | Yes, if needed. |
| 200 | REJECTED | PPI\_INACTIVE | The transfer has been rejected because your ppi account has been inactive. | After getting the account activated, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after activation. |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. | Rely on Check Status API or Webhooks | - |
| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | The transfer has failed because there was a connection issue with the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | The transfer has been rejected because quick transfer is disabled for your ppi account. | After getting quick transfer enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after enabling. |
| 200 | REJECTED | REJECTED | Transfer rejected. | - | Yes, after correction. |
| 200 | REVERSED | REVERSED | The transfer has been reversed by the beneficiary bank as the credit to end-beneficiary's account has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correction. |
| 200 | FAILED | RTGS\_MODE\_FAIL | The transfer has failed because the beneficiary account doesnot support RTGS transfers. | You can try NEFT or other channels to do the disbursals. | Yes, via different mode. |
| 200 | FAILED | SUSPECTED\_FAILED | The transfer has failed, as the partner bank suspects that the transfer is of fraudulent nature. | - | No (investigate). |
| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | The transfer has been rejected because transfers to virtual bank accounts are not enabled for your Cashfree Account. | After getting payouts to virtual bank accounts enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree for enabling payouts to virtual bank accounts. | Yes, after enabling. |
| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | The transfer has been rejected because their is some issue with your account configuration. | You can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after fixing config. |
| 200 | VALIDATION\_PENDING | VALIDATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | Rely on Check Status API or Webhooks | - |
| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | The transfer has been rejected because the bene code is Invalid. | After correcting the beneficiary code, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting code. |
| 200 | REJECTED | DUPLICATE\_TRANSFER | The transfer is already present in the file or has been processed previously. Please change the transferId in the api request. | After changing the Transfer Id, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new transfer id. |
# Initiate Transfer
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/transfers/initiate-transfer
openapi/ppi/ppi.yaml post /ppi/wallet/transfer
Initiates a fund transfer from a user's FULL_KYC_PPI sub-wallet to a beneficiary account. Supports multiple transfer modes including RTGS, NEFT, IMPS, and UPI. It is an async request by default.
The beneficiary can be specified using either:
- Existing beneficiary ID and instrument ID
- New instrument details (bank account or UPI)
**Get Transfer Detail/Status**
Use the [Get Transfer Details](/docs/api-reference/prepaid-payment-instruments/transfers/get-transfer-details) API to get the details of the transfer request.
**OTP verification**
Call [Verify Transfer OTP](/docs/api-reference/prepaid-payment-instruments/transfers/verify-transfer) with the OTP before the transfer is sent for bank processing.
| HTTP status code | Status | Status code | Status description | Next action | Try again via Cashfree |
| :- | :- | :- | :- | :- | :- |
| 200 | APPROVAL\_PENDING | VELOCITY\_CHECK\_FAILED | The transfer requires an approval as the count of transfers to a particular beneficiary etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPROVAL\_PENDING | TRANSFER\_LIMIT\_BREACH | The transfer requires an approval as the transfer amount etc have breached the limit. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | APPOVAL\_PENDING | APPROVAL\_PENDING | The transfer requires approval. You can approve or reject the transfer request from the Cashfree [Merchant Dashboard](https://merchant.cashfree.com/auth/login). | You can approve/reject the transfer on the [Merchant Dashboard](https://merchant.cashfree.com/auth/login) and go to **Transfers > Approve**. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | WAIT\_TIME\_EXCEEDED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree to reattempt with the partner bank(s). | Yes |
| 200 | FAILED | BENE\_BANK\_DECLINED | The transfer has failed because the beneficiary bank has declined the transfer. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | Yes |
| 200 | FAILED | IMPS\_MODE\_FAIL | The transfer has failed because the beneficiary account does not support IMPS transfers. This rejection is done by the partner bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can try NEFT or other channels to do the disbursals. | Yes, via a different mode. |
| 200 | FAILED | SOURCE\_BANK\_DECLINED | The transfer has failed because our partner bank has declined the transfer because of their internal checks, technical declines etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with other partner bank(s). | Yes |
| 200 | FAILED | CONNECTION\_TIMEOUT | The transfer has failed because there was a connection timeout between the bank and Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | FAILED | NPCI\_UNAVAILABLE | The transfer has failed because NPCI was unavailable to complete the transfer request. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. The success of the request is contingent on NPCI services being up. | - | Yes, after some time. |
| 200 | FAILED | DEST\_LIMIT\_REACHED | The transfer has failed because the beneficiary account has breached the limit of receiving funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | - | Yes, after some time. |
| 200 | FAILED | RETURNED\_FROM\_BENEFICIARY | The transfer has failed because the beneficiary bank has returned the transfer and has not need able to credit funds to the end beneficiary. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | - | - |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INVALID\_BENE\_ACCOUNT\_OR\_IFSC | The transfer has failed because the beneficiary account or IFSC is invalid. After correcting the beneficiary account or IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | FAILED | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | PPI\_INTERNAL\_ERROR | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | INSUFFICIENT\_BALANCE | The transfer has failed because of low balance in your Cashfree Wallet/ Bank Account. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | FAILED | INVALID\_BENE\_VPA | The transfer has failed because the beneficiary VPA is invalid. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting VPA handle. |
| 200 | FAILED | INVALID\_IFSC\_FAIL | The transfer has failed because the IFSC is invalid. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting IFSC. |
| 200 | FAILED | BAD\_GATEWAY | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | INVALID\_AMOUNT\_FAIL | The transfer has failed because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting amount |
| 200 | FAILED | INVALID\_ACCOUNT\_FAIL | The transfer has failed because the Account Number of the beneficiary is invalid, as per our partner bank. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting account number |
| 200 | FAILED | INVALID\_REQUEST | The transfer has failed because the transfer request is invalid, as per our partner bank, because of exceeding the character limit of certain parameter, wrong input etc. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | - |
| 200 | FAILED | ACCOUNT\_BLOCKED | The transfer has failed because the account is blocked, as per our partner bank. After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after unblocking the account number |
| 200 | FAILED | DEBIT\_FAILURE | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BENEFICIARY\_BANK\_OFFLINE | The transfer has failed because the respective beneficiary bank is offline. After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | AUTHENTICATION\_FAILURE | The transfer has failed because there was an authentication failure at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | This is a scenario when the API access is not working at the partner bank's end. After checking with the partner bank, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | NRE\_ACCOUNT\_FAIL | The transfer has failed because the beneficiary account is an NRE Account and transfers to NRE Accounts are not supported, as per our partner bank. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | SOURCE\_LIMIT\_REACHED | The transfer has been failed by the partner bank as the source bank account has reached a limit of transferring funds. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | If you are on Cashfree Wallet, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). If you are on Connected Bank, you need to recharge your bank account and then reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time |
| 200 | FAILED | BANK\_GATEWAY\_ERROR | The transfer has failed because there was an intermittent issue at the partner bank's end. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | BAD\_REQUEST | The transfer has failed because the details of the transfer request is invalid, as per our partner bank. After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the details in the transfer request, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | FAILED | REINITIALIZE\_TRANSFER\_LATER | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | MANUALLY\_REJECTED | MANUALLY\_REJECTED | The transfer has failed because it has been manually rejected by the merchant or any team member user who has the permissions to do the same on [Merchant Dashboard](https://merchant.cashfree.com/auth/login). You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | If the merchant wants to reinitiate the transfer, they can reinitiate the transfer via Cashfree so that the transfer can be reattempted again with the partner bank(s). | Yes, if you want to reinitiate the transfer |
| 200 | PENDING | SENT\_TO\_BANK | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. This has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | BANK\_GATEWAY\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or Webhooks. | - |
| 200 | PENDING | NO\_SUCH\_REQUEST | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now, and it has been sent to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | IN\_PROCESS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | ERROR\_FETCHING\_STATUS | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | TRANSACTION\_PROCESSED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | REQUEST\_TIMEDOUT | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank is not able to find the request at their end as of now as the request between the partner bank has probably timed out, and it has been highlighted to the bank by our banking operations team. Please do check statuses or await webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | DUPLICATE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The bank claims of receiving a duplicate request at their end as of now. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | PENDING | SCHEDULED\_FOR\_NEXT\_WORKINGDAY | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | SUSPECT | The transfer is currently in a Pending state, as the bank has scheduled the transfer for the next working day. This typically happens for NEFT/RTGS transfers if they are initiated beyond the cut-off hours or during bank holidays. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | IMPLEMENTATION\_ERROR | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | - | - |
| 200 | PENDING | UNKNOWN\_ERROR\_CODE | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. The response received from the partner bank has a new code. This has been raised with the bank to understand the new code. Please do check statuses or await webhooks to know the terminal state of the transfer request. | - | - |
| 200 | QUEUED | QUEUED | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. You should rely only on Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | RECEIVED | RECEIVED | The transfer has been received by Cashfree successfully for further processing. You should use Check Status API response or Webhooks to know the terminal state of the transfer request. | Rely on Check Status API or webhooks. | - |
| 200 | REJECTED | BENE\_NOT\_EXIST | The transfer has been rejected because the beneficiary, added in the transfer request, does not exist. After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding the correct beneficiary. |
| 200 | REJECTED | INSUFFICIENT\_BALANCE | The transfer has been rejected because of low balance in your Cashfree Wallet. After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After recharging the account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after recharging. |
| 200 | REJECTED | INSIDE\_BLACKOUT\_WINDOW | The transfer has been rejected because the transfer falls under the blackout window defined by you in PPI Protect. You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree, after the blackout window or after modifying the blackout window from the [Merchant Dashboard](https://merchant.cashfree.com/auth/login), so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_MODE\_FOR\_PYID | The transfer has been rejected because the payment instrument does not support this mode of transfer. You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on the payment instrument ID by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating model |
| 200 | REJECTED | BENE\_BLACKLISTED | The transfer has been rejected because the beneficiary's bank account and/or VPA handles have been blacklisted by Risk team. You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | You should get a different bank account and/or VPA to send the transfer, or you can connect with Cashfree Team to understand more about this. | Yes, after correcting beneficiary details |
| 200 | REJECTED | TRANSFER\_NOT\_ATTEMPTED | The transfer has failed because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | INVALID\_TRANSFER\_AMOUNT | The transfer has been rejected because the amount entered is invalid. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the amount |
| 200 | REJECTED | TRANSFER\_LIMIT\_BREACH | The transfer has been rejected because the amount entered breaches the limits set for your ppi account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | INVALID\_PAYMENT\_INSTRUMENT | The transfer has been rejected because the payment instrument (fundsource\_id parameter in the API request) used for attempting the transfer is invalid. After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the payment instrument, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting payment instrument |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | VELOCITY\_CHECK\_FAILED | The transfer has been rejected because the amount entered breaches the limits set for your ppi account. After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree if you are not sure about the transfer limits set for your ppi account. | Yes, after adhering to the transfer limits. |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | PPI\_INTERNAL\_ERROR | The transfer has been rejected because there was an intermittent internal error at Cashfree. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REJECTED | DISABLED\_MODE | The transfer has been rejected because your ppi account does not support this mode of transfer. You should get this mode activated on your payout account by contacting Cashfree, and then initiate a new transfer request. | You should get this mode activated on your ppi account by contacting Cashfree, and then initiate a new transfer request. | Yes, after activating mode. |
| 200 | REJECTED | BANK\_ACCOUNT\_INVALID | The transfer has been rejected because there is a mismatch in the Bank Account Number of the beneficiary ID and the Bank Account Number in the transfer request. After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Bank Account Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the bank account number. |
| 200 | REJECTED | BANK\_IFSC\_INVALID | The transfer has been rejected because there is a mismatch in the IFSC of the beneficiary ID and the IFSC in the transfer request. After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the IFSC, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the IFSC |
| 200 | REJECTED | VPA\_INVALID | The transfer has been rejected because there is a mismatch in the VPA handle of the beneficiary ID and the VPA handle in the transfer request. After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the VPA handle, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the VPA handle |
| 200 | REJECTED | PHONE\_INVALID | The transfer has been rejected because there is a mismatch in the Phone Number of the beneficiary ID and the Phone Number in the transfer request. After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After correcting the Phone Number, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting the phone number. |
| 200 | REJECTED | BANK\_ACCOUNT\_DETAILS\_MISSING | The transfer has been rejected because the Bank Account Details are missing in the transfer request. After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | After adding the Bank Account Details, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after adding the bank account details. |
| 200 | REVERSED | ACCOUNT\_BLOCKED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account is blocked for receiving incoming funds. After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number or getting the account unblocked, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding new details or getting account unblocked. |
| 200 | REVERSED | FAILED | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | - | Yes |
| 200 | REVERSED | NRE\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account as it is an NRE Account and transfers to NRE Accounts are not supported. | Get a new account(non-NRE account) from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | No |
| 200 | REVERSED | RETURNED\_FROM\_BENEFICIARY | The transfer has been reversed by the beneficiary bank as they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | BENE\_BANK\_DECLINED | The transfer has been declined by the beneficiary bank and they were unable to credit the end beneficiary's bank account. You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes |
| 200 | REVERSED | IMPS\_MODE\_FAIL | The transfer has been reversed by the beneficiary bank because the beneficiary bank account does not support IMPS transfers. This rejection is done by the beneficiary bank for the specific beneficiary account. You can try NEFT or other channels to do the disbursals. | You can reinitiate the transfer via Cashfree by changing the mode so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REVERSED | DEST\_LIMIT\_REACHED | The transfer has been reversed by the beneficiary bank as the end-beneficiary's account has reached a limit of receiving incoming funds. This rejection is done by the beneficiary bank for the specific beneficiary account. You can reinitiate the transfer after a while via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). The success of the request is contingent on beneficiary's limit being available to receive incoming funds. | The limits on the beneficiary account are typically refreshed every 24 hours. Its not clear when the 24 hour window shall elapse so you can then reinitiate the transfer via Cashfree after some time so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REVERSED | INVALID\_ACCOUNT\_FAIL | The transfer has been reversed by the beneficiary bank because the Account Number of the beneficiary is invalid. After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting the account number |
| 200 | SUCCESS | SENT\_TO\_BENEFICIARY | The transfer has been initiated via the partner bank successfully. The request is waiting to be processed at the beneficiary bank to do the credit to the end beneficiary. | - | - |
| 200 | SUCCESS | COMPLETED | The transfer has been initiated via the partner bank successfully, hence your account is debited and the request is successfully processed by the beneficiary bank and has been credited to the end beneficiary. | - | - |
| 200 | REJECTED | TRANSFERID\_INVALID | transferid can contain only alphabets, numbers, underscore (\_), hyphen (-). | After correcting the transferid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting transfer id. |
| 200 | REJECTED | AMOUNT\_INVALID | amount can contain only numbers. | After correcting the amount, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting amount. |
| 200 | REJECTED | REMARKS\_INVALID | remarks can contain only alphabets, numbers and space. | After correcting the remarks, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting remarks. |
| 200 | REJECTED | BENEID\_INVALID | beneId can contain only alphabets, numbers and underscore. | After correcting the beneid, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting beneficiary id. |
| 200 | REJECTED | NAME\_INVALID | name can contain only alphabets, numbers and space. | After correcting the name, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | EMAIL\_INVALID | email is not a valid email format. | After correcting the email, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting email. |
| 200 | REJECTED | IBAN\_INVALID | iban can contain only alphabet and numbers. | After correcting the iban, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting IBAN. |
| 200 | REJECTED | TRANSFERMODE\_INVALID | transferMode can contain in one of banktransfer upi paytm amazonpay imps neft rtgs ppc. | After correcting the transfermode, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting mode. |
| 200 | REJECTED | CURRENCY\_INVALID | currency is invalid. | After correcting the currency, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting currency. |
| 200 | REJECTED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has been rejected because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | FAILED | ACCOUNT\_DOES\_NOT\_EXIST | The transfer has failed because the beneficiary account/ VPA does not exist as per our partner bank. | After correcting the account number, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting details. |
| 200 | REJECTED | AMAZON\_AMOUNT\_EXCEED | The transfer has been rejected because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | FAILED | AMAZON\_AMOUNT\_EXCEED | The transfer has failed because the amount entered breaches the limits set for the beneficiaries amazon account. | After verifying the limits for beneficiaries amazon account, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after verifying limits. |
| 200 | REJECTED | ANOMALY\_DETECTION | The transfer has been rejected as Cashfree risk product has detected an anomaly. | You can reinitiate the transfer request after validation at your end. | Yes, after validation. |
| 200 | APPROVAL\_PENDING | ANOMALY\_DETECTION | The transfer requires approval as Cashfree risk product has detected an anomaly. | You can approve/reject the transfer on the merchant dashboard. Post the transfer is approved, the request is sent to the partner bank for further processing. | - |
| 200 | FAILED | BAD\_CONNECTION | The transfer has failed because there was an intermittent internal error between Cashfree and the partner bank. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | BENE\_INVALID | The transfer has been rejected because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_INVALID | The transfer has failed because the beneficiary added in the transfer request does not exist. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | FAILED | BENE\_NOT\_REGISTERED | The transfer has been rejected because the beneficiary added in the transfer request is not registered with the partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after adding beneficiary. |
| 200 | VALIDATION\_PENDING | BENE\_VERIFICATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | - | - |
| 200 | FAILED | BENEFICIARY\_BANK\_UNAVAILABLE | The transfer has failed because the respective beneficiary bank is offline. | After some time, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | FAILED | BENEFICIARY\_NAME\_DIFFERS | The transfer has failed because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_DIFFERS | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | BENEFICIARY\_NAME\_MISMATCH | The transfer has been rejected because the beneficiary name differs as per Cashfree's partner bank. | After adding the right beneficiary, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting name. |
| 200 | REJECTED | CARD\_UNSUPPORTED | The transfer has been rejected because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | CARD\_UNSUPPORTED | The transfer has failed because the card is not supported. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing instrument. |
| 200 | FAILED | DUPLICATE\_FAILED | The transfer has failed as the bank claims of receiving a duplicate request at their end as of now. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new id. |
| 200 | FAILED | ERROR\_RETRIEVING\_BALANCE | The transfer has failed because there was an intermittent issue at the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | INVALID\_CARD | The transfer has been rejected because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | FAILED | INVALID\_CARD | The transfer has failed because the card details are not correct. | After changing the payment instrument details, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting card. |
| 200 | REJECTED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_CURRENCY\_FOR\_PYID | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_MODE\_FAIL | The transfer has failed because the requested transfer mode is not supported for this beneficiary account as per the partner bank. | After changing the transfer mode, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing mode. |
| 200 | REJECTED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has been rejected because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_OR\_NO\_SUCH\_ACCOUNT\_TYPE | The transfer has failed because the beneficiary account type is invalid or not supported as per our partner bank. | Get a new account from the beneficiary; you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after new account. |
| 200 | FAILED | INVALID\_PHONE\_BENEFICIARY | The transfer has failed because the beneficiary's phone number is not linked to any VPA. | After adding the right phone beneficiary, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correcting phone. |
| 200 | REJECTED | INVALID\_TRANSFER\_CURRENCY | The transfer has been rejected because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | FAILED | INVALID\_TRANSFER\_CURRENCY | The transfer has failed because the transfer currency passed in the transfer request is not supported by Cashfree. | After changing the currency to INR, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after changing currency. |
| 200 | REJECTED | KYC\_COMPLIANCE\_VERIFICATION\_FAILED | The transfer has failed because the KYC verification has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after KYC resolution. |
| 200 | REJECTED | KYC\_REQUIREMENTS\_NOT\_SATISFIED | The transfer has failed because the KYC requirements have not been satisfied. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after completing KYC. |
| 200 | FAILED | LOAD\_LIMIT\_EXHAUSTED | The transfer has failed because the beneficiaries account has reached maximum transaction amount limit. | After 24 hours, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after 24 hours. |
| 200 | FAILED | LOAN\_FUND\_MOVEMENT\_FAILURE | The transfer has failed because of an intermittent issue at Cashfree's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | PENDING | LOW\_BALANCE\_QUEUED | The transfer is pending because the balance in the fund source is exhausted. This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. | This transfer will be processed after you recharge the fund source, you need not reinitiate this transfer. Please rely on check status API or webhook for checking the status of this transfer. | - |
| 200 | REJECTED | MANUALLY\_REJECTED | The transfer has been manually rejected by you. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree. | Yes, if needed. |
| 200 | REJECTED | PPI\_INACTIVE | The transfer has been rejected because your ppi account has been inactive. | After getting the account activated, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after activation. |
| 200 | PENDING | PENDING | The transfer is currently in a Pending state, as Cashfree is awaiting a final confirmation from the partner bank for a terminal status. | Rely on Check Status API or Webhooks | - |
| 200 | FAILED | POOL\_CONNECTION\_TIMEOUT | The transfer has failed because there was a connection issue with the partner bank's end. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after some time. |
| 200 | REJECTED | QUICK\_TRANSFER\_DISABLED | The transfer has been rejected because quick transfer is disabled for your ppi account. | After getting quick transfer enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after enabling. |
| 200 | REJECTED | REJECTED | Transfer rejected. | - | Yes, after correction. |
| 200 | REVERSED | REVERSED | The transfer has been reversed by the beneficiary bank as the credit to end-beneficiary's account has failed. | You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, after correction. |
| 200 | FAILED | RTGS\_MODE\_FAIL | The transfer has failed because the beneficiary account does not support RTGS transfers. | You can try NEFT or other channels to do the disbursals. | Yes, via different mode. |
| 200 | FAILED | SUSPECTED\_FAILED | The transfer has failed, as the partner bank suspects that the transfer is of fraudulent nature. | - | No (investigate). |
| 200 | REJECTED | VBA\_TRANSFER\_DISABLED | The transfer has been rejected because transfers to virtual bank accounts are not enabled for your Cashfree Account. | After getting payouts to virtual bank accounts enabled, you can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). You can connect with Cashfree for enabling payouts to virtual bank accounts. | Yes, after enabling. |
| 200 | REJECTED | ERROR\_SELECTING\_FUND\_SOURCE | The transfer has been rejected because their is some issue with your account configuration. | You can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after fixing config. |
| 200 | VALIDATION\_PENDING | VALIDATION\_PENDING | The transfer is pending because the beneficiary verification is pending. Once the beneficiary is validated we will attempt the transfers with partner bank(s). | Rely on Check Status API or Webhooks | - |
| 200 | REJECTED | INVALID\_BENEFICIARY\_CODE | The transfer has been rejected because the bene code is Invalid. | After correcting the beneficiary code, you can reinitiate the transfer via Cashfree so that the transfer can be attempted by Cashfree with the partner bank(s). | Yes, after correcting code. |
| 200 | REJECTED | DUPLICATE\_TRANSFER | The transfer is already present in the file or has been processed previously. Please change the transferId in the api request. | After changing the Transfer Id, You can reinitiate the transfer via Cashfree so that the transfer can be reattempted again by Cashfree with the partner bank(s). | Yes, with new transfer id. |
#### 4XX errors
| HTTP status code | Error code | Message | Next action |
| :- | :- | :- | :- |
| 400 | transfer\_id\_missing | transfer\_id parameter missing in the request | Enter a valid transfer\_id in the request. |
| 400 | transfer\_id\_invalid | transfer\_id value invalid | Enter a valid transfer\_id in the request. |
| 400 | user\_id\_missing | user\_id parameter is missing | Provide a valid user\_id in the request. |
| 400 | user\_id\_value\_invalid | user\_id invalid value | Enter a valid user\_id in the request. |
| 400 | wallet\_id\_missing | wallet\_id parameter is missing | Provide a valid wallet\_id in the request. |
| 400 | wallet\_id\_value\_invalid | wallet\_id invalid value | Enter a valid wallet\_id in the request. |
| 400 | cf\_sub\_wallet\_id\_missing | cf\_sub\_wallet\_id parameter is missing | Provide a valid cf\_sub\_wallet\_id in the request. |
| 400 | cf\_sub\_wallet\_id\_value\_invalid | cf\_sub\_wallet\_id invalid value | Enter a valid cf\_sub\_wallet\_id in the request. |
| 400 | amount\_missing | amount parameter is missing | Provide a value for the amount parameter in the request. |
| 400 | amount\_value\_invalid | amount invalid value | Enter an amount up to 2 decimal place and greater than 1.00. |
| 400 | transfer\_mode\_missing | transfer\_mode parameter is missing | Provide a valid transfer\_mode in the request. |
| 400 | transfer\_mode\_invalid | transfer\_mode is invalid allowed values are : bank, imps, neft, rtgs, upi | Provide a valid transfer\_mode in the request. |
| 400 | bene\_details\_missing | bene\_details parameter is missing | Provide beneficiary details in the request. |
| 400 | bene\_details.bene\_id\_invalid | beneficiary\_id should be alphanumeric | Enter a valid beneficiary\_id. |
| 400 | bene\_details.instrument\_details.bank\_account\_number\_invalid | bank\_account\_number should be alphanumeric | Enter a valid bank\_account\_number. |
| 400 | bene\_details.instrument\_details.bank\_account\_number\_invalid | Bank account number passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_account\_number associated with the beneficiary\_id. |
| 400 | bene\_details.instrument\_details.bank\_ifsc\_invalid | bank\_ifsc should be in standard ifsc format | Enter a valid bank\_ifsc. |
| 400 | bene\_details.instrument\_details.bank\_ifsc\_invalid | Bank ifsc passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct bank\_ifsc associated with the beneficiary\_id. |
| 400 | bene\_details.instrument\_details.full\_name\_invalid | full name value invalid | Enter a valid full name for the beneficiary. |
| 400 | bene\_details.instrument\_details.vpa\_invalid | vpa is in invalid format | Enter a valid VPA. |
| 400 | bene\_details.instrument\_details.vpa\_invalid | Vpa passed in the request does not match with the beneficiary with beneficiary\_id :: test\_beneId | Enter the correct vpa associated with the beneficiary\_id. |
| 404 | user\_id\_not\_found | The specified user\_id does not exist | Enter a valid user\_id. |
| 404 | wallet\_not\_found | No ACTIVE wallet found with the provided wallet\_id | Enter a valid wallet\_id. |
| 404 | sub\_wallet\_not\_found | No ACTIVE sub-wallet found with the provided cf\_sub\_wallet\_id | Enter a valid cf\_sub\_wallet\_id. |
| 409 | duplicate\_transfer\_id | A transfer with the provided transfer\_id already exists | Use a unique transfer\_id for the request. |
| 422 | transfer\_limit\_exceeded | Transfer amount exceeds the daily/monthly limit | Reduce the transfer amount or wait for limit reset. |
| 422 | full\_kyc\_required | FULL KYC verification is required for fund transfer | Complete FULL KYC verification before attempting the transfer. |
# Verify Transfer
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/transfers/verify-transfer
openapi/ppi/ppi.yaml post /ppi/wallet/transfer/verify
Submits the OTP for a wallet transfer that was initiated with mode `OTP_VERIFICATION`.
Use **Get Transfer Details** or webhooks for terminal status.
Call this API after [Initiate Transfer](/docs/api-reference/prepaid-payment-instruments/transfers/initiate-transfer). Use [Get Transfer Details](/docs/api-reference/prepaid-payment-instruments/transfers/get-transfer-details) to proceed with bank processing after OTP succeeds.
You can submit an OTP for verification **at most three times** per transfer.
# Transfer Webhook Events
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/transfers/webhook-transfer
Configure Transfer webhooks to receive event-based notifications whenever a wallet transfer changes status in your PPI integration.
Webhooks are event-based notifications that you receive when a specific event related to a wallet transfer occurs.
In rare cases, such as network retries, read timeouts, processing delays, or delivery failures, Cashfree may send the same webhook more than once for the same event. To prevent unintended side effects, implement idempotency (ensuring a duplicate webhook produces the same result as processing it once) in your webhook handler to handle duplicate deliveries.
## Webhook signature
Cashfree includes the webhook signature in the request header. The following is a sample header from a webhook request.
| Header name | Header value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
Always capture the webhook payload in its raw text format before parsing into JSON. Parsing and re-serialising the payload can change the structure (for example, array ordering, spacing, or `null` handling) and cause a signature mismatch during verification. Use the exact raw body string from the request when computing the signature.
Verifying the signature is mandatory before processing any webhook. Refer to [Signature Verification](/docs/api-reference/prepaid-payment-instruments/webhook-signature-verification) for more details.
## Transfer webhook events
Cashfree triggers the following events at different stages of a wallet transfer:
| Event | Description |
| :- | :- |
| PPI\_TRANSFER\_SUCCESS | The transfer is successfully credited to the beneficiary's account. |
| PPI\_TRANSFER\_FAILED | The transfer cannot be processed due to an error or rejection by the bank. |
| PPI\_TRANSFER\_REVERSED | The beneficiary bank returns the transfer after initial processing. |
| PPI\_TRANSFER\_REJECTED | Cashfree rejects the transfer before it reaches the bank due to a validation failure. |
The following examples show the webhook payload for each event type.
```json theme={"dark"}
{
"event_type": "PPI_TRANSFER_SUCCESS",
"event_time": "2026-05-18T10:00:45Z",
"data": {
"user_id": "usr_001",
"wallet_id": "wlt_001",
"cf_transfer_id": "1003",
"transfer_id": "txn_ext_003",
"amount": 500.00,
"transfer_mode": "IMPS",
"actual_mode": "IMPS",
"sub_wallet": {
"cf_sub_wallet_id": "swlt_001",
"name": "Primary Wallet",
"type": "PRIMARY",
"status": "ACTIVE",
"balance": 4500.00,
"available_balance": 4500.00,
"funds_on_hold": 0.00
},
"status": "SUCCESS",
"status_code": "ACKNOWLEDGED_VIA_BENE_BANK",
"bank_reference_number": "BNKREF789012",
"bene_details": {
"bene_id": "bene_001",
"bene_instrument_id": "instr_001"
},
"purpose": "salary",
"remarks": "Monthly salary",
"initiated_at": "2026-05-18T10:00:00Z",
"processed_at": "2026-05-18T10:00:45Z",
"notes": null
}
}
```
```json theme={"dark"}
{
"event_type": "PPI_TRANSFER_FAILED",
"event_time": "2026-05-18T10:00:01Z",
"data": {
"user_id": "usr_001",
"wallet_id": "wlt_001",
"cf_transfer_id": "1004",
"transfer_id": "txn_ext_004",
"amount": 500.00,
"transfer_mode": "IMPS",
"actual_mode": null,
"sub_wallet": {
"cf_sub_wallet_id": "swlt_001",
"name": "Primary Wallet",
"type": "PRIMARY",
"status": "ACTIVE",
"balance": 5000.00,
"available_balance": 5000.00,
"funds_on_hold": 0.00
},
"status": "FAILED",
"status_code": "INSUFFICIENT_BALANCE",
"bank_reference_number": null,
"bene_details": {
"bene_id": "bene_001",
"bene_instrument_id": "instr_001"
},
"purpose": "salary",
"remarks": "Monthly salary",
"initiated_at": "2026-05-18T10:00:00Z",
"processed_at": "2026-05-18T10:00:01Z",
"notes": null
}
}
```
```json theme={"dark"}
{
"event_type": "PPI_TRANSFER_REVERSED",
"event_time": "2026-05-18T10:05:00Z",
"data": {
"user_id": "usr_001",
"wallet_id": "wlt_001",
"cf_transfer_id": "1005",
"transfer_id": "txn_ext_005",
"amount": 500.00,
"transfer_mode": "IMPS",
"actual_mode": "IMPS",
"sub_wallet": {
"cf_sub_wallet_id": "swlt_001",
"name": "Primary Wallet",
"type": "PRIMARY",
"status": "ACTIVE",
"balance": 5000.00,
"available_balance": 5000.00,
"funds_on_hold": 0.00
},
"status": "REVERSED",
"status_code": "RETURNED_FROM_BENE",
"bank_reference_number": "BNKREF_REV001",
"bene_details": {
"bene_id": "bene_001",
"bene_instrument_id": "instr_001"
},
"purpose": "salary",
"remarks": "Monthly salary",
"initiated_at": "2026-05-18T10:00:00Z",
"processed_at": "2026-05-18T10:05:00Z",
"notes": null
}
}
```
```json theme={"dark"}
{
"event_type": "PPI_TRANSFER_REJECTED",
"event_time": "2026-05-18T10:00:01Z",
"data": {
"user_id": "usr_001",
"wallet_id": "wlt_001",
"cf_transfer_id": "1006",
"transfer_id": "txn_ext_006",
"amount": 500.00,
"transfer_mode": "IMPS",
"actual_mode": null,
"sub_wallet": {
"cf_sub_wallet_id": "swlt_001",
"name": "Primary Wallet",
"type": "PRIMARY",
"status": "ACTIVE",
"balance": 5000.00,
"available_balance": 5000.00,
"funds_on_hold": 0.00
},
"status": "REJECTED",
"status_code": "BENE_BLACKLISTED",
"bank_reference_number": null,
"bene_details": {
"bene_id": "bene_001",
"bene_instrument_id": "instr_001"
},
"purpose": "salary",
"remarks": "Monthly salary",
"initiated_at": "2026-05-18T10:00:00Z",
"processed_at": "2026-05-18T10:00:01Z",
"notes": null
}
}
```
## Transfer webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Type of transfer event: `PPI_TRANSFER_SUCCESS`, `PPI_TRANSFER_FAILED`, `PPI_TRANSFER_REVERSED`, or `PPI_TRANSFER_REJECTED` |
| `event_time` | `string` | The UTC timestamp when the event occurred, in ISO 8601 format |
| `data` | `object` | Transfer-specific event details |
## Transfer data fields
Transfer webhook events contain the following fields inside `data`:
| Field | Type | Description |
| - | - | - |
| `user_id` | `string` | Identifier of the user who initiated the transfer |
| `wallet_id` | `string` | Identifier of the wallet from which the transfer was made |
| `transfer_id` | `string` | Your unique identifier for the transfer transaction |
| `cf_transfer_id` | `string` | Cashfree's unique identifier for the transfer transaction |
| `amount` | `number` | Transfer amount in INR |
| `transfer_mode` | `string` | Transfer mode requested: `RTGS`, `NEFT`, `IMPS`, or `UPI` |
| `actual_mode` | `string` | Transfer mode actually used to process the transaction. Set only when the transfer reaches the bank (`SUCCESS` or `REVERSED`); `null` otherwise |
| `sub_wallet` | `object` | Details of the sub-wallet from which funds were transferred |
| `sub_wallet.cf_sub_wallet_id` | `string` | Cashfree's unique identifier for the sub-wallet |
| `sub_wallet.name` | `string` | Name of the sub-wallet |
| `sub_wallet.type` | `string` | Type of the sub-wallet (for example, `PRIMARY`, `FULL_KYC_PPI`, `GIFT_PPI`) |
| `sub_wallet.status` | `string` | Current status of the sub-wallet (for example, `ACTIVE`, `SUSPENDED`) |
| `sub_wallet.balance` | `number` | Total balance in the sub-wallet in INR |
| `sub_wallet.available_balance` | `number` | Balance available for new transfers after accounting for funds on hold, in INR |
| `sub_wallet.funds_on_hold` | `number` | Amount reserved for in-flight transfers not yet settled, in INR |
| `status` | `string` | Current status of the transfer: `SUCCESS`, `FAILED`, `REVERSED`, or `REJECTED` |
| `status_code` | `string` | Granular status code for the transfer (for example, `ACKNOWLEDGED_VIA_BENE_BANK`, `INSUFFICIENT_BALANCE`, `RETURNED_FROM_BENE`, `BENE_BLACKLISTED`) |
| `bank_reference_number` | `string` | Bank reference number for the transaction. Set only when the transfer reaches the bank (`SUCCESS` or `REVERSED`); `null` otherwise |
| `bene_details` | `object` | Beneficiary details for the transfer |
| `bene_details.bene_id` | `string` | Your unique identifier for the beneficiary |
| `bene_details.bene_instrument_id` | `string` | Your unique identifier for the beneficiary instrument |
| `purpose` | `string` | Purpose of the transfer |
| `remarks` | `string` | Additional remarks for the transfer |
| `notes` | `object \| null` | Custom key-value pairs provided during transfer creation. Returns `null` if no notes were set. |
| `initiated_at` | `string` | Timestamp when the transfer was initiated |
| `processed_at` | `string` | Timestamp when the transfer reached a terminal state |
# Create Beneficiary
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-beneficiary/create-user-bene
openapi/ppi/ppi.yaml post /ppi/user/bene
Creates a new beneficiary to user's Full KYC wallet by providing bank account number or VPA and other required details. Ensure the successful creation of the beneficiary before initiating a fund transfer.
# Get Beneficiary Details
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-beneficiary/get-user-bene
openapi/ppi/ppi.yaml post /ppi/user/bene/details
Retrieves details of an existing beneficiary of user in the PPI system.
- If `bene_instrument_id` is provided, the response includes details for the specified instrument only.
- If `bene_instrument_id` is not provided, the response includes details for all `bene_instruments` linked to the given `bene_id`.
# Remove Beneficiary
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-beneficiary/remove-user-bene
openapi/ppi/ppi.yaml delete /ppi/user/bene/remove
Removes an existing beneficiary of the user in the PPI system.
- If `bene_instrument_id` is provided, only the specified instrument is removed from the beneficiary.
- If `bene_instrument_id` is not provided, the entire beneficiary along with all its `bene_instruments` is removed.
# Create User
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-management/create-ppi-user
openapi/ppi/ppi.yaml post /ppi/user
Creates a new user in the PPI system with the provided personal information. This endpoint enables merchants
to onboard new users who can then be associated with wallets or cards.
# Get User Details
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-management/get-ppi-user-details
openapi/ppi/ppi.yaml post /ppi/user/details
Retrieves details of an existing user in the PPI system based on the provided user ID.
Returns the user's personal information and account status.
# Update User
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/user-management/update-ppi-user
openapi/ppi/ppi.yaml post /ppi/user/update
Updates user details in the PPI system. Only the fields provided in the request body will be updated;
all other user fields remain unchanged.
# Check Transaction Eligibility
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/check-wallet-eligibility
openapi/ppi/ppi.yaml post /ppi/wallet/eligibility
Validates a user’s eligibility to perform credit or debit transactions on a sub-wallet based on compliance rules.
# Close Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/close-wallet
openapi/ppi/ppi.yaml post /ppi/wallet/closure
Closes a user's sub-wallet, making it inactive for future transactions. The closure process may require approval
depending on the sub-wallet type and business rules:
- Any remaining balance is handled according to the configured closure policy.
The following table outlines the possible status values returned in the closure response:
| **Status** | **Description** |
| - | - |
| `SUCCESS` | The wallet closure has been processed successfully and the sub-wallet is now inactive. All remaining balance has been handled according to the closure policy. |
| `PENDING` | The closure request has been accepted and is currently being processed. |
| `APPROVAL_PENDING` | The closure request requires manual approval. |
# Create Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/create-wallet
openapi/ppi/ppi.yaml post /ppi/wallet
Creates a primary wallet and the associated sub-wallets for a user based on the specified program ID. The sub-wallet types, such as meal, fuel, and gift wallets, are determined by the program configuration. If the program is linked to a card program, a card is automatically created and associated with the wallet.
The following parameters are required to create a wallet.
| Parameter | Required | Description |
| - | - | - |
| `user_id` | Always | The unique identifier of the user. |
| `wallet_id` | Always | The unique identifier of the wallet. |
| `cf_program_id` | Always | The unique identifier of the program. |
| `card_id` | Conditionally | Required if `cf_program_id` is associated with a card program. |
If `cf_program_id` is linked to a card program, you must provide `card_id` in the request. The card is associated with the wallet at the time of wallet creation.
# Credit Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/credit-wallet
openapi/ppi/ppi.yaml post /ppi/wallet/credit
Credits funds to a specified user sub-wallet, adding money to their available balance. Supports various sub-wallet types with behaviour determined by wallet configuration.
# Debit Status and Status-Code Mapping
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-status-descriptions
Understand debit status and status_code combinations returned by PPI Debit Wallet and Verify Debit Wallet APIs, with recommended actions for each scenario.
Use this reference to understand the `status` and `status_code` values returned by the [Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-wallet) and [Verify Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet), and configure your debit flow accordingly.
## Status and status-code reference
The following table describes all possible `status` and `status_code` combinations returned by debit APIs, along with recommended actions for each scenario.
### Debit transaction statuses
Statuses are organised by transaction state. Each state contains specific status codes that indicate the current progress and required actions.
| Status code | Description | Recommended action |
| - | - | - |
| `PENDING` | Cashfree received the debit request and is processing it. | Wait for a terminal status or poll using the debit response |
| `OTP_GENERATED` | Cashfree sent an OTP to the user for debit authorisation. | Call the [Verify Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet) with the `debit_id` and OTP |
| `LAST_OTP_ATTEMPT_FAILED` | The OTP verification attempt failed, but retries remain. | Prompt the user to re-enter the OTP and call the [Verify Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet) again |
| Status code | Description | Recommended action |
| - | - | - |
| `SUCCESS` | The debit completed successfully. | Proceed with order fulfilment or downstream processing |
| Status code | Description | Recommended action |
| - | - | - |
| `OTP_GENERATION_FAILED` | Cashfree could not generate the OTP for the debit. | Retry the debit or verify notification channel configuration |
| `OTP_VERIFICATION_FAILED` | The OTP verification failed. | Initiate a new debit if required |
| `OTP_EXPIRED` | The OTP has expired. | Initiate a new debit |
| `OTP_VERIFICATION_ATTEMPT_EXHAUSTED` | The maximum OTP verification attempts were exceeded. | Initiate a new debit |
| `FAILED` | The debit failed. | Review the failure reason and retry if applicable |
| Status code | Description | Recommended action |
| - | - | - |
| `REJECTED` | Cashfree rejected the debit. | Review the rejection reason before retrying |
| `INSUFFICIENT_BALANCE` | The sub-wallet does not have sufficient balance for the debit. | Ask the user to top up the wallet or reduce the debit amount |
| Status code | Description | Recommended action |
| - | - | - |
| `REVERSED` | Cashfree reversed the debit. | Update order or balance records accordingly |
# Debit Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-wallet
openapi/ppi/ppi.yaml post /ppi/wallet/debit
Debits funds from a user's sub-wallet for purchases. The behaviour varies based on the sub-wallet type:
- `GIFT_PPI`: Identifies the applicable gift card and debits the amount transactionally from both the gift card and the gift wallet. This debit completes in a single step and does not require OTP verification.
- `CLOSED_LOOP_PPI`: Performs ledger maintenance only. No actual money movement occurs.
- `SMALL_PPI` and `FULL_KYC_PPI`: The debit uses a two-step flow that requires OTP verification.
1. In your request, include the `auth` object with `mode` set to `OTP_VERIFICATION` and specify at least one channel in `auth.data.notification_modes`.
2. Cashfree records the request, generates an OTP, and returns a response with `status: PENDING` and `status_code: OTP_GENERATED`.
3. Call the [Verify Debit Wallet](/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet) API with the `debit_id` and OTP to complete the debit. On successful verification, the status moves to `SUCCESS`.
For `SMALL_PPI` and `FULL_KYC_PPI` sub-wallets, the `auth` object with `mode: OTP_VERIFICATION` is required to initiate a debit. To complete the transaction, call the [Verify Wallet Debit API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet) when the response returns `status_code: OTP_GENERATED`. This two-step flow does not apply to `GIFT_PPI` or `CLOSED_LOOP_PPI` sub-wallets.
Refer to [Status and status-code reference](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-status-descriptions#status-statuscode-mapping) for a comprehensive list of `status` and `status_code` combinations.
# Get Wallet Details
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/get-wallet-details
openapi/ppi/ppi.yaml post /ppi/wallet/details
Use this API to fetch wallet details and associated sub-wallet balances for a specified user. You can query by wallet ID, card ID, or a combination of either with a sub-wallet ID.
`user_id` is always required. You must also provide one of the following identifier combinations.
| Combination | Required parameters |
| - | - |
| By wallet | `user_id`, `wallet_id` |
| By card | `user_id`, `card_id` |
| By wallet and sub-wallet | `user_id`, `wallet_id`, `cf_sub_wallet_id` |
| By card and sub-wallet | `user_id`, `card_id`, `cf_sub_wallet_id` |
The response always includes wallet details and sub-wallet details. The following rules determine what additional data is returned based on the identifiers you provide.
* If you provide `wallet_id` and the wallet has no associated card, the response returns wallet and sub-wallet details only.
* If you provide `wallet_id` and the wallet has an associated card, the response also includes card details.
* If you provide `card_id`, the response includes card details alongside wallet and sub-wallet details.
* If you provide both `wallet_id` and `cf_sub_wallet_id`, the response returns details for the specified sub-wallet only.
* If you provide both `card_id` and `cf_sub_wallet_id`, the response returns details for the specified sub-wallet along with wallet and card details.
# Get Wallet Statement
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/get-wallet-statement
openapi/ppi/ppi.yaml post /ppi/wallet/statement
Retrieves a paginated wallet statement for a user, including both credit and debit transactions for a specific sub-wallet.
- The statement can be fetched for a specified date range. If no range is provided, the API returns transactions from the last 6 months.
- The `from` date **cannot** be earlier than 1 year from the current date.
- Pagination is handled using the `after` and `before` parameters, which define the `cf_statement_id` boundary for retrieving the next or previous set of records.
- Only **one** of `after` or `before` can be passed at a time.
# Refund Debit Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/refund-wallet
openapi/ppi/ppi.yaml post /ppi/wallet/refund
Processes a refund for a previously debited transaction from a user's sub-wallet. The refund operation
credits the amount back to the user's sub-wallet, effectively reversing a debit transaction:
- `GIFT_PPI`: Credits amount back to gift wallet.
- `CLOSED_LOOP_PPI` and `SMALL_PPI`: Credits amount back to the respective sub-wallet.
- Refund amount cannot exceed the original debit amount.
The following table outlines the possible status values returned in the refund response:
| **Status** | **Description** |
| - | - |
| `SUCCESS` | The refund has been processed successfully and the amount has been credited back to the user's sub-wallet. The transaction is complete. |
| `PENDING` | The refund request has been accepted and is currently being processed. The amount will be credited to the wallet shortly. Check the status later or wait for webhook notification. |
# Verify Debit Wallet
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet
openapi/ppi/ppi.yaml post /ppi/wallet/debit/verify
Completes a debit transaction that requires OTP verification for SMALL_PPI or FULL_KYC_PPI sub-wallets. Use this endpoint after the [Debit Wallet API](/api-reference/prepaid-payment-instruments/wallet-management/debit-wallet) returns status_code: OTP_GENERATED. Pass the debit_id from that response along with the OTP received by the customer through the channels configured in auth.data.notification_modes. On successful verification, the API returns status: SUCCESS and status_code: SUCCESS, and the debit transaction is completed. Each debit_id supports a maximum of three OTP verification attempts.
Use this API to complete a debit transaction that requires OTP verification. Call this API after the [Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-wallet) returns `status_code: OTP_GENERATED` for `SMALL_PPI` or `FULL_KYC_PPI` sub-wallets. The request accepts two fields: `debit_id` and `otp`.
Refer to [Status and status-code reference](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-status-descriptions#status-statuscode-mapping) for a comprehensive list of `status` and `status_code` combinations.
A maximum of three verification attempts is allowed per `debit_id`. Further attempts return an error.
# Card Webhooks
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/webhook-card
Configure Cashfree Card webhooks to receive event-based notifications whenever card transactions, refunds or card status updates occur in your PPI integration.
Webhooks are event-based notifications that are received when a specific event related to the Card occurs.
In rare cases, such as network retries, read timeouts, processing delays, or delivery failures, the same webhook might be sent more than once for the same event. To prevent unintended side effects, implement idempotency in your webhook handler to handle duplicate deliveries.
## Webhook signature
You will receive the webhook signature in the webhook header. Here is a sample header from a webhook request.
| Header name | Header value |
| - | :-: |
| content-length | 1099 |
| x-webhook-attempt | 1 |
| content-type | application/json |
| x-webhook-signature | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| x-webhook-timestamp | 1746427759733 |
| x-webhook-version | 2025-01-01 |
Always capture the webhook payload in its raw text format before parsing into JSON. Parsing and reserialising the payload can change the structure (for example, array ordering, spacing, or `null` handling) and cause a signature mismatch during verification. Use the exact raw body string from the request when computing the signature.
## Card transaction webhooks
### Webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. Possible values: `CARD_TRANSACTION_SUCCESS`, `CARD_TRANSACTION_FAILED`, `CARD_TRANSACTION_REVERSED`, `CARD_TRANSACTION_REJECTED`. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `version` | `string` | The version of the webhook payload. |
| `data` | `object` | Contains event-specific details related to this feature. |
The following events are triggered at different stages of a card transaction:
| Event | Description |
| :- | :- |
| CARD\_TRANSACTION\_SUCCESS | The card transaction was successfully processed. |
| CARD\_TRANSACTION\_FAILED | The card transaction failed due to an error (for example, insufficient funds). |
| CARD\_TRANSACTION\_REVERSED | The card transaction was reversed (for example, a refund or void). |
| CARD\_TRANSACTION\_REJECTED | The card transaction was rejected by the system or issuer. |
```json theme={"dark"}
{
"event_type": "CARD_TRANSACTION_SUCCESS",
"event_time": "2025-01-02T15:04:05Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"amount": 500.0,
"channel": "ECOM",
"status": "SUCCESS",
"statusCode": "SUCCESS",
"bank_reference_number": "123456789012",
"usedAt": "AMAZON INDIA",
"initiated_at": "2025-01-02T15:00:00Z",
"processed_at": "2025-01-02T15:04:05Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1000.0,
"available_balance": 1000.0,
"funds_on_hold": 0.00
}
}
}
```
```json theme={"dark"}
{
"event_type": "CARD_TRANSACTION_FAILED",
"event_time": "2025-01-02T15:01:30Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"amount": 100000.0,
"channel": "ECOM",
"status": "FAILED",
"statusCode": "UNKNOWN_REASON",
"bank_reference_number": null,
"usedAt": "LUXURY STORE",
"initiated_at": "2025-01-02T15:01:00Z",
"processed_at": "2025-01-02T15:01:30Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1000.0,
"available_balance": 1000.0,
"funds_on_hold": 0.00
}
}
}
```
```json theme={"dark"}
{
"event_type": "CARD_TRANSACTION_REVERSED",
"event_time": "2025-01-02T16:00:00Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"amount": 500.0,
"channel": "ECOM",
"status": "REVERSED",
"statusCode": "REVERSED",
"bank_reference_number": "123456789012",
"usedAt": "AMAZON INDIA",
"initiated_at": "2025-01-02T15:00:00Z",
"processed_at": "2025-01-02T16:00:00Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1500.0,
"available_balance": 1500.0,
"funds_on_hold": 0.00
}
}
}
```
```json theme={"dark"}
{
"event_type": "CARD_TRANSACTION_REJECTED",
"event_time": "2025-01-02T15:00:01Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"amount": 500.0,
"channel": "POS",
"status": "REJECTED",
"statusCode": "INSUFFICIENT_BALANCE",
"bank_reference_number": null,
"usedAt": "SUSPICIOUS MERCHANT",
"initiated_at": "2025-01-02T15:00:00Z",
"processed_at": "2025-01-02T15:00:01Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1000.0,
"available_balance": 1000.0,
"funds_on_hold": 0.00
}
}
}
```
### Card transaction data fields
| Field | Type | Description |
| - | - | - |
| `user_id` | `string` | Merchant's unique ID for the user. |
| `wallet_id` | `string` | Merchant's unique ID for the wallet. |
| `cf_wallet_id` | `string` | Cashfree's unique ID for the wallet. |
| `card_id` | `string` | Merchant's unique ID for the card. |
| `cf_card_id` | `string` | Cashfree's unique ID for the card. |
| `cf_card_transaction_id` | `string` | Cashfree's unique ID for the transaction. |
| `amount` | `number` | Transaction amount. |
| `channel` | `string` | Channel used for transaction (for example, ECOM, POS, ATM). |
| `status` | `string` | Status of the transaction. |
| `statusCode` | `string` | Granular Status code of the transaction. |
| `bank_reference_number` | `string` | Bank reference number (RRN) for the transaction. |
| `usedAt` | `string` | Location or merchant information where the card was used. |
| `initiated_at` | `string` | Timestamp when the transaction was initiated (ISO 8601). |
| `processed_at` | `string` | Timestamp when the transaction was processed (ISO 8601). |
| `sub_wallet` | `object` | Details of the sub-wallet used for the transaction. |
### Status and statusCode mapping
The following table shows the possible `statusCode` values for each transaction `status`:
| Status | StatusCode |
| - | - |
| RECEIVED | RECEIVED |
| SUCCESS | SUCCESS |
| REVERSED | REVERSED |
| FAILED | UNKNOWN\_REASON |
| REJECTED | CARD\_VELOCITY\_LIMIT\_EXCEEDED, INVALID\_CARD, INVALID\_CVV, FRM\_DECLINE, INVALID\_OTP, INSUFFICIENT\_BALANCE, WALLET\_VELOCITY\_LIMIT\_EXCEEDED, USER\_NOT\_ACTIVE, CARD\_NOT\_ACTIVE, CARD\_EXPIRED, MCC\_NOT\_ALLOWED, CHANNEL\_NOT\_ALLOWED |
## Card refund webhooks
### Webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. Possible values: `CARD_REFUND_SUCCESS`, `CARD_REFUND_FAILED`, `CARD_REFUND_REJECTED`. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `version` | `string` | The version of the webhook payload. |
| `data` | `object` | Contains event-specific details related to this feature. |
The following events are triggered at different stages of a card refund:
| Event | Description |
| :- | :- |
| CARD\_REFUND\_SUCCESS | The card refund was successfully processed and credited. |
| CARD\_REFUND\_FAILED | The card refund failed due to an error during processing. |
| CARD\_REFUND\_REJECTED | The card refund was rejected by the system or bank. |
```json theme={"dark"}
{
"event_type": "CARD_REFUND_SUCCESS",
"event_time": "2025-01-02T15:04:05Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"cf_card_refund_id": "REF987654321",
"amount": 500.0,
"status": "SUCCESS",
"bank_reference_number": "123456789012",
"used_at": "AMAZON INDIA",
"initiated_at": "2025-01-02T15:00:00Z",
"processed_at": "2025-01-02T15:04:05Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1500.0,
"available_balance": 1500.0,
"funds_on_hold": 0.00
}
}
}
```
```json theme={"dark"}
{
"event_type": "CARD_REFUND_FAILED",
"event_time": "2025-01-02T15:01:30Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"cf_card_refund_id": "REF987654322",
"amount": 100.0,
"status": "FAILED",
"bank_reference_number": null,
"used_at": "LUXURY STORE",
"initiated_at": "2025-01-02T15:01:00Z",
"processed_at": "2025-01-02T15:01:30Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1000.0,
"available_balance": 1000.0,
"funds_on_hold": 0.00
}
}
}
```
```json theme={"dark"}
{
"event_type": "CARD_REFUND_REJECTED",
"event_time": "2025-01-02T15:00:01Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"cf_card_transaction_id": "47821234567890123",
"cf_card_refund_id": "REF987654323",
"amount": 500.0,
"status": "REJECTED",
"bank_reference_number": null,
"used_at": "SUSPICIOUS MERCHANT",
"initiated_at": "2025-01-02T15:00:00Z",
"processed_at": "2025-01-02T15:00:01Z",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "General Wallet",
"type": "GENERAL_PPI",
"status": "ACTIVE",
"balance": 1000.0,
"available_balance": 1000.0,
"funds_on_hold": 0.00
}
}
}
```
### Card refund data fields
| Field | Type | Description |
| - | - | - |
| `user_id` | `string` | Merchant's unique ID for the user. |
| `wallet_id` | `string` | Merchant's unique ID for the wallet. |
| `cf_wallet_id` | `string` | Cashfree's unique ID for the wallet. |
| `card_id` | `string` | Merchant's unique ID for the card. |
| `cf_card_id` | `string` | Cashfree's unique ID for the card. |
| `cf_card_transaction_id` | `string` | Cashfree's unique ID for the original card transaction. |
| `cf_card_refund_id` | `string` | Cashfree's unique ID for the refund. |
| `amount` | `number` | Refund amount. |
| `status` | `string` | Status of the refund. |
| `bank_reference_number` | `string` | Bank reference number (RRN) for the refund transaction. |
| `used_at` | `string` | Location or merchant information where the card was used. |
| `initiated_at` | `string` | Timestamp when the refund was initiated (ISO 8601). |
| `processed_at` | `string` | Timestamp when the refund was processed (ISO 8601). |
| `sub_wallet` | `object` | Details of the sub-wallet where the refund was credited. |
## Card status update webhooks
### Webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. Possible values: `PPI_CARD_INACTIVE`, `PPI_CARD_EXPIRED`. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `version` | `string` | The version of the webhook payload. |
| `data` | `object` | Contains event-specific details related to this feature. |
The following events are triggered when a card's status changes:
| Event | Description |
| :- | :- |
| PPI\_CARD\_INACTIVE | The card status has been updated to INACTIVE. |
| PPI\_CARD\_EXPIRED | The card has reached its expiry date and is now EXPIRED. |
```json theme={"dark"}
{
"event_type": "PPI_CARD_INACTIVE",
"event_time": "2025-01-02T15:00:01Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"cf_program_id": "10021",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"wallet_name": "PayNext Vendor Program",
"sub_wallets": [
{
"cf_sub_wallet_id": "35246543210987654321",
"name": "Holiday Gift Card 2026",
"type": "STANDARD_PPI",
"status": "ACTIVE",
"balance": 0.00,
"available_balance": 0.00,
"funds_on_hold": 0.00
}
],
"card": {
"card_name": "PayNext Vendor Program",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"masked_card_number": "XXXXXXXXXXXX7092",
"name_on_card": "John Doe",
"card_holder_name": "John Doe",
"network": "RUPAY",
"status": "INACTIVE"
}
}
}
```
```json theme={"dark"}
{
"event_type": "PPI_CARD_EXPIRED",
"event_time": "2025-01-02T00:00:01Z",
"version": "2025-01-01",
"data": {
"user_id": "USER827364",
"cf_program_id": "10021",
"wallet_id": "WALLET936721",
"cf_wallet_id": "901234567890123456",
"wallet_name": "PayNext Vendor Program",
"sub_wallets": [
{
"cf_sub_wallet_id": "35246543210987654321",
"name": "Holiday Gift Card 2026",
"type": "STANDARD_PPI",
"status": "ACTIVE",
"balance": 0.00,
"available_balance": 0.00,
"funds_on_hold": 0.00
}
],
"card": {
"card_name": "PayNext Vendor Program",
"card_id": "CARD5678",
"cf_card_id": "78901234567890123",
"masked_card_number": "XXXXXXXXXXXX7092",
"name_on_card": "John Doe",
"card_holder_name": "John Doe",
"network": "RUPAY",
"status": "EXPIRED"
}
}
}
```
### Card status update data fields
| Field | Type | Description |
| - | - | - |
| `user_id` | `string` | Merchant's unique ID for the user. |
| `cf_program_id` | `string` | Cashfree's unique ID for the card wallet program. |
| `wallet_id` | `string` | Merchant's unique ID for the wallet. |
| `cf_wallet_id` | `string` | Cashfree's unique ID for the wallet. |
| `wallet_name` | `string` | Name of the wallet. |
| `sub_wallets` | `array` | List of sub-wallets associated with the wallet. |
| `sub_wallets[].cf_sub_wallet_id` | `string` | Cashfree's unique ID for the sub-wallet. |
| `sub_wallets[].name` | `string` | Name of the sub-wallet. |
| `sub_wallets[].type` | `string` | Type of the sub-wallet. |
| `sub_wallets[].status` | `string` | Current status of the sub-wallet. |
| `sub_wallets[].balance` | `number` | Total balance in the sub-wallet. |
| `sub_wallets[].available_balance` | `number` | Balance available for transactions in the sub-wallet. |
| `sub_wallets[].funds_on_hold` | `number` | Funds that are reserved and not yet available for use. |
| `card` | `object` | Details of the card whose status was updated. |
| `card.card_name` | `string` | Name of the card program. |
| `card.card_id` | `string` | Merchant's unique ID for the card. |
| `card.cf_card_id` | `string` | Cashfree's unique ID for the card. |
| `card.masked_card_number` | `string` | Masked card number. |
| `card.name_on_card` | `string` | Name as printed on the card. |
| `card.card_holder_name` | `string` | Name of the person holding the card. |
| `card.network` | `string` | Card network (for example, RUPAY). |
| `card.status` | `string` | New status of the card (for example, INACTIVE, EXPIRED). |
Verifying the signature is mandatory before processing any response. Refer to [Signature Verification](/docs/api-reference/prepaid-payment-instruments/webhook-signature-verification) for more details.
# Wallet Webhooks
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/wallet-management/webhook-wallet
Configure Cashfree wallet webhooks to receive credit and debit event notifications in your prepaid instrument integration.
Cashfree sends event-based notifications when a wallet event occurs.
In rare cases, such as network retries, read timeouts, processing delays, or delivery failures, the same webhook might be sent more than once for the same event. To prevent unintended side effects, implement idempotency in your webhook handler to handle duplicate deliveries.
## Webhook signature
You receive the webhook signature in the webhook header. The following table shows a sample header from a webhook request.
| Header name | Header value |
| - | :-: |
| `content-length` | 1099 |
| `x-webhook-attempt` | 1 |
| `content-type` | application/json |
| `x-webhook-signature` | 07r5C3VMwsGYeldGOCYxe5zoHhIN1zLfa8O0U/yngHI= |
| `x-webhook-timestamp` | 1746427759733 |
| `x-webhook-version` | 2025-01-01 |
Always capture the webhook payload in its raw text format before parsing into JSON. Parsing and reserialising the payload can change the structure (for example, array ordering, spacing, or `null` handling) and cause a signature mismatch during verification. Use the exact raw body string from the request when computing the signature.
## Wallet credit events
Cashfree sends the following event when a wallet credit succeeds:
| Event | Description |
| :- | :- |
| `PPI_CREDIT_SUCCESS` | The credit completes successfully and Cashfree adds funds to the sub-wallet. |
The following example shows a `PPI_CREDIT_SUCCESS` webhook for a `GIFT_PPI` sub-wallet. The `issued_gift_codes` array appears only for gift wallets.
```json PPI_CREDIT_SUCCESS theme={"dark"}
{
"event_type": "PPI_CREDIT_SUCCESS",
"event_time": "2006-01-02T15:04:05Z",
"data": {
"credit_id": "CREDIT126345",
"cf_credit_id": "8901234567890123456",
"wallet_id": "WALLET936721",
"user_id": "USER827364",
"amount": 100.5,
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "Gift Wallet",
"type": "GIFT_PPI",
"status": "ACTIVE",
"balance": 1500.75
},
"issued_gift_codes": [
{
"code": "GIFT-2025-XYZ123",
"value": 100.5,
"expiry": "2025-12-31T23:59:59Z"
}
],
"status": "SUCCESS",
"remarks": "Refund for order 123",
"initiated_at": "2025-09-02T10:15:30Z",
"processed_at": "2025-09-02T10:20:45Z"
}
}
```
## Wallet credit webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. Possible value: `PPI_CREDIT_SUCCESS`. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `data` | `object` | Contains credit-specific details. The object matches the successful [Credit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/credit-wallet) response. |
## Wallet debit events
Cashfree sends a debit webhook when a wallet debit completes with `SUCCESS`. Webhooks are not sent while the debit is `PENDING` (for example, while OTP verification is in progress). For `SMALL_PPI` and `FULL_KYC_PPI` sub-wallets, the webhook is sent after you complete verification with the [Verify Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet).
Cashfree sends the following event when a wallet debit succeeds:
| Event | Description |
| :- | :- |
| `PPI_DEBIT_SUCCESS` | The debit completes successfully and Cashfree deducts funds from the sub-wallet. |
The webhook `data` object uses `status` and `status_code` of `SUCCESS`. For other combinations returned by the Debit Wallet and Verify Debit Wallet APIs, see [Status and status-code reference](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-status-descriptions#status-and-status-code-reference).
The following example shows a `PPI_DEBIT_SUCCESS` webhook for a `GIFT_PPI` sub-wallet. The `applied_gift_codes` array appears only for gift wallets.
```json PPI_DEBIT_SUCCESS theme={"dark"}
{
"event_type": "PPI_DEBIT_SUCCESS",
"event_time": "2025-07-28T10:30:00Z",
"data": {
"debit_id": "DEBIT420984",
"user_id": "USER827364",
"cf_debit_id": "8901234567890123456",
"wallet_id": "WALLET936721",
"sub_wallet": {
"cf_sub_wallet_id": "35246543210987654321",
"name": "Gift Wallet",
"type": "GIFT_PPI",
"status": "ACTIVE",
"balance": 1500.75,
"available_balance": 1500.75,
"funds_on_hold": 0.0
},
"applied_gift_codes": [
{
"code": "GHO-8900-HKDH-8899",
"amount_debited": 100.00,
"value": 100.00,
"expiry": "2026-07-28T10:30:00Z"
},
{
"code": "NMK-8454-JKJD-4224",
"amount_debited": 500.00,
"value": 600.00,
"expiry": "2026-07-28T10:30:00Z"
}
],
"status": "SUCCESS",
"status_code": "SUCCESS",
"amount": 600.00,
"remarks": "Purchase of electronics item",
"initiated_at": "2025-07-28T10:30:00Z",
"processed_at": "2025-07-28T10:30:00Z",
"notes": {
"example_key1": "example_value1",
"example_key2": "example_value2"
}
}
}
```
## Wallet debit webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. Possible value: `PPI_DEBIT_SUCCESS`. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `data` | `object` | Contains debit-specific details. The object matches the successful [Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/debit-wallet) or [Verify Debit Wallet API](/docs/api-reference/prepaid-payment-instruments/wallet-management/verify-debit-wallet) response. |
Verify the signature before you process any webhook payload. For more information, see [Webhook signature verification](/docs/api-reference/prepaid-payment-instruments/webhook-signature-verification#webhook-signature-verification).
# Webhook Signature Verification
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/webhook-signature-verification
Verify Cashfree PPI webhook signatures using your client secret and the supplied timestamp header to confirm authenticity before processing wallet events.
Verifying the signature is mandatory before processing any response. It helps authenticate that the webhook is from Cashfree.
Every webhook contains a signature (`x-webhook-signature`) in the header.
The verification process is as follows:
1. Extract the **`x-webhook-timestamp`** from the headers.
2. Concatenate the timestamp and the **raw request body** (exact payload, unmodified).
3. Generate an **HMAC-SHA256 hash** of this string using your **client secret**.
4. Base64-encode the hash.
5. Compare it with the `x-webhook-signature` header value. If they match, the webhook is valid.
* Always use the **raw request body** and not a parsed JSON object. This prevents signature mismatch.
* Reject the webhook if the signature does not match.
### Sample code
```javascript Node (Express) theme={"dark"}
const crypto = require("crypto");
function verify(req) {
const ts = req.headers["x-webhook-timestamp"];
const rawBody = req.rawBody; // middleware must store raw body
const secretKey = "";
const signStr = ts + rawBody;
return crypto.createHmac("sha256", secretKey).update(signStr).digest("base64");
}
```
```go Go (Echo) theme={"dark"}
import (
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"io/ioutil"
)
func VerifySignature(expectedSig, ts, body string) (string, error) {
signStr := ts + body
key := ""
h := hmac.New(sha256.New, []byte(key))
h.Write([]byte(signStr))
b := h.Sum(nil)
return base64.StdEncoding.EncodeToString(b), nil
}
// usage
timestamp := c.Request().Header.Get("x-webhook-timestamp")
body, _ := ioutil.ReadAll(c.Request().Body)
rawBody := string(body)
signature := c.Request().Header.Get("x-webhook-signature")
VerifySignature(signature, timestamp, rawBody)
```
```php PHP theme={"dark"}
function computeSignature() {
$rawBody = file_get_contents('php://input');
$ts = getallheaders()['x-webhook-timestamp'];
$signStr = $ts . $rawBody;
$key = "";
$computeSig = base64_encode(hash_hmac('sha256', $signStr, $key, true));
return $computeSig; // compare with x-webhook-signature
}
```
```java Java (Servlet) theme={"dark"}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public String generateSignature(HttpServletRequest request) throws Exception {
BufferedReader bufferedReader = request.getReader();
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
String payload = stringBuilder.toString();
String timestamp = request.getHeader("x-webhook-timestamp");
String data = timestamp + payload;
String secretKey = "";
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key_spec = new SecretKeySpec(secretKey.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key_spec);
return Base64.getEncoder().encodeToString(sha256_HMAC.doFinal(data.getBytes()));
}
```
```python Python (Flask/Django) theme={"dark"}
import base64
import hashlib
import hmac
def generateSignature(request):
raw_body = request.data
payload = raw_body.decode('utf-8')
timestamp = request.headers['x-webhook-timestamp']
signatureData = timestamp + payload
message = bytes(signatureData, 'utf-8')
secretkey = bytes("", 'utf-8')
signature = base64.b64encode(hmac.new(secretkey, message, digestmod=hashlib.sha256).digest())
return signature.decode("utf-8") # compare with x-webhook-signature
```
## IPs to whitelist
When you decide to consume the webhooks, first, you need to verify if your systems need an IP whitelisting to be done at your end or not. Accordingly you can whitelist the below IPs of Cashfree:
| Sandbox |
| :- |
| 52.66.25.127 |
| 15.206.45.168 |
| Prod |
| :- |
| 52.66.101.190 |
| 3.109.102.144 |
| 18.60.134.245 |
| 18.60.183.142 |
| Port |
| :- |
| 443 (secured) |
# PPI Webhooks
Source: https://www.cashfree.com/docs/api-reference/prepaid-payment-instruments/webhooks-overview
Index of prepaid instrument (PPI) wallet webhooks, including credit events, wallet notifications, and HMAC verification for JSON payloads.
PPI (wallet) integrations use webhooks for asynchronous outcomes such as wallet credits. Payloads include **`event_type`** and a **`signature`** field; follow the dedicated verification guide before processing money movement. For general webhook reliability guidance, see the [Cashfree webhooks overview](/docs/api-reference/webhooks/overview).
## References
How to compute and validate the HMAC for PPI webhook JSON, including `data` field ordering rules.
Wallet-related webhook events and payload references tied to wallet management APIs.
If a dashboard option for PPI webhooks isn't visible, review the signature verification page above, then raise a request using the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1).
# Rate Limits
Source: https://www.cashfree.com/docs/api-reference/rate-limits
Understand how Cashfree API rate limits work, including per-minute thresholds, response headers, and best practices for handling 429 throttling errors.
We implement rate limiting in Cashfree APIs to control the number of requests a client can make within a specified timeframe. This ensures fair usage among all users, protects the API infrastructure from abuse or spikes in traffic, and maintains consistent performance.
Each API endpoint may have its own rate limit, defined by the maximum number of requests allowed per minute or hour.
You can view the specific rate limits for each API through these links:
Payment API Rate limits
SecureID API Rate limits
## Response Headers
Cashfree APIs include rate-limiting information in the response headers, such as:
* `X-RateLimit-Limit`: The maximum number of requests allowed in the current window.
* `X-RateLimit-Remaining`: The number of requests remaining in the current window.
* `X-RateLimit-Reset`: The time (in seconds) until the rate limit resets.
## Throttling
If the limit is exceeded, the API returns a `429` Too Many Requests status code. Clients are advised to respect the retry-after time mentioned in the response headers before sending further requests.
## Requesting rate limit increases
If your application requires higher rate limits, you can submit a request through the [support form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) or contact your account manager directly. When you submit your request, include the following information:
* Your merchant ID.
* Current usage patterns and volumes.
* Expected future usage requirements.
* Business justification for the increase.
Your account manager can provide faster processing and personalised assistance for rate limit increase requests.
## Best Practices
1. Implement exponential backoff strategies to handle retries gracefully.
2. Monitor API usage and avoid excessive calls by caching responses where applicable.
3. Use API keys responsibly and ensure the application logic adheres to the documented rate limits.
# 2FA API Signature Generation
Source: https://www.cashfree.com/docs/api-reference/vrs/2fa-api-signature-generation
Generate the 2FA signature for Cashfree Secure ID APIs by combining your clientId with a UNIX timestamp and encrypting it with the provided public key.
Follow the steps below to generate your signature:
1. Retrieve your clientId (one which you are passing through the header X-Client-Id)
2. Append this with CURRENT UNIX timestamp separated by a period (.)
3. Encrypt this data using RSA-OAEP with SHA1 and your Public key (.pem file) – this is the signature.
4. Pass this signature through the header X-Cf-Signature.
5. Also include the `x-api-version` header in your request (for example, `2022-09-13`).
The signature is generally valid for 5–10 minutes. Generate a fresh signature for each session.
In the case of using our library, go through the libraries section. During the initialization process, you need to pass the key as a parameter.
```php PHP theme={"dark"}
";
$publicKey =
openssl_pkey_get_public(file_get_contents("/path/to/certificate/public
_key.pem"));
$encodedData = $clientId.".".strtotime("now");
return static::encrypt_RSA($encodedData, $publicKey);
}
private static function encrypt_RSA($plainData, $publicKey) { if (openssl_public_encrypt($plainData, $encrypted, $publicKey,
OPENSSL_PKCS1_OAEP_PADDING))
$encryptedData = base64_encode($encrypted);
else return NULL;
return $encryptedData;
}
?>
```
```java Java theme={"dark"}
private static String generateEncryptedSignature(String clientIdWithEpochTimestamp) {
// String clientIdWithEpochTimeStamp = clientId+"."+Instant.now().getEpochSecond();
String encrytedSignature = "";
try {
byte[] keyBytes = Files
.readAllBytes(new File("/Users/sameera/Downloads/payout_test_public_key.pem").toPath()); // Absolute Path to be replaced
String publicKeyContent = new String(keyBytes);
System.out.println(publicKeyContent);
publicKeyContent = publicKeyContent.replaceAll("[\\t\\n\\r]", "")
.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
System.out.println(publicKeyContent);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(
Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encrytedSignature = Base64.getEncoder().encodeToString(cipher.doFinal(clientIdWithEpochTimestamp.getBytes()));
System.out.println(encrytedSignature);
} catch (Exception e) {
e.printStackTrace();
}
return encrytedSignature;
}
```
## FAQs
No. Due to product architecture limitations, 2FA cannot be disabled in any environment, including sandbox. Depending on your integration, you can use either IP Whitelisting or Public Key authentication as your 2FA method.
A signature mismatch error typically indicates that 2FA via Public Key is enabled for your account. You must include a dynamic signature in the `x-cf-signature` header of each API request. Make sure you are also providing the `x-api-version` header (for example, `2022-09-13`). The signature is valid for 5–10 minutes, so generate a fresh one for each session.
# Data to Test Integration
Source: https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration
Use these sample documents, bank accounts, and parameters to validate every Cashfree Secure ID API across both success and failure verification scenarios.
This topic provides a comprehensive set of test data to help you validate and integrate Secure ID APIs effectively. It includes sample account details, document numbers, and API-specific parameters required for simulating various test scenarios.
Use this data to ensure that your integration behaves correctly for both successful and failure cases across multiple Secure ID services such as Aadhaar verification, PAN validation, passport verification, liveness checks, name matching, and more.
**Note**:
* Validations using any data other than what’s listed in this topic will fail. Test mode validations simulate live transactions but aren't processed through actual verification systems.
* All different modes and validation for the TEST and PROD environment have to be enabled by Cashfree before you attempt. You can contact your account manager or fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1) to enable it for your account.
## Test account details
The SMS notification service is unavailable on the TEST environment, and the OTP is standard across all OTP requests. It is 111000.
### Account holder names
Use the below details to test account holder name validation.
| Given name | Name specified | Match score | Match result | Account number |
| :- | :- | :- | :- | :- |
| JOHN DOE | john doe | 100.00 | DIRECT\_MATCH | 026291800001191 |
| JOHN DOE | john d | 85.00 | GOOD\_PARTIAL\_MATCH | 026291800001191 |
| JOHN DOE | j doe | 70.00 | MODERATE\_PARTIAL\_MATCH | 026291800001191 |
| JOHN DOE | jane d | 38.00 | POOR\_PARTIAL\_MATCH | 026291800001191 |
| TOM WELLS | tom wells | 100.00 | DIRECT\_MATCH | 1233943142 |
| TOM WELLS | tom w | 85.00 | GOOD\_PARTIAL\_MATCH | 1233943142 |
| TOM WELLS | t wells | 70.00 | MODERATE\_PARTIAL\_MATCH | 1233943142 |
| TOM WELLS | tim lee | 38.00 | POOR\_PARTIAL\_MATCH | 1233943142 |
| BOB HOPE | bob hope | 100.00 | DIRECT\_MATCH | 388108022658 |
| BOB HOPE | bob h | 85.00 | GOOD\_PARTIAL\_MATCH | 388108022658 |
| BOB HOPE | b hope | 70.00 | MODERATE\_PARTIAL\_MATCH | 388108022658 |
| BOB HOPE | bane hue | 38.00 | POOR\_PARTIAL\_MATCH | 388108022658 |
### Aadhaar masking
You will get a success response for the API request when you upload a valid image format.
### Passport
The file\_number parameter requires a 15-character string value. Use the following prefixes:
| Prefix for file\_number | Remarks |
| :- | :- |
| PA1 | SUCCESS |
| PA0 | INVALID |
| Any other value | GATEWAY\_ERROR |
### Face liveness
Upload a valid image format and use the following prefix for the verification\_id parameter:
| Verification ID | Remarks |
| :- | :- |
| 2222XXXXX | MULTIPLE\_FACES\_DETECTED |
| 3333XXXXX | FACE\_NOT\_DETECTED |
| 4444XXXXX | REAL\_FACE\_NOT\_DETECTED |
| XXXXXXXXX | Success |
### Face match
You will get a success response for the API request when you upload a valid image format.
### CIN
| CIN | Remarks |
| :- | :- |
| U72900KA2015PTC082989 | VALID |
| U72900KA2015PTC082988 | VALID |
| U72900KA2015PTC082987 | VALID |
| U72900KA2015PTC082981 | INVALID |
| U72900KA2015PTC082982 | INVALID |
### Registration certificate (vehicle)
| Registration number | Remarks |
| :- | :- |
| HJ01ME5279 | INVALID |
| HJ01ME5679 | INVALID |
| HJ01ME5678 | VALID |
### Driving licence
| Driving licence | DOB | Remarks |
| :- | :- | :- |
| KA0120198900984 | 1994-08-05 | VALID |
| KA2320238908787 | 1987-09-04 | INVALID |
### Reverse geocoding coordinates
| Latitude | Longitude | Remarks |
| :- | :- | :- |
| 1 | 2 | Internal server error |
| 12.9274915 | 77.6326806 | Success |
### Geocoding
| Address | Remarks |
| :- | :- |
| Bangalore Karnataka | VALID |
| AAA BBB CCC | INVALID |
### Voter ID
| EPIC number | Remarks |
| :- | :- |
| UAI4574761 | Valid |
| UAI4574762 | Invalid |
### IP address
| IP address | Remarks |
| :- | :- |
| 1.0.171.255 | VALID |
| 219.12.67.255 | INVALID |
### Fetch GSTIN with PAN
| PAN | Remarks |
| :- | :- |
| DUMPY1001A | Success |
| DUMPY1030A | Unavailable |
### Employment information
| Parameter | Value |
| :- | :- |
| phone | 9988775566 |
| pan | ABCDE5930G |
| uan | 101340612345 |
| dob | 1999-01-27 |
| employee\_name | John Doe |
| employer\_name | Cashfree India Private Ltd |
### Name match
| name\_1 | name\_2 | score | reason |
| :- | :- | :- | :- |
| JOHN DOE | JOHN DOE | 1 | DIRECT\_MATCH |
| JOHN DOE | JOHN DE | 0.93 | GOOD\_PARTIAL\_MATCH |
| JOHN DOE | JOHN | 0.77 | MODERATE\_PARTIAL\_MATCH |
| JOHN DOE | J DO | 0.53 | POOR\_PARTIAL\_MATCH |
| JOHN DOE | DO | 0 | NO\_MATCH |
### Bank numbers
For banks, the primary parameters for transfer would be the bank account and IFSC number included while adding the beneficiary. Use these test bank numbers to test payouts to a card. Utilised only with test API keys.
| Account number | IFSC | Remarks |
| :- | :- | :- |
| 026291800001191 | YESB0000262 | Success |
| 00011020001772 | HDFC0000001 | Success |
| 000890289871772 | SCBL0036078 | Success |
| 000100289877623 | SBIN0008752 | Failed at bank |
| 2640101002729 | CNRR0002640 | Failure–Invalid IFSC code |
| 026291800001190 | YESB0000262 | Failure–Invalid Account number |
| 02014457596969 | CITI0000001 | Success (later to Reversed) |
### Aadhaar
| Aadhaar number | Remarks |
| :- | :- |
| 655675523712 | Valid |
| 655675523711 | Valid |
| 655675523710 | Invalid |
| 655675523709 | Invalid |
### GSTIN
| GSTIN | Remarks |
| :- | :- |
| 29AAICP2912R1ZR | Valid |
| 27ABCFGH5678D1Z | Valid |
| 36JKLPQR9012E2Y | Valid |
| 45XYZLMN2345G3W | Valid |
| 12PQRST6789A4BC | Valid |
| 39ABCDE0987F6GH | Valid |
| 23UVWXYZ5678H5D | Valid |
| 05BBICP2912R1ZR | Valid |
| 29AAIZP2912R1ZR | Invalid |
| 05BBICA2912R1ZR | Invalid |
### PAN
| PAN | Remarks |
| :- | :- |
| Individual PAN - ABCPV1234D | Valid |
| Individual PAN - XYZPP4321W | Valid |
| Individual PAN - AZJPG7110R | Valid |
| Business PAN - ABCCD8000T | Valid |
| Business PAN - XYZHP2000L | Valid |
| Business PAN - AAAHU4383C | Valid |
| Business PAN - AMJCL2021N | Valid |
| Individual PAN - DEFPV0126D | Invalid |
| Individual PAN - TUVPP5678W | Invalid |
| Business PAN - LMNCD8010T | Invalid |
| Business PAN - EFGHH2020L | Invalid |
### Mobile 360
Use the following prefix as the data to test the API:
| Mobile number | Remarks |
| :- | :- |
| 9999999999 | SUCCESS |
| 8888888888 | DETAILS\_NOT\_FOUND |
### UPI Penny Drop
Use the following VPAs to test UPI Penny Drop scenarios.
| VPA | Remarks |
| :- | :- |
| success\@upi | VALID |
| valid\@upi | VALID |
| valid\@ybl | VALID |
| invalid\@upi | INVALID |
| incorrect\@upi | INVALID |
| invalid\@ybl | INVALID |
| expired\@upi | EXPIRED |
| expired1\@upi | EXPIRED |
| expired\@ybl | EXPIRED |
### DigiLocker verify account
Use the following prefix as the data to test the API:
| Mobile number | Remarks |
| :- | :- |
| 9988xxxxxx | VALID |
| 919988xxxxxxx | VALID |
| +919988xxxxxx | VALID |
### Geocoding
| Address | Remarks |
| :- | :- |
| Bangalore Karnataka | VALID |
| AAA BBB CCC | VALID |
### One click onboarding
Use the following phone number and OTP to test the APIs:
| Phone number | OTP |
| :- | :- |
| 9999991234 | 1234 |
### Video KYC
Use the following OTP as the test otp to test the VKYC flow during mobile verification in the initial step:
| OTP |
| :- |
| 123456 |
### PAN to UDYAM verification
Use the following PAN numbers to test PAN-Udyam verification scenarios:
| PAN number | Remarks |
| :- | :- |
| AMJCL2021N | SUCCESS |
| LMNCD8010T | UDYAM\_NOT\_FOUND |
| ABCCD8000T | UDYAM\_CANCELLED |
### UDYAM verification
Use the following Udyam reference numbers to test Udyam verification scenarios:
| Udyam reference number | Remarks |
| :- | :- |
| UDYAM-UP-43-1234567 | SUCCESS |
| UDYAM-MH-43-1234567 | UDYAM\_NOT\_FOUND |
| UDYAM-KA-43-1234567 | UDYAM\_IS\_CANCELLED |
# Getting Started
Source: https://www.cashfree.com/docs/api-reference/vrs/getting-started
Set up your Cashfree Secure ID integration by generating API keys, whitelisting IPs, configuring 2FA signatures, and reviewing test endpoints before going live.
* [View end points](/docs/api-reference/vrs/getting-started#view-end-points)
* [Generate API keys](/docs/api-reference/vrs/getting-started#generate-api-keys)
* [Whitelist IP address](/docs/api-reference/vrs/getting-started#whitelist-your-ip-address)
* [2FA API signature generation](/docs/api-reference/vrs/getting-started#2fa-api-signature-generation)
* [Configure success rate alerts](/docs/api-reference/vrs/getting-started#configure-success-rate-alerts)
* [Any queries: contact us](/docs/api-reference/vrs/getting-started#contact-us-for-any-queries)
Install [Cashfree Agent Skills](/docs/tools-ai/cashfree-agent-skills) to bring Cashfree product knowledge into your AI coding assistant (Claude Code, Cursor, VS Code Copilot, Gemini CLI, and more) to answer integration questions and generate accurate code without leaving your editor.
## View end points
Cashfree uses API keys to allow access to the API. Once you have signed up at our merchant site, you will be able to see your AppId and SecretKey.
Cashfree expects API key to be included in all API requests to the server. Use the endpoint **/api/v1/credentials/verify** to verify your credentials.
| Environment | URL |
| :- | :- |
| Production | [https://api.cashfree.com/verification](https://api.cashfree.com/verification) |
| Test | [https://sandbox.cashfree.com/verification](https://sandbox.cashfree.com/verification) |
## Generate API keys
Follow the instructions below to generate API keys:
1. Log in to your [Secure ID dashboard](https://merchant.cashfree.com/verificationsuite/home) and click **Developers** on the navigation panel.
2. Click **API Keys**.
3. Click **Generate API Keys** from the *API Keys* screen.
4. The *New API Keys* popup displays with the client ID and client secret information.
5. Click **Download API Keys** to download the information and save them in your local system folder. Do not share the keys with anyone because they are confidential. You can generate a maximum of 10 API keys.
API Keys - Production Environment: You need to perform an OTP authentication
to generate API keys for production environment.
## Whitelist your IP address
Whitelisting the IP address or generating a public key provides a layer of authentication. These cybersecurity techniques prevent anonymous or unknown disbursement requests and allow only verified requests. Your IP address needs to be whitelisted in the Cashfree production server or it rejects all incoming requests.
Follow the instructions below to whitelist your IP:
1. Log in to your [Secure ID dashboard](https://merchant.cashfree.com/verificationsuite/home) and click **Developers** from the navigation pane > **Two-Factor Authentication** from the **Secure ID** card.
2. Choose **IP Whitelist** from the **Select 2FA Method** drop-down.
3. Click **Add IP Address**.
4. Enter the IP address you want to whitelist in the respective field and click **Add IP Address** to save the details. Note that only IPv4 must be whitelisted, not IPv6. The whitelisted IPs appear in the dashboard.
You can whitelist up to 25 IP addresses. If you need to whitelist more than 25 IP addresses or if your IP addresses are dynamic (not static), use the [Signature Generation](/docs/api-reference/vrs/getting-started#2fa-api-signature-generation) method.
**How to find my IP address?**
Depending on your operating system, you can retrieve the IP of the system via
multiple methods. You can also find your IP using helper sites such as
[https://whatismyipaddress.com/](https://whatismyipaddress.com/).
## 2FA API signature generation
To generate a signature, you need to generate the public key. You then use the generated public key to generate the signature.
### Generate public key
1. Log in to your [Secure ID dashboard](https://merchant.cashfree.com/verificationsuite/home) and click **Developers** from the navigation pane > **Two-Factor Authentication** from the **Secure ID** card.
2. Select **Public Key** from the *Select 2FA Method* drop-down.
3. Click **Generate Public Key**. You can have only one active public key at a time, and you can download it only once.
4. The public key is downloaded to your computer. The public key file is password protected you need to use the unique password sent to your registered email address (linked to your Cashfree account) to open it.
### Generate signature
Follow the steps below to generate your signature:
1. Retrieve your clientId (one which you are passing through the header X-Client-Id)
2. Append this with CURRENT UNIX timestamp separated by a period (.)
3. Encrypt this data using RSA encrypt with Public key you received – this is the signature.
4. Pass this signature through the header X-Cf-Signature.
This method generates a signature that is valid for 5 minutes. Generate a new signature every 5 minutes.
In the case of using our library, go through the libraries section. During the initialization process, you need to pass the key as a parameter.
```php PHP theme={"dark"}
";
$publicKey =
openssl_pkey_get_public(file_get_contents("/path/to/certificate/public
_key.pem"));
$encodedData = $clientId.".".strtotime("now");
return static::encrypt_RSA($encodedData, $publicKey);
}
private static function encrypt_RSA($plainData, $publicKey) { if (openssl_public_encrypt($plainData, $encrypted, $publicKey,
OPENSSL_PKCS1_OAEP_PADDING))
$encryptedData = base64_encode($encrypted);
else return NULL;
return $encryptedData;
}
?>
```
```java Java theme={"dark"}
private static String generateEncryptedSignature(String clientIdWithEpochTimestamp) {
// String clientIdWithEpochTimeStamp = clientId+"."+Instant.now().getEpochSecond();
String encrytedSignature = "";
try {
byte[] keyBytes = Files
.readAllBytes(new File("/Users/sameera/Downloads/payout_test_public_key.pem").toPath()); // Absolute Path to be replaced
String publicKeyContent = new String(keyBytes);
System.out.println(publicKeyContent);
publicKeyContent = publicKeyContent.replaceAll("[\\t\\n\\r]", "")
.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "");
KeyFactory kf = KeyFactory.getInstance("RSA");
System.out.println(publicKeyContent);
X509EncodedKeySpec keySpecX509 = new X509EncodedKeySpec(
Base64.getDecoder().decode(publicKeyContent));
RSAPublicKey pubKey = (RSAPublicKey) kf.generatePublic(keySpecX509);
final Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
encrytedSignature = Base64.getEncoder().encodeToString(cipher.doFinal(clientIdWithEpochTimestamp.getBytes()));
System.out.println(encrytedSignature);
} catch (Exception e) {
e.printStackTrace();
}
return encrytedSignature;
}
```
## Configure success rate alerts
Configure email alerts for each KYC API to be notified when the success rate (SR) falls below a specified threshold for any endpoint. These alerts help you proactively monitor API performance and take timely action to maintain smooth verification workflows.
To configure alerts for your Secure ID account:
1. Log in to your [Secure ID dashboard](https://merchant.cashfree.com/verificationsuite/home) using your credentials.
2. Select **Settings** from the top navigation menu.
3. Select **Email Notifications** under the **Secure ID** section.
4. Select the **SR Alerts** tab and enable the specific API endpoints you want to monitor.
5. Select **Email Notification** from the **Manage Notifications** drop-down, and enter the email addresses to receive alerts.
6. Select **Next**, review your configuration, and select **Submit**.
## Contact us for any queries
For identifying, diagnosing, and resolving problems related to API requests, ensure the information below is communicated while contacting us:
* Share the API request and response details along with `referenceId` or `verificationId`.
* Mention the registered email ID and environment in the email.
* Use your registered email address (with Cashfree) to send the email or mention the registered email address.
* Include your account manager in the CC of the email request.
For dashboard queries, share the screenshot and .har file of the screen.
# Overview
Source: https://www.cashfree.com/docs/api-reference/vrs/overview
Use Cashfree Secure ID REST APIs to verify identities, documents, and bank accounts in real time with webhooks, SDKs, and bulk processing support.
The Secure ID APIs provide RESTful endpoints for identity verification and document authentication with industry-leading success rates and highly optimised latency. These APIs support both sandbox testing and production environments, determined by your credentials, with consistent authentication and error handling across all endpoints. Real-time webhooks and SDKs ensure seamless integration with sub-second response times for critical verification workflows, including bulk processing capabilities for high-volume verification requirements.
## Key features
The key features offered by Cashfree's Secure ID APIs are:
* **Identity verification**: Verify PAN, GSTIN, DigiLocker, and other government documents in real-time.
* **Document OCR**: Extract and verify information from 8+ official documents including PAN, Aadhaar, Driving License, Passport, Voter ID, Vehicle RC, and more using Smart OCR technology with E-sign integration for document authentication.
* **Biometric verification**: Perform face liveness checks, face matching, and name matching for enhanced security.
* **Bulk processing**: Handle large-volume verification requests efficiently with batch processing capabilities for enterprise-scale operations.
* **Seamless onboarding**: 1-click onboarding solutions with mobile-based data retrieval and automated form pre-filling from verified sources through APIs and SDKs.
* **Location verification**: IP verification, reverse geocoding, and address validation tools for accurate location-based authentication.
Fetch list of GSTIN numbers associated with a PAN for business verification.
## Getting started
Use the following resources to begin implementing Secure ID verification:
Learn about Secure ID features, use cases, and implementation guides
Download SDKs and follow step-by-step integration tutorials
# Bank Verification Async
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/bank-verification-async
get /payout/v1/asyncValidation/bankDetails
Use this API to validate the given bank account number and IFSC. This is an async verification request.
This API will be retired soon. Please plan to migrate to the latest version, [Bank Account Verification Async V2](/docs/api-reference/vrs/v2/bav-v2/bank-account-verification-async-v2).
# Bank Verification Sync V1.2
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/bank-verification-sync-v12
get /payout/v1.2/validation/bankDetails
Use this API to validate the given bank account number and IFSC. This is a sync verification request.
This API will be retired soon. Please plan to migrate to the latest version, [Bank Account Verification Sync V2](/docs/api-reference/vrs/v2/bav-v2/bank-account-verification-sync-v2).
# Bulk Bank Verification
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/bulk-bank-verification
post /payout/v1/bulkValidation/bankDetails
Use this API to request bank validations in bulk. It is an asynchronous process.
This API will be retired soon. Please plan to migrate to the latest version, [Bulk Bank Account Verification V2](/docs/api-reference/vrs/v2/bav-v2/bulk-bank-account-verification-v2).
# Get Bulk Verification Status
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/get-bulk-verification-status
get /payout/v1/getBulkValidationStatus
Use this API to get the status of bulk bank validation request by providing the bulkValidationId.
This API will be retired soon. Please plan to migrate to the latest version, [Get Bulk BAV Status V2](/docs/api-reference/vrs/v2/bav-v2/get-bulk-bav-status-v2).
# Get Verification Status
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/get-verification-status
get /payout/v1/getValidationStatus/bank
Use this API to get the statuses of the bank validation request by providing the bvRefId or userId.
This API will be retired soon. Please plan to migrate to the latest version, [Get BAV Status V2](/docs/api-reference/vrs/v2/bav-v2/get-bav-status-v2).
# IFSC Verification
Source: https://www.cashfree.com/docs/api-reference/vrs/v1/bank-account-verification/ifsc-verification
get /payout/v1/ifsc/{ifsc}
Use this API to verify if a given IFSC exists. The bank name, the branch that it belongs to, the transfer modes supported, and the respective MICR code will be shown in the response.
This API will be retired soon. Please plan to migrate to the latest version, [IFSC Verification V2](/docs/api-reference/vrs/v2/ifsc/ifsc-verification-v2).
# Integration Overview
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/1-click-onboarding-sdk
Integrate the Cashfree 1-Click Onboarding SDK in Android, iOS, or web apps to launch verification flows, manage sessions, and handle success or error callbacks.
The 1-Click Onboarding SDK simplifies user verification workflows for Android, iOS, and web applications. You can include a script tag, initialise the SDK with a session ID, and manage verification processes easily. Success and error callbacks handle responses, and you can close the SDK programmatically if needed.
This topic includes the following sections:
* [Integration](#integration)
* [Initializing SDK](#initializing-sdks)
* [Callback structure](#callback-structure)
## Integration
To integrate 1-Click Onboarding:
1. Log in to the [Merchant Dashboard](https://merchant.cashfree.com/verificationsuite/1-click-onboarding) and create a 1-Click Onboarding template.
2. Follow the workflow below:
1. Verify user data using the [Data Availability API](/docs/api-reference/vrs/v2/1-click-onboarding/data-availability) to check user data availability using a mobile number. This step is mandatory.
2. Initiate OAuth by calling the [Initiate OAuth API](/docs/api-reference/vrs/v2/1-click-onboarding/initiate-oauth) with the mobile number to obtain a `session_id` for opening the SDK.
3. Collect user consent by opening the SDK using the `session_id`. Once the user provides consent, a callback returns an `auth_code`.
4. Generate an access token using the auth\_code with the [OAuth Access Token Generation API](/docs/api-reference/vrs/v2/1-click-onboarding/oauth-access-token-generation) to get a token valid for one hour.
5. Retrieve user details using the access token with the [Fetch User Details API](/docs/api-reference/vrs/v2/1-click-onboarding/fetch-user-details-from-access-token) to access user details.
Refer to the image below for a sample workflow:
## Initializing SDKs
The SDK communicates with Cashfree and provides updates via the callbacks. Initialize the applicable SDK from the options below:
* [Web](#web)
* [Android native](#android-native)
* [iOS native](#ios-native)
### Web
To initiate the web SDK, pass the `sessionId` and callback functions. Refer to the JavaScript example below:
```javascript theme={"dark"}
const cf = CF1ClickOnboarding({
sessionId: newId,
successCb: successCallback,
errorCb: errorCallback,
mode: "production" // default: "sandbox"
});
const successCallback = (data) => {
console.log("Success: ", data);
};
const errorCallback = (error) => {
console.error("Error: ", error);
};
// Close the SDK programmatically
cf.closeSDK();
```
#### Importing hosted JS SDK
Include the following SDK in your HTML document for the production environment:
```html theme={"dark"}
```
To use the test environment, set `mode="sandbox"` in the `CF1ClickOnboarding` SDK. This is the default mode. To use the production environment, set `mode="production"`.
Refer to the code snippet below for the HTML structure:
```html theme={"dark"}
1-Click Onboarding
```
### Android native
To set up the Android native SDK:
1. Add the Maven repository to `settings.gradle.kts`:
```kotlin theme={"dark"}
repositories {
google()
mavenCentral()
maven { url = URI("https://maven.cashfree.com/release") }
}
```
2. Add SDK dependency in `build.gradle.kts`:
```kotlin theme={"dark"}
dependencies {
implementation("com.cashfree.vrs:kyc-verification:1.0.1")
}
```
3. Click **Sync Now** in Android Studio to sync the project.
To initialise and use the Android native SDK:
1. Create an instance of the verification service:
```kotlin theme={"dark"}
val verificationService = CFVerificationService.Builder()
.setContext(this) // Pass the context
.build()
```
2. Configure the callback to handle verification responses, errors, and user drop scenarios:
```kotlin theme={"dark"}
verificationService.set1ClickOnboardingCallback(object : CF1ClickOnboardingCallback {
override fun onVerification(response: CF1ClickOnboardingResponse) {
// Handle response
}
override fun onVerificationError(error: CF1ClickOnboardingErrorResponse) {
// Handle error
}
override fun onUserDrop(error: CFUserDropResponse) {
// Handle user drop
}
})
```
3. Initiate the 1-Click Onboarding SDK:
```kotlin theme={"dark"}
verificationService.open1ClickOnboarding(sessionId, Environment.TEST)
```
It consists of the following parameters:
* **sessionId**: Unique session identifier.
* **Environment**: SDK environment. Possible values are:
* `Environment.TEST`
* `Environment.PROD`
### iOS native
To set up the iOS native SDK:
1. Add the SDK to your project by updating your `Podfile`:
```ruby theme={"dark"}
pod 'KycVerificationSdk', '~> 1.0.2'
```
2. Run `pod install` to install the SDK.
To initialise and use the iOS native SDK:
1. Create an instance of the `CFVerificationService` class:
```swift theme={"dark"}
let kycService = CFVerificationService.getInstance()
```
2. Set up callback handlers to manage events after verification processing. Implement the `CF1ClickOnboardingResponseDelegate` protocol to handle responses and errors:
```swift theme={"dark"}
extension ViewController: CFResponseDelegate {
func onVerification(_ verificationResponse: KycVerificationSdk.CF1ClickOnboardingResponse) {
showErrorAlert(title: "Verification Success", message: verificationResponse.verificationId ?? "N/A")
}
func onVerificationError(_ errorResponse: KycVerificationSdk.CF1ClickOnboardingErrorResponse) {
showErrorAlert(title: "Verification Error", message: errorResponse.status ?? "N/A")
}
func onUserDrop(_ userDropResponse: KycVerificationSdk.CFUserDropResponse) {
showErrorAlert(title: "User Dropped", message: userDropResponse.verificationId ?? "N/A")
}
}
```
3. Initiate the 1-Click Onboarding SDK using the following code:
```swift theme={"dark"}
do {
let environment = Environment.PROD
try kycService.open1ClickOnboarding(sessionId, environment, self, self)
} catch let e {
let error = e as! VerificationError
print(error)
}
```
It consists of the following parameters:
* **sessionId**: A unique identifier for the session.
* **environment**: Specifies the environment in which the SDK operates. Possible values are:
* `Environment.TEST`
* `Environment.PROD`
## Callback structure
Refer to the sample response below:
```json theme={"dark"}
{
"verification_id": "verification_id_value",
"auth_code": "auth_code_value",
"status": "SUCCESS"
}
```
Refer to the table below for the possible statuses:
| Status | Description |
| - | - |
| SESSION\_EXPIRED | The session ID is invalid. |
| SESSION\_ID\_MISSING | No session ID is provided during initialization. |
| DIV\_MISSING | The `
` with ID `cf-sdk` is missing. |
| SUCCESS | The operation is completed successfully. |
| CLOSED | The SDK closes. |
**Notes**:
* Ensure the `
` with ID `cf-sdk` exists in your HTML.
* The SDK applies default styling for consistent behaviour; custom styling is not supported.
* The iframe uses sandboxing for secure interactions.
For detailed API documentation, refer to [1-Click Onboarding API](/docs/api-reference/vrs/v2/1-click-onboarding/data-availability) Integration.
# Data Availability
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/data-availability
post /user/data-availability
Use this API to check the availability of user data by passing the required details and retrieve data availability status.
The `available_scopes` values returned in the response have a validity period of 1 hour. Ensure that user consent is obtained and submitted within this timeframe. After expiration, you must make a new API call to retrieve updated scopes.
# Fetch User Details From Access Token
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/fetch-user-details-from-access-token
get /oauth2/user-details
Use this API to retrieve user details by passing a valid access token fetched from the [OAuth Access Token Generation API](https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/oauth-access-token-generation#oauth-access-token-generation).
This endpoint fetches the information associated with the authenticated user.
# Initiate OAuth
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/initiate-oauth
post /oauth2/session
Use this API to initiate the OAuth process by passing the necessary credentials to obtain the session details, which will be used to initiate the SDK.
**Notes**:
* The session ID generated by this API is valid for 1 hour.
* Get the X Client ID and X Client Secret from the [Merchant Dashboard](https://merchant.cashfree.com/verificationsuite/1-click-onboarding) when you create the app under the 1-Click section.
# OAuth Access Token Generation
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/1-click-onboarding/oauth-access-token-generation
post /oauth2/generate-token
Use this API to generate an access token after the user completes the OAuth authentication process. This token is required to access user details once the user provides consent.
The X Client ID and X Client Secret mentioned in this API are obtained from the [Merchant Dashboard](https://merchant.cashfree.com/verificationsuite/1-click-onboarding) when creating the app under 1-Click section.
# Aadhaar Masking
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/aadhaar/aadhaar-masking
post /aadhaar-masking
Use this API to protect customer privacy by masking sensitive Aadhaar information. It masks the first 8 digits and disables QR codes, making Aadhaar cards safe to store in your database while maintaining compliance with data protection regulations.
View the [test data](https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration#aadhaar-masking) and use the information to trigger the validations. The test data can be used only in the sandbox environment.
| Sub code | Status | Message | Next action |
| - | - | - | - |
| 200 | SUCCESS | VALID | - |
| 200 | SUCCESS | INVALID\_DOCUMENT | Upload a valid copy of the aadhaar. |
| 400 | ERROR | x-client-id is missing in the request | Enter all the header information in the API request. |
| 400 | ERROR | image is missing in the request | Upload the image file of the aadhaar card that needs masking. |
| 400 | ERROR | verification\_id can include only alphanum, dot, hyphen and underscores | Only alphanumeric, period (.), hyphen (-), and underscore ( \_ ) are allowed. |
| 400 | ERROR | Client secret belongs to test environment | Enter the correct environment credentials in the request. |
| 401 | ERROR | Invalid clientId and clientSecret combination | Enter valid client ID and secret key in the request. |
| 403 | ERROR | IP not whitelisted your current IP is 106.51.91.104. For IP whitelisting assistance, visit our [IP Whitelisting guide](/docs/secure-id/get-started/integration/ip-whitelisting-verification) | Whitelist the IP address. |
| 409 | ERROR | verification ID already exists | Enter a unique verification ID. |
| 400 | ERROR | Provide a valid file or `file_url` | Upload a valid file type. |
| 413 | ERROR | file size exceeded | The maximum file size should be 10 MB. |
| 422 | ERROR | Insufficient balance to process this request. | Ensure you have sufficient balance and then process the request. |
| 500 | ERROR | something went wrong | Try after some time. |
# Get Employment Details
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/advanced-employment/get-employment-details
post /advance-employment
Use this API to to retrieve an individual's recent employment details.
View the [test data](https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration#employment-information) and use the information to trigger the validations. The test data can be used only in the sandbox environment.
# Bank Account Verification Async V2
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/bank-account-verification-async-v2
post /bank-account/async
Use this API to verify bank account information. This asynchronous verification returns results via webhook or status polling.
View the [test data](https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration#bank-numbers) and use the information to trigger the validations. The test data can be used only in the sandbox environment.
* Cashfree does not support the verification of Deutsche Bank and Paytm Payments Bank accounts.
* For further queries, please refer to the [Bank Account Verification FAQs](/docs/secure-id/kyc-stack/verify-bank-account#faqs).
# Bank Account Verification Sync V2
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/bank-account-verification-sync-v2
post /bank-account/sync
Use this API to perform real-time validation of bank account numbers and IFSC codes. This synchronous verification provides instant results for immediate account verification needs.
View the [test data](https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration#bank-numbers) and use the information to trigger the validations. The test data can be used only in the sandbox environment.
* Cashfree does not support the verification of Deutsche Bank and Paytm Payments Bank accounts.
* For further queries, please refer to the [Bank Account Verification FAQs](/docs/secure-id/kyc-stack/verify-bank-account#faqs).
* IMPS verifies only the first five characters of the IFSC code, which represent the bank. It does not verify the remaining six characters that identify the branch.
# BAV Response Description
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/bav-response-description
Decode every Cashfree Bank Account Verification API response field, including account_status codes, name match scores, and bank identifier metadata.
## account\_status
It displays the status of the bank account.
| STATUS | DESCRIPTION |
| :- | :- |
| `VALID` | The account is successfully verified. |
| `INVALID` | The account is invalid. |
| `RECEIVED` | The transaction request has been successfully received and awaits processing or verification. |
| `FAILED` | The transaction failed due to an error or issue on the bank's side. |
| `REJECTED` | The transaction was rejected, typically due to issues such as insufficient funds. |
| `APPROVAL_PENDING` | This status indicates that the verification process is awaiting merchant approval of the submitted files to proceed further. |
| `PARTIALLY_APPROVED` | This status indicates that some of the submitted data or files have been approved for verification. |
| `IN_PROCESS` | This status indicates that the request is currently under validation, and the verification process is actively ongoing. |
| `CANCELLED` | This status indicates that the request was terminated by the user and will not proceed further. |
| `PROCESSING` | This status indicates that the request is being actively handled, and the system is working on completing the verification or transaction. |
| `MANUALLY_REJECTED` | This status indicates that the request was explicitly reviewed and rejected by a user. |
## account\_status\_code
| STATUS | DESCRIPTION |
| :- | :- |
| `ACCOUNT_IS_VALID` | Bank account has been successfully verified. |
| `FRAUD_ACCOUNT` | Fraudulent activity has been detected involving the bank account and IFSC. As a precautionary measure, both the account and IFSC have been blocked to prevent future transactions. To request unblocking, please contact your account manager or fill out the [Support Form](https://merchant.cashfree.com/merchants/landing?env=prod\&raise_issue=1). |
| `FAILED_AT_BANK` | The transaction failed due to an error or issue at the bank's end. |
| `NPCI_UNAVAILABLE` | The transaction could not be processed because the NPCI (National Payments Corporation of India) service is currently unavailable. |
| `CONNECTION_TIMEOUT` | The transaction failed due to a timeout while trying to establish a connection with the bank. |
| `SOURCE_BANK_DECLINED` | The transaction was declined by the source bank due to issues at their end. |
| `BENE_BANK_DECLINED` | The transaction was declined by the bene bank due to issues at their end. |
| `IMPS_MODE_FAIL` | The transaction failed because it could not be processed through the IMPS mode. |
| `BENEFICIARY_BANK_OFFLINE` | The transaction could not be processed because the beneficiary's bank is currently offline or unreachable. |
| `VALIDATION_IN_PROGRESS` | The transaction is currently being validated and is awaiting confirmation. |
| `INVALID_ACCOUNT_FAIL` | The transaction failed because the provided account details are invalid. |
| `INVALID_IFSC_FAIL` | The transaction failed because the provided IFSC code is invalid or incorrect. |
| `VERIFICATION_ALREADY_UNDER_PROCESS` | The verification is already in progress, and another verification request cannot be processed at this time. |
| `NRE_ACCOUNT_FAIL` | The transaction failed because the account is a Non-Resident External (NRE) account, which is not supported for this transaction type. |
| `ACCOUNT_BLOCKED` | The transaction failed because the account is blocked and cannot process transactions. |
| `INSUFFICIENT_BALANCE` | The transaction failed due to insufficient funds in the merchant account for processing the transaction. |
## name\_match\_result
It displays the result of the name match verification. Name match verification is done against the name provided in the request and the name associated with the bank account.
| STATUS | DESCRIPTION |
| :- | :- |
| `DIRECT_MATCH` | Indicates that the name provided in the request matches exactly with the name associated with the bank account. |
| `GOOD_PARTIAL_MATCH` | Indicates a strong similarity between the provided name and the name associated with the bank account, with minor differences. |
| `MODERATE_PARTIAL_MATCH` | Indicates a noticeable similarity between the provided name and the name associated with the bank account, but with more significant variations or missing details. |
| `POOR_PARTIAL_MATCH` | Indicates a weak similarity between the provided name and the name associated with the bank account, suggesting a potential mismatch but with some common elements. |
| `NO_MATCH` | Indicates that there is no recognisable similarity between the provided name and the name associated with the bank account, or the names are entirely different. |
Example of name\_match\_result.
| Given name | Name at bank | Match score | Match result | Account number |
| :- | :- | :- | :- | :- |
| JOHN DOE | john doe | 100.00 | DIRECT\_MATCH | 026291800001191 |
| JOHN DOE | john d | 85.00 | GOOD\_PARTIAL\_MATCH | 026291800001191 |
| JOHN DOE | j doe | 70.00 | MODERATE\_PARTIAL\_MATCH | 026291800001191 |
| JOHN DOE | jane d | 38.00 | POOR\_PARTIAL\_MATCH | 026291800001191 |
| TOM WELLS | tom wells | 100.00 | DIRECT\_MATCH | 1233943142 |
| TOM WELLS | tom w | 85.00 | GOOD\_PARTIAL\_MATCH | 1233943142 |
| TOM WELLS | t wells | 70.00 | MODERATE\_PARTIAL\_MATCH | 1233943142 |
| TOM WELLS | tim lee | 38.00 | POOR\_PARTIAL\_MATCH | 1233943142 |
| BOB HOPE | bob hope | 100.00 | DIRECT\_MATCH | 388108022658 |
| BOB HOPE | bob h | 85.00 | GOOD\_PARTIAL\_MATCH | 388108022658 |
| BOB HOPE | b hope | 70.00 | MODERATE\_PARTIAL\_MATCH | 388108022658 |
| BOB HOPE | bane hue | 38.00 | POOR\_PARTIAL\_MATCH | 388108022658 |
# Bulk Bank Account Verification V2
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/bulk-bank-account-verification-v2
post /bank-account/bulk
Use this API to verify bank account information in bulk.
View the [test data](https://www.cashfree.com/docs/api-reference/vrs/data-to-test-integration#bank-numbers) and use the information to trigger the validations. The test data can be used only in the sandbox environment.
* Cashfree does not support the verification of Deutsche Bank and Paytm Payments Bank accounts.
* For further queries, please refer to the [Bank Account Verification FAQs](/docs/secure-id/kyc-stack/verify-bank-account#faqs).
# Get BAV Status V2
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/get-bav-status-v2
get /bank-account
Use this API to check the status of your bank verification requests by passing reference ID or user ID to see if the validation is complete and get the results.
* Cashfree does not support the verification of Deutsche Bank and Paytm Payments Bank accounts.
* For further queries, please refer to the [Bank Account Verification FAQs](/docs/secure-id/kyc-stack/verify-bank-account#faqs).
# Get Bulk BAV Status V2
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/get-bulk-bav-status-v2
get /bank-account/bulk
Use this API to get the details of the bulk bank account verification request by passing either the bulk reference ID or bulk validation ID. If you want to get the status of a single entry, pass the particular reference ID in the request.
* Cashfree does not support the verification of Deutsche Bank and Paytm Payments Bank accounts.
* For further queries, please refer to the [Bank Account Verification FAQs](/docs/secure-id/kyc-stack/verify-bank-account#faqs).
# Webhooks
Source: https://www.cashfree.com/docs/api-reference/vrs/v2/bav-v2/webhooks-bank-account-verification
Subscribe to Cashfree async Bank Account Verification webhooks to receive penny drop and BAV result events when verification completes for users.
Webhooks are event-based notifications that are received when a specific event related to async bank account verification occurs.
In rare cases, such as network retries, read timeouts, processing delays, or delivery failures, the same webhook might be sent more than once for the same event. To prevent unintended side effects, implement idempotency in your webhook handler to handle duplicate deliveries.
## Add webhooks
Add your webhook URL in our system for us to deliver webhook events.
Follow the instructions below to configure the webhook URL. Ensure to provide the publicly accessible HTTPS URL to your webhook endpoint.
1. Log in to the **[Merchant Dashboard](https://merchant.cashfree.com/merchants/)** and click **Developers**.
2. Click **Webhooks** listed under the **Secure ID** card.
3. Click **Add Webhook URL** in the **Webhook** screen.
4. In the **Add Webhook** popup, fill in the following information:
* **Webhook URL**: Enter the URL in this field.
5. Click **Test & Add Webhook**.
## Webhook event
The following events are triggered at different stages of the bank account verification process:
| Event | Description |
| :- | :- |
| BANK\_ACCOUNT\_VERIFICATION\_SUCCESS | Bank account verification is a success. |
| BANK\_ACCOUNT\_VERIFICATION\_REJECTED | Bank account verification is rejected. |
| BANK\_ACCOUNT\_VERIFICATION\_FAILED | Bank account verification is a failure. |
```json theme={"dark"}
{
"signature":"signature",
"event_type":"BANK_ACCOUNT_VERIFICATION_SUCCESS",
"event_time":"2023-07-19 10:46:16",
"version":"v2",
"data":{
"reference_id": 1294785793,
"user_id" : "123123",
"name_at_bank": "John Doe",
"amount_deposited": "1.04",
"bank_name": "YES BANK",
"utr": "404223241811",
"city": "MUMBAI",
"branch": "SANTACRUZ, MUMBAI",
"micr": 400532038,
"name_match_score": "90.00",
"name_match_result": "GOOD_PARTIAL_MATCH",
"account_status": "VALID",
"account_status_code": "ACCOUNT_IS_VALID"
}
}
```
```json theme={"dark"}
{
"signature":"signature",
"event_type":"BANK_ACCOUNT_VERIFICATION_REJECTED",
"event_time":"2023-07-19 10:46:16",
"version":"v2",
"data":{
"reference_id": 1294785793,
"user_id" : "123123",
"account_status": "REJECTED",
"account_status_code": "INSUFFICIENT_BALANCE"
}
}
```
```json theme={"dark"}
{
"signature":"signature",
"event_type":"BANK_ACCOUNT_VERIFICATION_FAILED",
"event_time":"2023-07-19 10:46:16",
"version":"v2",
"data":{
"reference_id": 1294785793,
"user_id" : "123123",
"account_status": "FAILED",
"account_status_code": "SOURCE_BANK_DECLINED"
}
}
```
## Webhook payload fields
The webhook payload contains important metadata in its top-level fields.
| Field | Type | Description |
| - | - | - |
| `signature` | `string` | A Base64-encoded HMAC-SHA256 signature of the payload, generated using a shared client secret. |
| `event_type` | `string` | Indicates the type of event that triggered the webhook. |
| `event_time` | `string` | The UTC timestamp of when the event occurred, formatted in ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). |
| `version` | `string` | Indicates the webhook format being used. Default version is "v1". |
| `data` | `object` | Contains event-specific details related to this feature. |
## Signature Verification
Verifying the signature is mandatory before processing any response. It helps authenticate that the webhook is from Cashfree.
Follow the steps to verify the signature:
1. Sort the array based on keys.
2. Concatenate all the values in this array and the resultant is the post data (**postData**).
3. **postData** needs to be encrypted using SHA-256 and then base64 encoded.
4. Verify if both the signature calculated and the signature received match.
5. Proceed further only if the signatures match. If not, discard the request.
6. Ensure **clientSecret** you use is from the oldest active key pair.
For example, from the webhook received, extract the data and pass it to generate HMAC function:
```
{bank_account=026291800001191, ifsc=YESB0000262, upi=, name_at_bank=John Doe,
verification_id=fadsfdsf, ref_id=332, utr=332, status=SUCCESS,
added_on=2023-09-06T07:48:53+05:30, processed_on=2023-09-06 07:49:03,
penny_collected_on=2023-09-06 07:48:53}
```
```Text Java code - for reference theme={"dark"}
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Map;
import java.util.TreeMap;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.codec.binary.Base64;
public class ComputedSignature {
public static String generateHMAC(String clientSecret, String data) {
String hash = null;
ObjectMapper objectMapper = new ObjectMapper();
try {
Map jsonMap = objectMapper.readValue(data, new TypeReference