---
title: "Approve an approval"
description: "Approve one approval card the run opened, and start the follow-up run that renders it.\n\nA run started from a skill or a workflow writes no thread, so there is no card in roasOS for you to press. This is the door that releases that work.\n\nIt spends on this API key: an `Idempotency-Key` is required, the amount is bounded by the key's per-request ceiling and by its daily and monthly budgets, and `max_credits` / `generation_spend_cap_credits` bound the follow-up run the same way they bound the first one.\n\nThe follow-up run's text is composed by roasOS from the approved card, never by the caller, and the run id comes back as `follow_up_run_id`.\n\nOn a batch card, send `drop` with the `index` of each item in `pending_approvals[].items` that must not run. The dropped items do not run and cost nothing, and the per-request ceiling is checked against the kept items only. The list must leave at least one item; to refuse the whole card, decline it.\n\nThis operation is deliberately absent from the MCP tool list. A connected model may decline; it must never approve its own spend."
url: https://docs.roasos.com/api-reference/agent/approveAgentRunGate
---

# Approve an approval

Approve one approval card the run opened, and start the follow-up run that renders it.

A run started from a skill or a workflow writes no thread, so there is no card in roasOS for you to press. This is the door that releases that work.

It spends on this API key: an `Idempotency-Key` is required, the amount is bounded by the key's per-request ceiling and by its daily and monthly budgets, and `max_credits` / `generation_spend_cap_credits` bound the follow-up run the same way they bound the first one.

The follow-up run's text is composed by roasOS from the approved card, never by the caller, and the run id comes back as `follow_up_run_id`.

On a batch card, send `drop` with the `index` of each item in `pending_approvals[].items` that must not run. The dropped items do not run and cost nothing, and the per-request ceiling is checked against the kept items only. The list must leave at least one item; to refuse the whole card, decline it.

This operation is deliberately absent from the MCP tool list. A connected model may decline; it must never approve its own spend.

## `POST /v1/agent-runs/{id}/gates/{gate_id}/approve`

Endpoint: `POST https://api.roasos.com/v1/agent-runs/{id}/gates/{gate_id}/approve`

Approve an approval

Approve one approval card the run opened, and start the follow-up run that renders it.

A run started from a skill or a workflow writes no thread, so there is no card in roasOS for you to press. This is the door that releases that work.

It spends on this API key: an `Idempotency-Key` is required, the amount is bounded by the key's per-request ceiling and by its daily and monthly budgets, and `max_credits` / `generation_spend_cap_credits` bound the follow-up run the same way they bound the first one.

The follow-up run's text is composed by roasOS from the approved card, never by the caller, and the run id comes back as `follow_up_run_id`.

On a batch card, send `drop` with the `index` of each item in `pending_approvals[].items` that must not run. The dropped items do not run and cost nothing, and the per-request ceiling is checked against the kept items only. The list must leave at least one item; to refuse the whole card, decline it.

This operation is deliberately absent from the MCP tool list. A connected model may decline; it must never approve its own spend.

### Parameters

- `id` (path) — required
- `gate_id` (path) — required
- `undefined`
- `undefined`
- `undefined`

### Request body

Content type: `application/json`

### Responses

- `200`: The approval is recorded, or was already decided
- `400`: The run ID or gate ID is not a UUID, a missing Idempotency-Key, spend_cap_exceeds_policy, or gate_drop_invalid: `drop` names an item the card does not carry, or all of them
- `402`: insufficient_credits
- `403`: request_credit_limit_exceeded: the approved amount is above this key's per-request ceiling
- `404`: agent_run_not_found or agent_gate_not_found: the run or the approval card is not in this workspace
- `409`: The idempotency key was reused with different request data, or agent_gate_not_approvable: the card is a question, not a render
- `429`: rate_limit_exceeded, or a daily or monthly credit budget
- `503`: The decision could not be recorded

Read the full reference at https://docs.roasos.com/api-reference/agent/approveAgentRunGate.
