> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cuprice.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Plan

> Update a pricing plan's properties

Updates an existing pricing plan. Only the fields you include in the request body will be changed — all other fields remain untouched.

<Note>
  To manage which features are assigned to a plan, use the [Add Features to Plan](/api-reference/v1/add-features-to-plan) and [Remove Feature from Plan](/api-reference/v1/remove-feature-from-plan) endpoints.
</Note>

## Endpoint

```
PUT /api/v1/projects/{slug}/plans/{planId}
```

## Authentication

<ParamField header="Authorization" type="string" required>
  Bearer token with your API key. Requires `read_write` permission.
</ParamField>

## Path Parameters

<ParamField path="slug" type="string" required>
  The project's URL-friendly slug identifier.
</ParamField>

<ParamField path="planId" type="number" required>
  The plan's unique ID.
</ParamField>

## Body Parameters

All fields are optional. Only provided fields are updated.

<ParamField body="name" type="string">
  Plan display name.
</ParamField>

<ParamField body="description" type="string">
  Description of the plan.
</ParamField>

<ParamField body="isPopular" type="boolean">
  Mark or unmark the plan as "Popular".
</ParamField>

<ParamField body="isVisible" type="boolean">
  Show or hide the plan on the pricing page.
</ParamField>

<ParamField body="basePrice" type="number">
  Monthly base price of the plan.
</ParamField>

<ParamField body="isFree" type="boolean">
  Whether this is a free plan.
</ParamField>

<ParamField body="freemiumDay" type="number">
  Number of free trial days before billing begins.
</ParamField>

<ParamField body="isPerUserPricing" type="boolean">
  Enable per-user (per-seat) pricing for this plan.
</ParamField>

<ParamField body="perUserMultiplier" type="number">
  Price multiplier per additional user when per-user pricing is enabled.
</ParamField>

## Response

Returns the full updated plan object.

## Example

```bash theme={null}
curl -X PUT https://cuprice.io/api/v1/projects/my-saas-app/plans/201 \
  -H "Authorization: Bearer cpk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Pro Plus",
    "basePrice": 39,
    "isPopular": true,
    "freemiumDay": 14,
    "isPerUserPricing": true,
    "perUserMultiplier": 8
  }'
```

```json theme={null}
{
  "id": 201,
  "name": "Pro Plus",
  "description": "For growing teams",
  "basePrice": 39,
  "isPopular": true,
  "isVisible": true,
  "isFree": false,
  "freemiumDay": 14,
  "isPerUserPricing": true,
  "perUserMultiplier": 8,
  "planFeatures": [
    {
      "id": 301,
      "multiplier": 5,
      "feature": {
        "id": 101,
        "name": "AI Prompts",
        "featureType": "Limits",
        "basePrice": 10
      }
    },
    {
      "id": 302,
      "multiplier": 1,
      "feature": {
        "id": 102,
        "name": "Team Members",
        "featureType": "Standart",
        "basePrice": 5
      }
    }
  ],
  "createdAt": "2025-10-05T12:00:00.000Z",
  "updatedAt": "2025-12-10T09:30:00.000Z"
}
```

## Errors

| Status | Description                                   |
| ------ | --------------------------------------------- |
| `400`  | Invalid field value                           |
| `401`  | Invalid or missing API key                    |
| `403`  | API key does not have `read_write` permission |
| `404`  | Project or plan not found                     |
