---
title: "Create Budget"
method: POST
path: "/v1/budgets"
tags: ["budgets"]
---

# Create Budget

`POST /v1/budgets`

Create a new budget.

## Request body

- CreateBudgetRequest — Request model for creating a new budget.
  - `budget_duration_sec` integer, nullable — Budget duration in seconds (e.g., 86400 for daily, 604800 for weekly)
  - `max_budget` number, nullable — Maximum spending limit
  - `name` string, nullable — Admin-facing label for the budget
  - `reset_alignment` 'calendar_day' | 'calendar_week' | 'calendar_month', nullable — Reset on a UTC calendar boundary instead of a fixed number of seconds, which is the only way to express a calendar month. Mutually exclusive with budget_duration_sec

## Response `200`

Successful Response

- BudgetResponse — Response model for budget information. ``max_budget`` is the per-user spending limit, and multiple users can share one budget, so the usage rollup is an aggregate over the users assigned to this budget: how many there are and their combined ``spend`` / ``reserved``. Assigning users to a budget is done through the users API (dashboard support lands with user management), so a fresh gateway reports zeros here.
  - `budget_duration_sec` integer, nullable, required
  - `budget_id` string, required
  - `created_at` string, required
  - `max_budget` number, nullable, required
  - `name` string, nullable, required
  - `reset_alignment` string, nullable, required
  - `total_reserved` number
  - `total_spend` number
  - `updated_at` string, required
  - `user_count` integer

## Other responses

- `422` — Validation Error

## Changes

- **2026-08-24** `961e73dbaf8b` — 1 warning
  - the `max_budget/anyOf[subschema #1]/` request property's max was set to `999999999999.00`
- **2026-08-21** `e0dee1efa501` — 1 warning, 2 info
  - the `max_budget/anyOf[subschema #1]/` request property's max was set to `999999999999.00`
  - added the new optional request property `reset_alignment`
  - added the required property `reset_alignment` to the response with the `200` status
- **2026-08-21** `2f89238cc674` — 1 breaking, 1 warning
  - removed the required property `reset_alignment` from the response with the `200` status
  - removed the request property `reset_alignment`
- **2026-08-21** `875cef5dd6a8` — 1 warning, 2 info
  - the `max_budget/anyOf[subschema #1]/` request property's max was set to `999999999999.00`
  - added the new optional request property `reset_alignment`
  - added the required property `reset_alignment` to the response with the `200` status
- **2026-07-21** `d7a89e7ed4d3` — 5 info
  - added the new optional request property `name`
  - added the optional property `total_reserved` to the response with the `200` status
  - added the optional property `total_spend` to the response with the `200` status
  - added the optional property `user_count` to the response with the `200` status
  - …1 more

[Full history](https://skmtc.dev/mozilla-ai/apis/otari/changes/v1/budgets/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-service-production.skmtc.workers.dev/v1/apis/mozilla-ai/otari/revisions/eae05f7dd3cd/schema)
