---
title: "Approve HITL request"
method: POST
path: "/api/v1/hitl/queue/{id}/approve"
tags: ["HITL"]
---

# Approve HITL request

`POST /api/v1/hitl/queue/{id}/approve`

## Request

- Base URL: `https://agent.getaxonflow.com`
- URL: `https://agent.getaxonflow.com/api/v1/hitl/queue/{id}/approve`
- Auth: none declared. Required headers: `Authorization`
- TypeScript: <https://skmtc.dev/getaxonflow/apis/axonflow-agent-api/docs/api/v1/hitl/queue/:id/approve/post.ts> (a function with typed inputs; its response is checked against the schema)

Approve a pending request to allow AI execution

## Path parameters

- `id` string, uuid, required

## Headers

- `Authorization` string, required

## Request body

- HITLReviewInput: Body for approve/reject. Source of truth: `platform/agent/hitl/handler.go` (ReviewInput).
  - `reviewer_id` string
  - `reviewer_email` string
  - `reviewer_role` string
  - `comment` string

## Response `200`

Request approved

- object
  - `success` boolean
  - `data` object
    - `status` string

## Other responses

- `400`: Invalid request ID or JSON body
- `404`: Request not found
- `409`: Conflict - the request is not pending (already reviewed or expired). Also returned when the entry is a Workflow Control Plane step-gate MIRROR (`request_type: "wcp_step_gate"`). Those are resolved on the workflow plane - `POST /api/v1/workflows/{workflow_id}/steps/{step_id}/approve|reject` - and actioning one here would flip a status and release nothing, leaving the workflow paused. **This arm fires on a row that IS pending**, unlike the state conflict above; the response body names the route that works. Mirrors are excluded from this queue's default listing, so a client reaches this only by acting on an id obtained another way (#3408).

---

[API](https://skmtc.dev/getaxonflow/apis/axonflow-agent-api.md) - [All operations](https://skmtc.dev/getaxonflow/apis/axonflow-agent-api/llms.txt) - [OpenAPI document](https://skmtc.dev/getaxonflow/apis/axonflow-agent-api/revisions/34d30fcb7fa1?raw)
