---
title: "Create Organization Spend Ceiling"
method: POST
path: "/v1/organizations/me/spend-ceilings"
tags: ["organization-budgets"]
---

# Create Organization Spend Ceiling

`POST /v1/organizations/me/spend-ceilings`

Cap one identity in this organization at one of its budgets.

Answers 404 when the scope names nothing in this organization, rather than
creating a ceiling that can never bind, and 404 when the budget is not this
organization's.

## Request body

- OrganizationScopedBudgetCreate — Attach one of the organization's budgets to a scope inside it.
  - `budget_id` string, required — The budget this ceiling enforces, which must be one this organization owns
  - `name` string, nullable — Admin-facing label for this ceiling
  - `provider_key_id` string, nullable — Narrow the cap to one provider instance; omit or null to cap spend across every provider. Must name a real instance: a blank value would store a ceiling that never binds
  - `scope_id` string, required — Id of the capped identity: this organization, one of its workspaces, a membership in either, or an API key in one
  - `scope_type` 'organization' | 'workspace' | 'workspace_member' | 'org_member' | 'api_token', required — Which kind of identity this ceiling caps

## Response `201`

Successful Response

- OrganizationScopedBudgetPublic — One ceiling inside the organization, and the figures it enforces. The limit and the period are read through the budget rather than stored here, and carried on the wire so a page can render a ceiling without fetching every budget to resolve one id. Same reasoning as ``ScopedBudgetResponse``, whose shape this deliberately mirrors.
  - `budget_duration_sec` integer, nullable, required
  - `budget_id` string, required
  - `created_at` string, required
  - `current_requests` integer, required
  - `current_spend` number, required
  - `current_tokens` integer, required
  - `id` string, required
  - `manageable` boolean, required
  - `max_budget` number, nullable, required
  - `name` string, nullable, required
  - `period_end` string, nullable, required
  - `period_start` string, nullable, required
  - `provider_key_id` string, nullable, required
  - `request_limit` integer, nullable, required
  - `reserved_requests` integer, required
  - `reserved_spend` number, required
  - `reserved_tokens` integer, required
  - `reset_alignment` string, nullable, required
  - `scope_id` string, required
  - `scope_type` string, required
  - `token_limit` integer, nullable, required
  - `updated_at` string, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-02** `1be78e895028` — 6 info
  - added the required property `current_requests` to the response with the `201` status
  - added the required property `current_tokens` to the response with the `201` status
  - added the required property `request_limit` to the response with the `201` status
  - added the required property `reserved_requests` to the response with the `201` status
  - …2 more
- **2026-08-31** `1a5cf829e593` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/mozilla-ai/apis/otari/changes/v1/organizations/me/spend-ceilings/post.md)

---

[API](https://skmtc.dev/mozilla-ai/apis/otari.md) · [All operations](https://skmtc.dev/mozilla-ai/apis/otari/llms.txt) · [OpenAPI document](https://skmtc.dev/mozilla-ai/apis/otari/revisions/80c117c36f36?raw)
