Create review

Runs the scheduled review of repeated failures, missing expertise, and human review effort across the organization's runs, briefs, and observed coverage gaps, producing role candidate proposals with concrete examples, a micro-USD cost estimate, and a reporting line.

POST /v1/agent/proposals/review

Addresshttps://api.hanzo.ai/v1/agent/proposals/review
MethodPOST
Operationpost_agent_proposals_review
AuthAuthorization: Bearer $HANZO_API_KEY

Runs the scheduled review of repeated failures, missing expertise, and human review effort across the organization's runs, briefs, and observed coverage gaps, producing role candidate proposals with concrete examples, a micro-USD cost estimate, and a reporting line.

Request

12 fields, body application/json (required).

FieldInTypeRequiredDescription
failureThresholdbodyinteger (int64)—FailureThreshold is the minimum number of failed runs on an agent or function that triggers a role proposal; defaults to 2.
observedGapsbodyagent.RoleGapInput[]—ObservedGaps are explicit coverage gaps, unsupported-claim clusters, or review-effort spikes to evaluate alongside stored run history.
observedGaps[].estimatedMicroUsdbodyinteger (int64)—EstimatedMicroUSD is the estimated period cost for the proposed role in integer micro-USD.
observedGaps[].examplesbodystring[]—Examples lists concrete run IDs, unsupported claims, or reviewer corrections demonstrating the gap.
observedGaps[].failureCountbodyinteger (int64)—FailureCount is how many repeated failures were observed in this area.
observedGaps[].functionbodystring—Function is the studio function where the coverage gap or failure occurred (e.g. "regulatory-clinical").
observedGaps[].reportingLinebodystring—ReportingLine names the manager agent handle the proposed role will report to; defaults to "venture-lead".
observedGaps[].reviewSecondsbodyinteger (int64)—ReviewSeconds is the human domain-review effort recorded on this gap in seconds.
observedGaps[].roleNamebodystring—RoleName is the suggested agent handle for the proposed specialist role; generated from Function and Topic when omitted.
observedGaps[].titlebodystring—Title is the human-readable title for the proposed role.
observedGaps[].topicbodystring—Topic describes the missing expertise or recurring failure domain (e.g. "laboratory-lims-telemetry-integration").
venturebodystring—Venture optionally scopes the nightly review to a specific venture slug.

Response

StatusBodyMeaning
200agent.reviewProposalsOutok
defaultproblem-detailsrefused

200 body — 22 fields.

FieldInTypeAlwaysDescription
createdbodyinteger (int64)—Created is how many new role proposals were generated during this review pass.
proposalsbodyagent.RoleProposal[]—Proposals are the active role candidate proposals resulting from the review.
proposals[].agentIdbodystring—AgentID is the created agent's handle (agent_...) once the proposal has been approved; empty when pending or rejected.
proposals[].cap_micro_usdbodyinteger (int64)—CapMicroUSD is the period budget cap in integer micro-USD that will be set on the created agent.
proposals[].createdAtbodyinteger (int64)—CreatedAt is when the proposal was generated, as Unix seconds.
proposals[].decidedAtbodyinteger (int64)—DecidedAt is when the proposal was approved or rejected, as Unix seconds.
proposals[].decidedBybodystring—DecidedBy records the subject who approved or rejected the proposal.
proposals[].decisionReasonbodystring—DecisionReason records the operator's note when approving or rejecting.
proposals[].estimatedMicroUsdbodyinteger (int64)—EstimatedMicroUSD is the estimated monthly spend for this role in integer micro-USD.
proposals[].examplesbodystring[]—Examples are the concrete failed runs, unsupported claims, or review bottlenecks backing the proposal.
proposals[].functionbodystring—Function is the studio function this role candidate belongs to.
proposals[].idbodystring—ID is the stable proposal identifier (prop_...).
proposals[].instructionsbodystring—Instructions is the system prompt that will govern the proposed role.
proposals[].max_task_micro_usdbodyinteger (int64)—MaxTaskMicroUSD is the single-run budget ceiling in integer micro-USD that will be set on the created agent.
proposals[].namebodystring—Name is the org-unique agent handle that will be created if the proposal is approved.
proposals[].periodbodystring—Period is the budget reset window: day, week, or month.
proposals[].rationalebodystring—Rationale explains why the nightly review proposed this role candidate.
proposals[].reportingLinebodystring—ReportingLine is the manager agent handle (parent) the proposed role reports to.
proposals[].statusbodystring—Status is the proposal's decision state: pending, approved, or rejected.
proposals[].titlebodystring—Title is the human-readable title of the proposed role.
proposals[].toolsbodystring[]—Tools are the MCP tool names the proposed role will be granted.
proposals[].venturebodystring—Venture is the venture slug the role candidate is proposed for.

Failure carries the platform error shape — see Errors.

Examples

hanzo agent proposals review
import { Configuration, AgentApi } from 'hanzoai';

const api = new AgentApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.postAgentProposalsReview({ failureThreshold: 0, observedGaps: [{"estimatedMicroUsd":0,"examples":["<examples>"],"failureCount":0,"function":"<function>"}] });
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import AgentApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = AgentApi(client).post_agent_proposals_review(failure_threshold=0, observed_gaps=[{"estimatedMicroUsd":0,"examples":["<examples>"],"failureCount":0,"function":"<function>"}])
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.AgentAPI.PostAgentProposalsReview(context.Background()).Execute()
if err != nil {
	return err
}
use hanzo_client::apis::{configuration::Configuration, agent_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = agent_api::post_agent_proposals_review(&cfg, Default::default()).await?;
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.AgentApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new AgentApi(client).postAgentProposalsReview();

The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →

curl -X POST https://api.hanzo.ai/v1/agent/proposals/review \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "failureThreshold": 0,
       "observedGaps": [
         {
           "estimatedMicroUsd": 0,
           "examples": [
             "<examples>"
           ],
           "failureCount": 0,
           "function": "<function>"
         }
       ]
     }'

MCP reaches agent through the agent tool, which names its 51 operations with its own verbs — this one among them, under a name only MCP declares. describe explains any of them:

curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "describe",
         "arguments": {
           "op": "list_agents"
         }
       }
     }'

Agent API · All Hanzo APIs · Interactive reference

Was this page useful?
Broken link or missing step? Drop it in #docs on Discord or open a PR.