curl --request POST \
--url https://sandbox.cashfree.com/pg/plans \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--header 'x-client-id: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"plan_id": "plan_12345",
"plan_name": "Plan 12345",
"plan_type": "PERIODIC",
"plan_currency": "INR",
"plan_recurring_amount": 10,
"plan_max_amount": 100,
"plan_max_cycles": 10,
"plan_intervals": 2,
"plan_interval_type": "WEEK",
"plan_note": "Test Plan"
}
'import requests
url = "https://sandbox.cashfree.com/pg/plans"
payload = {
"plan_id": "plan_12345",
"plan_name": "Plan 12345",
"plan_type": "PERIODIC",
"plan_currency": "INR",
"plan_recurring_amount": 10,
"plan_max_amount": 100,
"plan_max_cycles": 10,
"plan_intervals": 2,
"plan_interval_type": "WEEK",
"plan_note": "Test Plan"
}
headers = {
"x-api-version": "<x-api-version>",
"x-client-id": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-client-id': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
plan_id: 'plan_12345',
plan_name: 'Plan 12345',
plan_type: 'PERIODIC',
plan_currency: 'INR',
plan_recurring_amount: 10,
plan_max_amount: 100,
plan_max_cycles: 10,
plan_intervals: 2,
plan_interval_type: 'WEEK',
plan_note: 'Test Plan'
})
};
fetch('https://sandbox.cashfree.com/pg/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.cashfree.com/pg/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'plan_id' => 'plan_12345',
'plan_name' => 'Plan 12345',
'plan_type' => 'PERIODIC',
'plan_currency' => 'INR',
'plan_recurring_amount' => 10,
'plan_max_amount' => 100,
'plan_max_cycles' => 10,
'plan_intervals' => 2,
'plan_interval_type' => 'WEEK',
'plan_note' => 'Test Plan'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-version: <x-api-version>",
"x-client-id: <api-key>",
"x-client-secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.cashfree.com/pg/plans"
payload := strings.NewReader("{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-client-id", "<api-key>")
req.Header.Add("x-client-secret", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.cashfree.com/pg/plans")
.header("x-api-version", "<x-api-version>")
.header("x-client-id", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.cashfree.com/pg/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-client-id"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}"
response = http.request(request)
puts response.read_body{
"plan_currency": "INR",
"plan_id": "144436-03471-JD_TEST",
"plan_interval_type": "WEEK",
"plan_intervals": 1,
"plan_max_amount": 1,
"plan_max_cycles": 4,
"plan_name": "abscede",
"plan_note": "lsdkdn",
"plan_recurring_amount": 1,
"plan_status": "ACTIVE",
"plan_type": "PERIODIC"
}{
"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"
}{
"message": "authentication Failed",
"code": "request_failed",
"type": "authentication_error"
}{
"message": "something is not found",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "something_not_found",
"type": "invalid_request_error"
}{
"message": "something is not found",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "idempotency_error"
}{
"message": "Too many requests from IP. Check headers",
"code": "request_failed",
"type": "rate_limit_error"
}{
"message": "internal Server Error",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "internal_error",
"type": "api_error"
}Create a Plan
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.
curl --request POST \
--url https://sandbox.cashfree.com/pg/plans \
--header 'Content-Type: application/json' \
--header 'x-api-version: <x-api-version>' \
--header 'x-client-id: <api-key>' \
--header 'x-client-secret: <api-key>' \
--data '
{
"plan_id": "plan_12345",
"plan_name": "Plan 12345",
"plan_type": "PERIODIC",
"plan_currency": "INR",
"plan_recurring_amount": 10,
"plan_max_amount": 100,
"plan_max_cycles": 10,
"plan_intervals": 2,
"plan_interval_type": "WEEK",
"plan_note": "Test Plan"
}
'import requests
url = "https://sandbox.cashfree.com/pg/plans"
payload = {
"plan_id": "plan_12345",
"plan_name": "Plan 12345",
"plan_type": "PERIODIC",
"plan_currency": "INR",
"plan_recurring_amount": 10,
"plan_max_amount": 100,
"plan_max_cycles": 10,
"plan_intervals": 2,
"plan_interval_type": "WEEK",
"plan_note": "Test Plan"
}
headers = {
"x-api-version": "<x-api-version>",
"x-client-id": "<api-key>",
"x-client-secret": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-api-version': '<x-api-version>',
'x-client-id': '<api-key>',
'x-client-secret': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
plan_id: 'plan_12345',
plan_name: 'Plan 12345',
plan_type: 'PERIODIC',
plan_currency: 'INR',
plan_recurring_amount: 10,
plan_max_amount: 100,
plan_max_cycles: 10,
plan_intervals: 2,
plan_interval_type: 'WEEK',
plan_note: 'Test Plan'
})
};
fetch('https://sandbox.cashfree.com/pg/plans', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.cashfree.com/pg/plans",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'plan_id' => 'plan_12345',
'plan_name' => 'Plan 12345',
'plan_type' => 'PERIODIC',
'plan_currency' => 'INR',
'plan_recurring_amount' => 10,
'plan_max_amount' => 100,
'plan_max_cycles' => 10,
'plan_intervals' => 2,
'plan_interval_type' => 'WEEK',
'plan_note' => 'Test Plan'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-version: <x-api-version>",
"x-client-id: <api-key>",
"x-client-secret: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.cashfree.com/pg/plans"
payload := strings.NewReader("{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-version", "<x-api-version>")
req.Header.Add("x-client-id", "<api-key>")
req.Header.Add("x-client-secret", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.cashfree.com/pg/plans")
.header("x-api-version", "<x-api-version>")
.header("x-client-id", "<api-key>")
.header("x-client-secret", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.cashfree.com/pg/plans")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-version"] = '<x-api-version>'
request["x-client-id"] = '<api-key>'
request["x-client-secret"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"plan_id\": \"plan_12345\",\n \"plan_name\": \"Plan 12345\",\n \"plan_type\": \"PERIODIC\",\n \"plan_currency\": \"INR\",\n \"plan_recurring_amount\": 10,\n \"plan_max_amount\": 100,\n \"plan_max_cycles\": 10,\n \"plan_intervals\": 2,\n \"plan_interval_type\": \"WEEK\",\n \"plan_note\": \"Test Plan\"\n}"
response = http.request(request)
puts response.read_body{
"plan_currency": "INR",
"plan_id": "144436-03471-JD_TEST",
"plan_interval_type": "WEEK",
"plan_intervals": 1,
"plan_max_amount": 1,
"plan_max_cycles": 4,
"plan_name": "abscede",
"plan_note": "lsdkdn",
"plan_recurring_amount": 1,
"plan_status": "ACTIVE",
"plan_type": "PERIODIC"
}{
"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"
}{
"message": "authentication Failed",
"code": "request_failed",
"type": "authentication_error"
}{
"message": "something is not found",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "something_not_found",
"type": "invalid_request_error"
}{
"message": "something is not found",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "request_invalid",
"type": "idempotency_error"
}{
"message": "Too many requests from IP. Check headers",
"code": "request_failed",
"type": "rate_limit_error"
}{
"message": "internal Server Error",
"help": "Check latest errors and resolution from Merchant Dashboard API logs: https://bit.ly/4glEd0W Help Document: https://bit.ly/4eeZYO9",
"code": "internal_error",
"type": "api_error"
}Authorizations
Client app ID. You can find your app id in the Merchant Dashboard.
Client secret key. You can find your secret key in the Merchant Dashboard.
Headers
API version to be used.
Request ID for the API call. Can be used to resolve tech issues. Communicate this in your tech related queries to Cashfree.
An idempotency key is a unique identifier you include with your API call. If the request fails or times out, you can safely retry it using the same key to avoid duplicate actions.
Body
Request parameters to create a plan.
Unique ID to identify the plan. Only alpha-numerics, dot, hyphen and underscore allowed.
1 - 40Name of the plan.
1 - 40Type of the plan. Possible values - PERIODIC, ON_DEMAND.
Maximum amount for the plan.
Currency of the plan. For plans in non-INR currency, please refer to supported currencies.
Recurring amount for the plan. Required for PERIODIC plan_type.
Maximum number of payment cycles for the plan.
Number of billing cycles between charges. For instance, if set to 2 and the interval type is 'week', the service will be billed every 2 weeks. Similarly, if set to 3 and the interval type is 'month', the service will be billed every 3 months. Required for PERIODIC plan_type.
Interval type for the plan. Possible values - DAY, WEEK, MONTH, YEAR.
Note for the plan.
Response
Success response for creating a plan.
Currency for the plan.
Plan ID provided by merchant.
Interval type for the plan.
Number of intervals for the plan.
Maximum amount for the plan.
Maximum number of payment cycles for the plan.
Name of the plan.
Note for the plan.
Recurring amount for the plan.
Status of the plan.
Type of the plan.
Was this page helpful?