---
title: "Create a plan"
method: POST
path: "/plans"
tags: ["Plans"]
---

# Create a plan

`POST /plans`

Define a recurring billing plan with a fixed period, interval, and amount. Plans are reusable across multiple subscriptions. Once created, plan details cannot be modified.

## Request body

- object
  - `period` 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly', required — Billing frequency unit. For daily, minimum interval is 7.
  - `interval` integer, required — Number of periods between charges (e.g. interval=3, period=monthly → charge every 3 months).
  - `item` object, required
    - `name` string, required — Plan display name shown to customers.
    - `description` string
    - `amount` integer, required — Charge amount in paise per billing cycle.
    - `currency` string, required
  - `notes` Notes — Key-value pairs for storing custom metadata. Maximum 15 pairs. Each key and value must not exceed 256 characters.

## Response `200`

Plan created.

- Plan — A billing plan defining the recurring charge amount and frequency. Reusable across multiple subscriptions.
  - `id` string — Plan ID. Prefix: plan_
  - `entity` 'plan'
  - `interval` integer — Number of periods between charges. For daily period, minimum interval is 7.
  - `period` 'daily' | 'weekly' | 'monthly' | 'quarterly' | 'yearly' — Billing frequency unit. daily requires interval ≥ 7.
  - `item` Item — A reusable catalog item used in invoice line items.
    - `id` string — Item ID. Prefix: item_
    - `entity` 'item'
    - `active` boolean — Whether the item is active and available for use in new invoices.
    - `amount` integer — Item price in paise (smallest INR unit).
    - `unit_amount` integer — Per-unit price in paise.
    - `currency` string
    - `name` string — Display name of the item.
    - `description` string
    - `created_at` integer
  - `notes` Notes — Key-value pairs for storing custom metadata. Maximum 15 pairs. Each key and value must not exceed 256 characters.
  - `created_at` integer

## Other responses

- `400` — Bad request. Invalid parameters or missing required fields.
- `401` — Authentication failed. Invalid or missing API key credentials.
- `429` — Rate limit exceeded. Implement exponential backoff with jitter before retrying.

---

[API](https://skmtc.net/curlec/apis/razorpay-api.md) · [All operations](https://skmtc.net/curlec/apis/razorpay-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/curlec/razorpay-api/revisions/824ca9e6faef/schema)
