Skip to main content
An agent operating Reply.io can send real messages to real prospects. A successful call executes immediately — there is no undo. These rules apply across all four access layers.

What counts as high-stakes

Confirm with the user before any action that:
  • Sends to a prospect — inbox replies, approving Jason drafts, one-off outreach actions
  • Starts outreach — starting a sequence, enrolling contacts into a sequence
  • Changes ownership or reach — reassigning contacts, blacklisting an email or a whole domain
  • Removes work irreversibly — rejecting a Jason draft (this also removes the contact from the sequence), deleting contacts or lists
  • Removes supervision — switching Jason from Review to Autonomous mode
Configuration changes (assigning mailboxes, schedules, attaching offers/playbooks) are production-affecting but not prospect-visible — usually worth confirming too.

How each surface enforces it

A timed-out send may already have succeeded server-side — on any surface. Verify with a read before retrying anything that reaches a prospect.

Scoped keys bound the blast radius

API keys support granular domain:verb scopes (contacts:read, sequences:operate, inbox:write, …) that behave identically on every surface — a key with sequences:read can list sequences but not start them, whether the call arrives via REST, MCP, or the CLI. Give an agent the narrowest scope that covers its job; issue separate keys for separate agents so one can be revoked without stopping the others. Details: Authentication.

Rate-limit etiquette

One budget covers all surfaces — see Rate limits.
  • Honor Retry-After on 429; back off exponentially on 5xx. (The CLI and MCP server handle this for you.)
  • Paginate instead of hammering: top/skip on MCP, and the endpoint’s own paging parameters (usually top/skip) when calling through REST or reply api.
  • Never auto-retry a send, approval, start, or enrollment — verify first (see the safe-retry matrix; the same logic applies to REST and CLI).

Report honestly

Batch operations return per-item results (NotProcessed, AffectedContactIds, per-row import failures). Read them and report exact counts — “reassigned 48 of 50” — and never claim an item succeeded unless the response says so.

Next