Control plane · Published 2026-09-04 · Updated 2026-10-12 · AgentiSend
Approvals
When a send waits for a person, how the queue behaves, and what an agent sees while it waits.
This page answers how a send waits for a person instead of failing. An approval is what a send does when something says a human should look first.
What lands in the queue
A send is held when the loop guard flags it (the 4th near-identical send to one recipient in 60 minutes, or 20 or more sends collapsing onto fewer than 3 recipients), or when an agent asks first with request_approval. Approval rules you define yourself are not available yet. The message is not sent, not dropped, and not lost — it is a row with the reason it stopped.
The agent's side
The API answers approval_required with the held action's id in action_id and a fix that says the send is waiting for a person, in the console under Agents → Approvals, rather than that it failed. This distinction matters more than it sounds: an agent that reads "failed" retries. A retry of the same request from the same key does not add a second entry — it answers with the same action_id — so an agent that retries cannot fill the queue with copies of one message.
List what is waiting with GET /agent-actions, using your own key or the console; a key scoped to sending cannot read the queue. A held action carries the key that made it, the reason it was held, and the message it would send.
The human's side
A person signed in to the console approves with POST /agent-actions/{id}/approve or rejects with POST /agent-actions/{id}/reject, which takes a reason. Both are written to the audit log. An API key is refused with human_action_required — including the key that asked. The console shows the same queue with the message body rendered, because approving something you cannot read is not review.
An approved action is released to the queue and sends normally. A rejected one never sends, and the agent sees the rejection with the reason.
A message that looks like another company's
A send whose sender name, sending domain, subject, body or sign-in link reads as another company's mail (PayPal from a domain PayPal does not own, say) is sent like any other, and a person at AgentiSend is told. If it turns out to be phishing, we act on the account afterwards, as the published thresholds describe. Nothing is held for this before it sends.
A message or broadcast held for this reason before 12 October 2026 still waits for a person at AgentiSend. The API answers staff_review_required if you try to send it again; it appears under Agents → Approvals (a broadcast as In review) with no Approve button. You can reject or cancel it, and you can write to hello@agentisend.com and name it if it is urgent.
Events
agent.approval_requested, agent.approved, agent.rejected and agent.killed are all on the event catalogue and all deliverable to a webhook endpoint, so an approval can page whoever is on call rather than waiting to be noticed.
A hold expires
A hold lasts 24 hours from the moment it is recorded. A send can name an earlier or later deadline with expires_at, up to 7 days ahead. When that time has passed, approving the hold does not send it: the API answers approval_expired and the hold is closed. Nothing sends because a deadline passed, and nothing sends because nobody looked. Send the message again if it should still go out.