---
title: "Update a spend limit"
method: PATCH
path: "/spend_limits/{product}"
tags: ["Spend Limits"]
---

# Update a spend limit

`PATCH /spend_limits/{product}`

Replaces the value of the existing limit for the product and period. Send exactly one of `amount` and `unlimited: true`. The period's spend is checked at once: raising the limit above the spend lifts the period's block (`evaluation.released`), and lowering it below the spend blocks the product (`evaluation.blocked_now`). Returns 404 when no limit is set; create it instead.

## Path parameters

- `product` string, required

## Query parameters

- `period` 'daily' | 'monthly' — `daily` is the current UTC day; `monthly` is the current UTC calendar month.

## Request body

- union — Send exactly one of `amount` and `unlimited: true`.
  - UpdateSpendLimitWithAmount — A new limit in USD.
    - `amount` number, required — Limit in USD. `0` blocks at the first cent of spend.
    - `unlimited` false — Optional; only `false` is allowed together with `amount`.
    - `reason` string — Why the limit is set or changed, kept for audit.
  - UpdateSpendLimitUnlimited — Explicitly no cap.
    - `unlimited` true, required — `true`: explicitly no cap.
    - `reason` string — Why the limit is set or changed, kept for audit.

## Response `200`

The limit was updated. `evaluation` says whether the change lifted or started a block.

- SpendLimitResponse
  - `data` SpendLimit, required — The spend limit, spend and block state of one product and period.
    - `record_type` string, required — Identifies the type of the resource.
    - `product` string, required — Product the entry applies to.
    - `product_name` string, required — Display name of the product.
    - `period` 'daily' | 'monthly', required — `daily` is the current UTC day; `monthly` is the current UTC calendar month.
    - `period_start` string, date, required — First UTC day of the current period.
    - `period_end` string, date, required — Exclusive end of the current period, a UTC date.
    - `limit` SpendLimitLimit, nullable, required — The limit set on the account for the product and period, whoever set it. `null` when none is set.
      - `amount` string, nullable, required — Limit in USD, as a decimal string. `null` when `unlimited` is true.
      - `unlimited` boolean, required — True when the limit was set to explicitly no cap.
      - `origin` 'self_service' | 'operator', required — `self_service` when a user of the account set it, `operator` when Telnyx support did.
      - `updated_at` string, date-time, required — When the limit was last set or changed.
    - `effective_limit_usd` string, nullable, required — The limit in USD that is enforced, as a decimal string. `null` means unlimited.
    - `spend_usd` string, nullable, required — Spend in USD so far in the period, as a decimal string. It can lag actual usage by about a minute. `null` when it could not be read.
    - `spend_error` string, nullable, required — Set when `spend_usd` is `null`.
    - `blocked` boolean, required — The product is blocked for this period. Always `false` in write responses; list the limits to read the block state.
    - `block` SpendLimitBlock, nullable, required — The active block of the period. `null` when the period is not blocked.
      - `detected_at` string, date-time, required — When the block started.
      - `spend_usd` string, required — Spend in USD when the block started, as a decimal string.
      - `limit_usd` string, required — The limit in USD that the spend went above, as a decimal string.
      - `blocked_until` string, date, required — Exclusive end of the block: it is lifted at 00:00 UTC on this date at the latest.
    - `evaluation` SpendLimitEvaluation — What a create, update or delete did to the period at once. Only present in write responses.
      - `spend_usd` string, nullable, required — Spend in USD used for the check, as a decimal string. `null` when the spend was not checked.
      - `released` boolean, required — The change lifted a block of this period.
      - `blocked_now` boolean, required — The change blocked the product: the spend was already above the new limit.
      - `still_over_limit` boolean, required — A block of this period remains because the spend is still above the new limit.
      - `still_blocked_other_period` boolean, required — The other period has an active block, so the product stays blocked whatever this period's result.
      - `evaluation_deferred` boolean, required — The spend could not be checked now. The change is saved and applied within a few minutes.
      - `note` string — Additional information about the result, when there is any.

## Other responses

- `400` — Bad request. The product does not support self-service spend limits, the period is invalid or not available, not exactly one of `amount` and `unlimited` was sent, `amount` is negative, `reason` is longer than 500 characters, or the body has a field that is not listed.
- `401` — Unauthorized. The request did not carry valid Telnyx API credentials.
- `403` — Forbidden. The caller's access policy does not allow this spend limits action.
- `404` — Not found. No spend limit is set for the product and period.

## Changes

> 103 revisions in range; 1 not diffed.

- **2026-09-28** `eaa228e7593e` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/changes/spend_limits/:product/patch.md)

---

[API](https://skmtc.dev/team-telnyx/apis/telnyx-api-2.md) · [All operations](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/llms.txt) · [OpenAPI document](https://skmtc.dev/team-telnyx/apis/telnyx-api-2/revisions/9825f59521a0?raw)
