approval_expired (410)
What you’ll see
When the agent polls GET /v1/approvals/:id:
{
"approval_id": "01HKZ7...",
"status": "expired",
"result": null,
"execution_error": null,
"expires_at": "2026-05-18T10:40:55Z",
"executed_at": null,
"created_at": "2026-05-17T10:40:55Z"
}Or, when a delegate or owner clicks an old approval magic link:
{ "error": "approval_expired", "correlation_id": "..." }with HTTP status 410.
Why
Every pending approval has a hard 10-minute expiry. If the owner doesn’t
decide within that window, /v1/approve refuses the decision with 410,
a background sweep moves the row to status = 'expired', and the
agent’s poll sees expired from that point forward.
Ten minutes is deliberate, and short on purpose: an approval is a human confirming this specific action, right now. The longer it sits, the more likely the context that justified it has moved on — the file has changed, the incident is over, the customer already replied. An approval you grant from yesterday’s notification is not really informed consent. If you need longer to decide, the answer is to deny and have the agent re-request when you’re ready, not to hold the action open.
The window is not configurable today.
Fix
Approvals are not retryable in place. Either:
-
The agent re-issues the request. This creates a fresh approval with a new 10-minute window. The agent should explain to the user why it’s asking again (“The previous approval expired. Re-requesting to send the email — please approve.”).
-
You enable push notifications. Most expiries are because the owner missed the notification. Settings → Push Notifications, then enrol a passkey on your phone so the approval lands one-tap. See Push notifications setup.
-
You add approval delegates. If the primary owner is unavailable, delegates configured in Settings → Approval Delegates receive magic- link emails for every approval. Any delegate can decide. See Delegate approvals.
Why not auto-retry?
Approval expiry is a real signal — the human review window passed without a decision. Auto-retrying would undermine the human-in-the-loop guarantee that’s the whole point of an approval queue. The agent should treat expiry as a “I should re-evaluate whether this is still the right action” moment, not as transient failure.