---
title: "Approve or deny one Budget limit increase request"
method: POST
path: "/budgets/limit-increase-requests/{requestId}/reviews"
tags: ["Approval requests"]
---

# Approve or deny one Budget limit increase request

`POST /budgets/limit-increase-requests/{requestId}/reviews`

## Request

- Base URL: `https://api.replit.com/v1`
- URL: `https://api.replit.com/v1/budgets/limit-increase-requests/{requestId}/reviews`
- Auth: HTTP bearer

Approves or denies one pending Budget limit increase request. A successful approval also applies the Budget limit change.

The API key's creator must retain Budget-management access for the target
Workspace; `write:budgets` alone is insufficient. The approved `amountUsd`
is the final limit, not an increment, and must exceed the current limit.
An amount at or below the current limit returns 409 (`conflict`).

For a `workspace_group_limit` request, approval increases the shared limit
of the group identified by `groupId`, not the requester's individual limit.
Other applicable usage limits remain in effect.

Send the list item's `reviewEtag` or the detail response's strong ETag
unchanged in `If-Match`. A new event on the request makes an earlier review token stale; changes to
the requester's profile, Workspace details, or group name alone do not.
A missing header returns 428 (`precondition_required`); a malformed or weak
value returns 400 (`invalid_request`); a stale version returns 412
(`precondition_failed`); and a current tag on a request that is no longer
pending returns 409 (`request_already_resolved`). A concurrent budget
update can instead return 409 (`budget_update_in_progress`) with
`Retry-After: 1`.

A successful review returns 200 with the updated request, its public
history, a new `ETag`, and `Cache-Control: no-store, no-transform`.
Both `requester` and `workspace` are always null in review responses.
Group requests retain `groupId`, but `group` is also null, even when the
key also has `read:*`. The ETag can differ from a subsequent
detail GET's ETag at the same request version. Either token can be used
for a review; use the detail GET's ETag for conditional detail reads.
This operation returns the updated request, not a separate review resource.

A read made immediately after a review can briefly return the request's
previous state. If the response is lost, wait briefly and read the request
again. If it is resolved, do not retry; if
still pending, retry only if the decision is still intended and use the
latest read's ETag.

## Path parameters

- `requestId` string, uuid, required

## Headers

- `If-Match` string, required

## Request body

- union: The review outcome and, for approvals, the final approved limit.
  - object
    - `outcome` 'approved', required
    - `amountUsd` number, required: Final approved limit in USD. Must exceed the current limit and may differ from the requested amount.
  - object
    - `outcome` 'denied', required
    - `reason` string: Public denial reason shown to the requester. Must not contain NUL characters.

## Response `200`

The updated request with requester and workspace set to null (and group set to null for group requests), its public history, and its new ETag.

- BudgetLimitIncreaseRequestResponse
  - `data` object, required
    - `id` string, uuid, required: Stable identifier for this request.
    - `type` 'workspace_default_user_limit' | 'workspace_user_limit' | 'workspace_group_limit', required: Budget limit targeted by the request. workspace_user_limit raises the requester's own member limit. workspace_default_user_limit raises the workspace default member limit. workspace_group_limit raises the shared aggregate limit of the group identified by groupId, not the requester's individual limit.
    - `status` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required: Current lifecycle status of the request.
    - `workspaceId` string, required: Workspace whose Budget limit the request targets.
    - `workspace` ProjectWorkspace, required
      - `id` string, required
      - `name` string, required
      - `slug` string, required
    - `requesterUserId` string, required: Account user on whose behalf the request was created.
    - `requester` ApprovalRequester, required
      - `id` string, required
      - `username` string, required
      - `email` string, email, required
      - `firstName` string, nullable, required
      - `lastName` string, nullable, required
    - `limitAtRequestUsd` number, required: Budget limit that was in effect when the request was created.
    - `groupId` string: Stable group identifier captured when a workspace_group_limit request is created. Present only for group requests; does not change when the group is renamed or deleted.
    - `group` object, nullable: Current group identity for workspace_group_limit requests. Present only for group requests. Null if the group was deleted or no longer belongs to this Workspace, and always null on review responses even when the key has read scope.
      - `id` string, required
      - `name` string, required
    - `currentLimitUsd` number, nullable, required: Budget limit currently in effect for the request target. Null when the target no longer has a Budget limit or is no longer available.
    - `requestedAmountUsd` number, nullable, required: Limit the requester asked for. Null when the requester did not name an amount.
    - `approvedLimitUsd` number, nullable, required: Limit the reviewer approved. Null until the request is approved.
    - `appliedLimitUsd` number, nullable, required: Limit applied by fulfillment. Null until fulfillment; equals the approved limit once fulfilled.
    - `version` integer, required: Increments with every recorded event. Use the ETag header, not this field, for conditional requests.
    - `createdAt` string, date-time, required
    - `updatedAt` string, date-time, required
    - `events` BudgetLimitIncreaseRequestEvent[], required: Ordered public history, ascending by sequence.
      - `sequence` integer, required: Position in the request history. Sequence 1 is the creation event.
      - `eventType` 'request_started' | 'request_approved' | 'request_denied' | 'request_canceled' | 'request_fulfillment_started' | 'request_fulfilled' | 'request_fulfillment_failed', required
      - `fromStatus` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required: Current lifecycle status of the request.
      - `toStatus` 'pending' | 'approved' | 'fulfillment_started' | 'fulfilled' | 'fulfillment_failed' | 'denied' | 'canceled', required: Current lifecycle status of the request.
      - `actor` union, required: Who performed the action recorded by this event.
        - object
          - `type` 'user', required
          - `userId` string, required
        - object
          - `type` 'api_key', required
          - `apiKeyId` string, uuid, required
        - object
          - `type` 'system', required
          - `systemId` string, required
      - `publicNote` string, nullable, required: Public note recorded with the event, such as a denial reason.
      - `occurredAt` string, date-time, required: When the event was recorded.

## Other responses

- `400`: The request parameters are invalid.
- `401`: The API key is missing, malformed, unknown, revoked, or expired.
- `403`: The API key lacks the required scope or Account entitlement.
- `404`: The requested resource does not exist or is not visible to this key.
- `409`: The request cannot accept the decision, or a required update is in progress.
- `412`: The If-Match precondition failed for the current request. Reload the request and retry.
- `428`: The request requires an If-Match header with the strong ETag from the latest read.
- `429`: The API key or operation exceeded its rate limit.
- `500`: The server encountered an unexpected error.
- `503`: A required API dependency is temporarily unavailable.

## Changes

- **2026-09-29** `9f669d8cb57d`: 1 warning, 2 info
  - added the new `workspace_group_limit` enum value to the `data/allOf[#/components/schemas/budget-limit-increase-request]/type` response property for the response status `200`
  - added the optional property `data/allOf[#/components/schemas/budget-limit-increase-request]/group` to the response with the `200` status
  - added the optional property `data/allOf[#/components/schemas/budget-limit-increase-request]/groupId` to the response with the `200` status
- **2026-09-19** `ba193431df44`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/replit/apis/replit-api/changes/budgets/limit-increase-requests/:requestId/reviews/post.md)

---

[API](https://skmtc.dev/replit/apis/replit-api.md) - [All operations](https://skmtc.dev/replit/apis/replit-api/llms.txt) - [OpenAPI document](https://skmtc.dev/replit/apis/replit-api/revisions/03b316f7e71a?raw)
