Everstack
API ReferenceAgentsHITL Approval Gate

HITL Approval Gate

POST/v1/agents/reviews/{reviewId}/submit
POST/v1/agents/reviews/{reviewId}/submit

Your instance endpoint, shown on the instance page in the dashboard. Each instance has its own host; there is no shared API host.

Parameters

NameInTypeRequiredDescription
reviewIdpathstringYes

Request Body

PropertyTypeRequiredDescription
tenantIdstringNo
action"APPROVAL_ACTION_UNSPECIFIED" | "APPROVAL_ACTION_APPROVE" | "APPROVAL_ACTION_DENY"NoApprovalAction is the action to take on a review.
decisionsobject[]No
reasonstringNo
resolvedBystringNo

Responses

200 Submit a review decision for a pending approval

PropertyTypeDescription
acceptedboolean
messagestring
reviewobjectApprovalReview represents a HITL approval review for tool calls. V1 is single-instance; multi-instance via Redis pub/sub is v2.

default An unexpected error response.

PropertyTypeDescription
codeinteger
messagestring
detailsobject[]

Request

curl -X POST "http://localhost:8089/v1/agents/reviews/{reviewId}/submit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tenantId":"string","action":"APPROVAL_ACTION_UNSPECIFIED","decisions":[{"toolCallId":"string","action":"APPROVAL_ACTION_UNSPECIFIED","reason":"string"}],"reason":"string","resolvedBy":"string"}'
const response = await fetch("http://localhost:8089/v1/agents/reviews/{reviewId}/submit", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
  "tenantId": "string",
  "action": "APPROVAL_ACTION_UNSPECIFIED",
  "decisions": [
    {
      "toolCallId": "string",
      "action": "APPROVAL_ACTION_UNSPECIFIED",
      "reason": "string"
    }
  ],
  "reason": "string",
  "resolvedBy": "string"
}),
});
const data = await response.json();
import requests

response = requests.post(
    "http://localhost:8089/v1/agents/reviews/{reviewId}/submit",
    headers={
        "Authorization": "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
    },
    json={
  "tenantId": "string",
  "action": "APPROVAL_ACTION_UNSPECIFIED",
  "decisions": [
    {
      "toolCallId": "string",
      "action": "APPROVAL_ACTION_UNSPECIFIED",
      "reason": "string"
    }
  ],
  "reason": "string",
  "resolvedBy": "string"
},
)
data = response.json()

Response

{
  "accepted": true,
  "message": "string",
  "review": {
    "id": "string",
    "sessionId": "string",
    "tenantId": "string",
    "agentId": "string",
    "turnNumber": 0,
    "iteration": 0,
    "status": "APPROVAL_REVIEW_STATUS_UNSPECIFIED",
    "toolCalls": [
      {
        "toolCallId": "string",
        "toolName": "string",
        "toolArgs": "string"
      }
    ],
    "decisions": [
      {
        "toolCallId": "string",
        "action": "APPROVAL_ACTION_UNSPECIFIED",
        "reason": "string"
      }
    ],
    "defaultAction": "string",
    "requestedAt": "2024-01-01T00:00:00Z",
    "expiresAt": "2024-01-01T00:00:00Z",
    "resolvedAt": "2024-01-01T00:00:00Z",
    "resolvedBy": "string",
    "resolutionReason": "string"
  }
}
{
  "code": 0,
  "message": "string",
  "details": [
    {
      "@type": "string"
    }
  ]
}