Skip to content

Approval Workflows

Not every AI agent action should execute autonomously. For sensitive operations — accessing production data, executing financial transactions, modifying infrastructure — VeraID provides human-in-the-loop approval workflows that pause agent execution until a designated reviewer approves or rejects the request. This gives your organization the speed of automation with the judgment of human oversight where it matters.

When to Use Approvals

Approval workflows are designed for operations where the cost of an error is high and the latency of human review is acceptable. Common use cases include:

  • Production data access — Agents requesting access to customer PII, financial records, or regulated data
  • High-cost operations — LLM calls exceeding a cost threshold or agents approaching budget limits
  • Infrastructure changes — Agents that modify cloud resources, DNS records, or security configurations
  • External communications — Agents sending emails, Slack messages, or API calls to third-party services on behalf of the organization
  • Flagged prompts — Prompts that scored above the review threshold in prompt injection detection but below the block threshold

Multi-Stage Approval

VeraID supports multi-stage approval pipelines where a request must be approved by multiple reviewers, optionally in sequence or in parallel.

Sequential Approval

Stages are evaluated in order. The request advances to the next stage only after the current stage is approved.

{
"approvalWorkflow": {
"stages": [
{
"name": "Team Lead Review",
"approvers": ["user:alice@example.com", "group:team-leads"],
"requiredApprovals": 1,
"slaMinutes": 30
},
{
"name": "Security Review",
"approvers": ["group:security-team"],
"requiredApprovals": 2,
"slaMinutes": 60
}
],
"mode": "sequential"
}
}

Parallel Approval

All stages are evaluated simultaneously. The request is approved when every stage has received its required number of approvals.

{
"approvalWorkflow": {
"stages": [
{
"name": "Engineering Approval",
"approvers": ["group:engineering-leads"],
"requiredApprovals": 1,
"slaMinutes": 30
},
{
"name": "Compliance Approval",
"approvers": ["group:compliance-team"],
"requiredApprovals": 1,
"slaMinutes": 60
}
],
"mode": "parallel"
}
}

SLA Tracking

Every approval stage has a configurable SLA (Service Level Agreement) defined in minutes. VeraID tracks the elapsed time from when the approval request was created and takes action when the SLA is breached.

SLA StatusDescription
Within SLAThe stage has not yet exceeded its configured slaMinutes
SLA WarningThe stage is within 20% of its SLA deadline (e.g., 24 minutes into a 30-minute SLA)
SLA BreachedThe stage has exceeded its slaMinutes without a decision

When an SLA is breached, VeraID triggers the configured escalation rules.


Escalation Rules

Escalation rules define what happens when an approver does not respond within the SLA window.

Escalation Strategies

StrategyBehavior
escalateRoute the request to a higher-tier approver group
auto-approveAutomatically approve the request after the SLA expires
auto-rejectAutomatically reject the request after the SLA expires
notifySend additional notifications but take no automated action
{
"approvalWorkflow": {
"stages": [
{
"name": "Team Lead Review",
"approvers": ["group:team-leads"],
"requiredApprovals": 1,
"slaMinutes": 30,
"escalation": {
"strategy": "escalate",
"escalateTo": ["group:engineering-directors"],
"escalationSlaMinutes": 60,
"finalAction": "auto-reject"
}
}
]
}
}

In this configuration:

  1. Team leads have 30 minutes to respond
  2. If no response, the request escalates to engineering directors
  3. Directors have 60 minutes to respond
  4. If still no response, the request is automatically rejected

Agent Status Lifecycle

AI agent identities have an extended status lifecycle that integrates with approval workflows.

┌──────────┐ approval ┌──────────┐
│ │ required │ │
│ ACTIVE │───────────────────►│ APPROVED │
│ │◄───────────────────│ │
│ │ approval │ │
│ │ granted │ │
└────┬─────┘ └──────────┘
│ suspend / policy violation
┌──────────┐ revoke ┌────────────┐
│SUSPENDED │───────────────────►│ TERMINATED │
│ │ │ │
└──────────┘ └────────────┘
StatusDescription
ACTIVEAgent is operational and can execute actions within its policies
APPROVEDAgent has received approval for a specific pending operation and can execute it
SUSPENDEDAgent is temporarily disabled due to policy violation, budget breach, or manual action
TERMINATEDAgent is permanently decommissioned. All credentials are revoked and the agent cannot be reactivated

Status Transitions

  • ACTIVE to APPROVED — An approval request is granted, and the agent proceeds with the approved operation
  • APPROVED to ACTIVE — The approved operation completes or expires, and the agent returns to normal operation
  • ACTIVE to SUSPENDED — An administrator suspends the agent, a policy violation is detected, or a budget limit is exceeded with block action
  • SUSPENDED to ACTIVE — An administrator reactivates the agent after investigation
  • SUSPENDED to TERMINATED — An administrator permanently decommissions the agent
  • ACTIVE to TERMINATED — An administrator directly terminates an active agent

Configuring Approval Requirements

Enable approval workflows by setting requireApproval in the agent’s monitoring configuration.

Global Approval

Require approval for all operations performed by this agent:

{
"agentConfig": {
"monitoring": {
"logAllRequests": true,
"logResponses": true,
"requireApproval": true
}
}
}

Conditional Approval

Require approval only for operations that match specific conditions:

{
"agentConfig": {
"monitoring": {
"logAllRequests": true,
"logResponses": true,
"requireApproval": false
},
"approvalRules": [
{
"condition": "cost > 5.00",
"description": "Require approval for LLM calls estimated above $5"
},
{
"condition": "dataAccess in ['customer-pii', 'financial-records']",
"description": "Require approval for sensitive data access"
},
{
"condition": "promptRiskScore > 0.4",
"description": "Require approval for flagged prompts"
},
{
"condition": "operation == 'function-calling' && tool in ['send-email', 'modify-infrastructure']",
"description": "Require approval for sensitive tool calls"
}
]
}
}

Approval Request API

Submit an Approval Request

Terminal window
curl -X POST https://app.veraid.io/api/v1/approvals \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"agentId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b",
"operation": "function-calling",
"tool": "send-email",
"context": {
"recipient": "customer@example.com",
"subject": "Account Update Notification",
"estimatedCost": 0.02
},
"urgency": "normal"
}'

Approve or Reject

Terminal window
# Approve
curl -X POST https://app.veraid.io/api/v1/approvals/{approvalId}/approve \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"justification": "Verified recipient and content are appropriate"
}'
# Reject
curl -X POST https://app.veraid.io/api/v1/approvals/{approvalId}/reject \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "Recipient not in approved contact list"
}'

Check Approval Status

Terminal window
curl https://app.veraid.io/api/v1/approvals/{approvalId} \
-H "Authorization: Bearer $API_KEY"
{
"id": "apr_1a2b3c4d-5e6f-7a8b-9c0d-e1f2a3b4c5d6",
"agentId": "idt_9c3a8b7e-4f21-4d6a-b8e1-a2c5d9f07e3b",
"status": "pending",
"operation": "function-calling",
"stages": [
{
"name": "Team Lead Review",
"status": "pending",
"slaMinutes": 30,
"elapsedMinutes": 12,
"approvers": ["user:alice@example.com"],
"decisions": []
}
],
"createdAt": "2026-03-19T14:30:00Z",
"expiresAt": "2026-03-19T15:30:00Z"
}

What’s Next