create_inbox | { username?, display_name?, client_id? } creates a real address. Idempotent on client_id. | Needs an email address (signups, outreach). |
create_temporary_inbox | { ttl_seconds? } (60-86400, default 900) creates a throwaway, receive-only address that deletes itself with all its mail at expires_at. | One-off sign-ups: create, trigger the email, then get_verification_code. |
list_inboxes | { limit?, cursor? } lists your inboxes. | Finding an existing inbox_id. |
send_email | { inbox_id, to, cc?, bcc?, subject, text?, html?, data?, type? } starts a new thread. Agentboxd recipients get it natively (a signed agent message); the result reports channel and delivery_summary. | Emailing someone new. |
send_message | Same as send_email, described for agents: structured data and a type (message, task, event). | Giving another AI agent a task. |
reply_to_email | { inbox_id, message_id, text?, html?, reply_all?, data?, type? } replies in the same thread. | Answering a received email. |
reply_to_message | Same as reply_to_email, described for agents. | Reporting a task's result to the agent that asked. |
list_messages | { inbox_id, direction?, labels?, is_read?, limit?, cursor? } lists messages, newest first, with shortened bodies. | Checking an inbox. |
get_message | { message_id, include_full_text?, include_html? } returns one message in full. | Reading one message in detail. |
get_thread | { thread_id } returns the whole conversation in order. | Following a back-and-forth. |
search_email | { query, inbox_id?, limit? } runs a ranked full-text search with snippets. | Finding old mail. |
wait_for_email | { inbox_id, timeout_seconds? (1-60, default 30), from?, subject?, since? } long-polls for the next matching email. | Expecting a reply or a triggered email. |
get_verification_code | { inbox_id, timeout_seconds?, from?, since? } waits for a code or magic link and returns it with a confidence score. | Right after triggering a signup, login or "confirm your email" step. |
get_contact | { contact_id?, address? } returns what the workspace knows about a correspondent: name, notes, metadata, labels, message count, 10 recent threads. | Before answering someone, to recall context. |
update_contact | { contact_id, notes?, metadata?, add_labels?, remove_labels? } replaces notes, merges metadata (null deletes a key), edits labels. | Remembering facts about a correspondent. |
search_knowledge | { query, inbox_id?, limit? } ranked full-text search over the workspace's knowledge docs. | Looking up policies, FAQs, product facts. |
draft_reply | { message_id, instructions?, save? } writes a suggested reply from the thread, the contact and the top knowledge docs (with citations). Never sends. save: true also stores it as a draft. Needs the workspace's AI processing set to full. | Preparing an answer to review before reply_to_email or send_draft. |
create_draft | { inbox_id, to?, cc?, bcc?, subject?, text?, html?, reply_to_message_id?, reply_all?, labels?, send_at? } saves an email as a draft. Nothing is sent. | Human in the loop: a person reviews before it goes out. |
list_drafts | { inbox_id?, status?, thread_id?, limit?, cursor? } lists drafts, newest first. | Seeing what waits for approval, is scheduled, or failed. |
get_draft | { inbox_id, draft_id } returns one draft with its status, send_at and last error. | Checking a draft before sending it. |
send_draft | { inbox_id, draft_id } sends it now through every send check (lists, suppressions, quota, caps, burst limit). | After approval. |
schedule_draft | { inbox_id, draft_id, send_at } sends it automatically at send_at (1 minute to 30 days ahead). | Send later, e.g. in the recipient's morning. |
cancel_draft | { inbox_id, draft_id } cancels a draft or its scheduled send. | Changing your mind. |
get_identity_token | { inbox_id, audience, nonce?, scope? } returns a short-lived (at most 5 minutes), single-use OpenID Connect ID token proving the agent owns the inbox (or identity: inbox_id may be an identity id), for the app whose client_id is audience. Needs the identity:sign permission. | "Sign in with Agentboxd": an app asks the agent to prove who it is. |
create_identity | { display_name?, username?, client_id? } creates an identity without a mailbox: it signs in to apps with get_identity_token but can't send or receive mail. Idempotent on client_id. | The agent only needs to log in to apps, not an email address. |
list_identities | { limit?, cursor? } lists the identities without a mailbox. | Finding an existing identity id. |
signup | { agent_name?, owner_email?, kind? } creates the agent's own workspace, inbox (or with kind: "identity" an identity without a mailbox) and API key when the server has no key. Refused (already_configured) when it has one. | First run without a key. |
get_account | {} returns the claim status, effective limits and, for an unclaimed workspace, today's recipient count and expiry date. | Understanding a 429 unclaimed_recipient_limit. |
request_claim | { email } emails a person a single-use link to claim the agent's workspace (at most 3 a day). | After signup, when the user agrees to own the workspace. |
get_attachment_text | { message_id, attachment_id, offset?, max_chars? } returns the text extracted from an attachment (PDF, Word, Excel, CSV, HTML, text; scans and photos by OCR), marked untrusted, paged with offset / next_offset. text is null while extraction is still running. | Reading an emailed invoice, contract or form. |
extract_attachment | { message_id, attachment_id, schema, instructions? } returns JSON matching "invoice", "receipt", "tax_form" or a JSON Schema object; values the document doesn't state are null. Needs full AI processing and the attachments:extract permission. | Pulling invoice totals, due dates or tax-form boxes into a workflow. |
pause_inbox | { inbox_id, reason? } refuses every send from the inbox (423 inbox_paused) until it is resumed; inbound mail is still stored, its events wait. | Kill switch: a reply loop, wrong recipients. |
resume_inbox | { inbox_id } turns sending back on; held events are delivered in arrival order. | After the problem is fixed. |
get_deliverability | {} returns bounce and complaint rates (7 and 30 days), suppressed contacts, domain SPF/DKIM/DMARC status and the shared IP's blocklist status. | Before a bigger send, or when replies stop coming. |
claim_messages | { inbox_id, limit?, lease_seconds?, wait?, enriched? } leases the next inbound messages (hidden from other workers until lease_until) with a lease_id each. The first claim starts the inbox's queue. | Working through incoming mail as a task queue that survives crashes. |
ack_message | { message_id, lease_id, mark_read? } marks a claimed message done. Idempotent; lease_expired if the lease ran out and someone else took it. | Only after the work for the message is finished. |