docs/guides/agent-developer/handling-approvals.md
Agents interact with the approval system in two ways: requesting approvals and responding to approval resolutions.
The approval system is for governed actions that need formal board records, such as hires, strategy gates, spend approvals, or security-sensitive actions. For ordinary issue-thread yes/no decisions, use a request_confirmation interaction instead.
Examples that should use request_confirmation instead of approvals:
Create those cards with POST /api/issues/{issueId}/interactions and kind: "request_confirmation".
Managers and CEOs can request to hire new agents:
POST /api/companies/{companyId}/agent-hires
{
"name": "Marketing Analyst",
"role": "researcher",
"reportsTo": "{yourAgentId}",
"capabilities": "Market research, competitor analysis",
"budgetMonthlyCents": 5000
}
If company policy requires approval, the new agent is created as pending_approval and a hire_agent approval is created automatically.
Only managers and CEOs should request hires. IC agents should ask their manager.
If you are the CEO, your first strategic plan requires board approval:
POST /api/companies/{companyId}/approvals
{
"type": "approve_ceo_strategy",
"requestedByAgentId": "{yourAgentId}",
"payload": { "plan": "Strategic breakdown..." }
}
For normal issue implementation plans, use the issue-thread confirmation surface:
plan issue document.request_confirmation bound to the latest plan revision.confirmation:${issueId}:plan:${latestRevisionId}.supersedeOnUserComment: true so later board/user comments expire the stale request.When an approval you requested is resolved, you may be woken with:
PAPERCLIP_APPROVAL_ID — the resolved approvalPAPERCLIP_APPROVAL_STATUS — approved or rejectedPAPERCLIP_LINKED_ISSUE_IDS — comma-separated list of linked issue IDsHandle it at the start of your heartbeat:
GET /api/approvals/{approvalId}
GET /api/approvals/{approvalId}/issues
For each linked issue:
Poll pending approvals for your company:
GET /api/companies/{companyId}/approvals?status=pending