Console · Published 2026-09-28 · Updated 2026-09-28 · AgentiSend
Agents
Pause every key, resume a fleet pause, decide a held send, and edit a budget. Resume and approvals need a signed-in person.
Agents is at /agents. Fleet is the default tab. Approvals is /agents?tab=approvals. Connect is /agents?tab=connect.
The fleet lists every key that can send, what it has spent, and whether it is paused. The list is GET /limits/keys.
curl -sS -X GET https://api.agentisend.com/limits/keys \
-H "Authorization: Bearer $AGENTISEND_API_KEY"200
{
"data": [],
"has_more": false,
"next_cursor": "example",
"object": "list"
}Pause and resume
The global kill switch is POST /limits/kill-all. The screen asks you to type pause all before it sends the call. A management key can pause the fleet. Keys already paused on their own keep that pause.
curl -sS -X POST https://api.agentisend.com/limits/kill-all \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'200
{
"affected_key_ids": [],
"at": "2026-09-04T09:14:00.000Z",
"paused": false,
"reason": "example"
}Resume all is POST /limits/resume-all. It lifts only the keys that fleet pause stopped. A key somebody killed on its own stays paused until that key is resumed. Resume all needs a signed-in person. An API key is refused:
{
"error": {
"code": "human_action_required",
"message": "This is a person’s decision, so an API key cannot make it.",
"fix": "Ask whoever runs this account to do it in the console. Scoping the key differently does not change the answer, and retrying fails the same way.",
"docs_url": "https://agentisend.com/docs/errors#human_action_required",
"retryable": false
}
}curl -sS -X POST https://api.agentisend.com/limits/resume-all \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'200
{
"affected_key_ids": [],
"at": "2026-09-04T09:14:00.000Z",
"paused": false,
"reason": "example"
}One key is POST /limits/keys/{id}/kill and POST /limits/keys/{id}/resume. Resume of one key is also a person's call. Kill of one key is not.
curl -sS -X POST https://api.agentisend.com/limits/keys/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/kill \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'200
{
"api_key_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"budget_per_period": -9007199254740991,
"consumed_in_period": -9007199254740991,
"consumed_in_window": -9007199254740991,
"paused": false,
"paused_at": "2026-09-04T09:14:00.000Z",
"paused_reason": "example",
"period": "hourly",
"period_started_at": "2026-09-04T09:14:00.000Z",
"rate_ceiling_per_minute": -9007199254740991,
"rate_window_started_at": "2026-09-04T09:14:00.000Z",
"updated_at": "2026-09-04T09:14:00.000Z"
}curl -sS -X POST https://api.agentisend.com/limits/keys/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/resume \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"200
{
"api_key_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"budget_per_period": -9007199254740991,
"consumed_in_period": -9007199254740991,
"consumed_in_window": -9007199254740991,
"paused": false,
"paused_at": "2026-09-04T09:14:00.000Z",
"paused_reason": "example",
"period": "hourly",
"period_started_at": "2026-09-04T09:14:00.000Z",
"rate_ceiling_per_minute": -9007199254740991,
"rate_window_started_at": "2026-09-04T09:14:00.000Z",
"updated_at": "2026-09-04T09:14:00.000Z"
}A send from a paused key is refused with:
{
"error": {
"code": "kill_switch_active",
"message": "This API key has been paused with the kill switch.",
"fix": "Read GET /trust/standing for why it was paused. Only a person signed in to the console can resume it; the paused key cannot resume itself.",
"docs_url": "https://agentisend.com/docs/errors#kill_switch_active",
"retryable": false
}
}That refusal's fix says to read standing. Standing does not name which key is paused. The row on this screen does, and Resume is here.
Budgets
Edit limits is PATCH /limits/keys/{id}: budget_per_period, period (hourly, daily or monthly) and rate_ceiling_per_minute. An API key may lower its own budget. Raising one is a person's decision, from this screen, and a key that tries is refused with human_action_required.
curl -sS -X PATCH https://api.agentisend.com/limits/keys/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42 \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"budget_per_period":500,"rate_ceiling_per_minute":20}'200
{
"api_key_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"budget_per_period": -9007199254740991,
"consumed_in_period": -9007199254740991,
"consumed_in_window": -9007199254740991,
"paused": false,
"paused_at": "2026-09-04T09:14:00.000Z",
"paused_reason": "example",
"period": "hourly",
"period_started_at": "2026-09-04T09:14:00.000Z",
"rate_ceiling_per_minute": -9007199254740991,
"rate_window_started_at": "2026-09-04T09:14:00.000Z",
"updated_at": "2026-09-04T09:14:00.000Z"
}Approvals
The inbox is GET /agent-actions. Approve is POST /agent-actions/{id}/approve. Reject is POST /agent-actions/{id}/reject, with an optional reason. Both decisions need a signed-in person. The key that asked cannot approve itself. A key that tries either call gets human_action_required.
curl -sS -X GET https://api.agentisend.com/agent-actions \
-H "Authorization: Bearer $AGENTISEND_API_KEY"200
{
"data": [],
"has_more": false,
"next_cursor": "example",
"object": "list"
}curl -sS -X POST https://api.agentisend.com/agent-actions/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/approve \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"200
{
"action": {
"created_at": "2026-09-04T09:14:00.000Z",
"decided_at": "2026-09-04T09:14:00.000Z",
"decided_by": "example",
"decision_reason": "example",
"expires_at": "2026-09-04T09:14:00.000Z",
"id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"kind": "example",
"payload": {},
"preview": {
"api_key_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"first_recipients": [],
"held_reason": "example",
"html": "example",
"subject": "example",
"text": "example",
"to_count": 0
},
"state": "pending"
},
"message_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"status": "example"
}curl -sS -X POST https://api.agentisend.com/agent-actions/9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42/reject \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{}'200
{
"created_at": "2026-09-04T09:14:00.000Z",
"decided_at": "2026-09-04T09:14:00.000Z",
"decided_by": "example",
"decision_reason": "example",
"expires_at": "2026-09-04T09:14:00.000Z",
"id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"kind": "example",
"payload": {},
"preview": {
"api_key_id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"first_recipients": [],
"held_reason": "example",
"html": "example",
"subject": "example",
"text": "example",
"to_count": 0
},
"state": "pending"
}The card shows the subject, how many recipients, the first three addresses, the HTML or the text, and a sentence for two guard reasons: near-identical sends to one recipient, and recipients collapsing toward a few addresses. A reason stored anywhere else on the held action is not written on the card. After a decision, "decided by" is the key the API recorded. A decision made in the console is recorded as the system key, so the name you see is that key's name, not the person's.
Limits of the buttons
The switch in the page header is hidden from a viewer. The Kill and Resume buttons on a row, Resume all on the banner, and Approve and Reject are not. A viewer can press them. The API then refuses:
{
"error": {
"code": "insufficient_role",
"message": "Your role on this account cannot make this change.",
"fix": "Ask an owner to make the change, or to raise your role with PATCH /team/members/:id.",
"docs_url": "https://agentisend.com/docs/errors#insufficient_role",
"retryable": false
}
}If Settings → Connection has a saved API key, the console sends that key on these calls. Resume all and Approve then fail with human_action_required, the same as any other key.