---
title: "List quotas"
method: GET
path: "/v1/projects/{project_id}/quotas"
tags: ["Quotas"]
---

# List quotas

`GET /v1/projects/{project_id}/quotas`

## Request

- Base URL: `https://api.naturali.ai`
- URL: `https://api.naturali.ai/v1/projects/{project_id}/quotas`
- 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`)

Returns the quotas defined in a project

## Query parameters

- `limit` integer
- `offset` integer

## Response `200`

List of quotas

- object
  - `data` Quota[], required
    - `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
  - `total` integer, required
  - `limit` integer, required
  - `offset` integer, required

## Other responses

- `401`: Unauthorized
- `403`: Forbidden
- `500`: Internal server error

---

[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)
