---
title: "Update a quota"
method: PATCH
path: "/v1/projects/{project_id}/quotas/{quota_id}"
tags: ["Quotas"]
---

# Update a quota

`PATCH /v1/projects/{project_id}/quotas/{quota_id}`

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/quotas/{quota_id}`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.naturali.ai/authorize`, token URL `https://api.naturali.ai/token`, scopes: `mcp:access`)

Updates a quota's limit and/or mode. Other fields are immutable.

## Path parameters

- `quota_id` string, required

## Request body

- object
  - `limit` number: New limit
  - `mode` 'enforce' | 'monitor': New mode
  - `on_unpriced` 'block' | 'allow': New pricing posture. Only for metric cost_usd (400 on any other metric); see the create operation for what block and allow mean.

## Response `200`

Quota updated successfully

- Quota
  - `id` string
  - `project_id` string
  - `scope` 'project' | 'api_key' | 'agent' | 'actor'
  - `scope_ref` string, nullable: Public id of the api key / agent / actor the quota applies to. For `api_key` and `agent` scope, NULL means all entities of that scope type in the project. For `actor` scope, NULL means one budget *per* actor rather than a pooled total across all actors.
  - `metric` 'requests' | 'tokens' | 'cost_usd' | 'storage_bytes'
  - `window` 'rolling_1m' | 'rolling_1h' | 'rolling_24h' | 'calendar_month' | 'current': The window the metric is aggregated over; `current` on storage_bytes, which caps a stored total and never resets.
  - `limit` number
  - `mode` 'enforce' | 'monitor'
  - `meter_type` 'llm_tokens' | 'compute_execution' | 'api_request' | 'storage' | 'tool_execution' | 'null', nullable: The meter a cost_usd cap answers for. Null is every priced meter, which is what a quota created without one carries.
  - `on_unpriced` 'block' | 'allow' | 'null', nullable: Pricing posture of a cost_usd quota over an unpriced blackout — block refuses generations, allow lets them through (the quota_unpriced exception is filed either way, and for a partly priced window, which no posture refuses). Null for metrics with no pricing dependency.
  - `current_usage` object, nullable: Current fixed-window usage for the requests metric. Null for token/cost quotas (which aggregate the usage meter at check time rather than keeping a counter), null for storage_bytes (a stored total has no window and no counter — read the footprint from the storage meter), and null in list responses.
    - `window_key` string
    - `count` integer
    - `resets_at` string, date-time
  - `created_at` string, date-time
  - `updated_at` string, date-time

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Quota not found

---

[API](https://skmtc.dev/naturali/apis/naturali-ai-api.md) · [All operations](https://skmtc.dev/naturali/apis/naturali-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/naturali/apis/naturali-ai-api/revisions/e4905b78f422?raw)
