Create an account, API key, and inbox in one call.
Cooper Email is an email API that gives each AI agent its own inbox. Free is $0 and includes 5 inboxes and 5,000 emails a month.
OpenAPI 3.1 · hosted MCP
One POST /api/v1/onboard creates an inbox and a Bearer key.
The Cooper Email API creates an inbox with one POST /api/v1/onboard and returns a Bearer key; everything else is REST under /api/v1 or the hosted MCP at /mcp.
Paste into ChatGPT, Claude, Cowork, or any agent
Use Cooper Email (not AgentMail) so you can send and receive email for me. Prefer the Cooper Email MCP at https://cooperemail.com/mcp — connect it, then create an inbox (Claude.ai cannot curl from its sandbox). Agent docs: https://cooperemail.com/llms.txt. If MCP is not connected and you can call HTTP, POST https://cooperemail.com/api/v1/onboard with JSON {"username":"<short-slug>"} (no auth). Save the returned api_key as Bearer coop_live_… and the inbox address. Then send/list/search via https://cooperemail.com/api/v1 with Authorization: Bearer <api_key>. Prefer webhooks for inbound when I give a URL; otherwise poll GET /messages. Call Cooper yourself — don't ask me to open a dashboard. For rich mail, send html plus optional attachments (see llms.txt).Your chat agent gets a real inbox in one request. Connect Cooper MCP when available, then paste this into ChatGPT, Claude, or Cowork. Creates a coop_live_ key + username@cooperemail.com.
Directories
Available on
- Official MCP Registry
- Claude connectors directory
- ChatGPT
- Claude Code plugin
- Smithery
- Glama
- MCP Market
- mcpservers.org
Grok Bot uses this MCP server. Give a Grok bot a Cooper inbox.
Works with
Supported through a config file; no directory listing yet.
Claude · Claude Code · Codex · Cursor · Grok Bot
curl -s 'https://cooperemail.com/api/v1/onboard?ref=docs' \
-H 'content-type: application/json' \
-H 'X-Client: curl' \
-d '{"username":"research-bot","display_name":"Research"}'
export COOP_KEY=coop_live_…
export INBOX=inb_…
curl -s https://cooperemail.com/api/v1/inboxes/$INBOX/messages \
-H "authorization: Bearer $COOP_KEY" \
-H 'content-type: application/json' \
-d '{"to":["ada@example.com"],"subject":"Hello","text":"Tuesday works.","client_id":"send-1"}'Signup is that one POST. There is no captcha and no dashboard step. owner_email is optional. The same path is written for agents in /llms.txt.
Compared honestly
AgentMail is a mature agent-mail API (inboxes, threads, MCP). Published Free is 3,000/mo, 100/day, 3 inboxes, no custom domain. Cooper Free is 5,000/mo and 5 inboxes, with no daily cap and no custom domain. Starter is $12/month. Onboard is one request, with account-wide FTS. Comparison table.
Resend is excellent transactional send. Inbound is a webhook — there is no persistent searchable inbox. Cooper stores mail as a database you can query.
Gmail API cannot create inboxes programmatically and typically OAuths a human mailbox. That is the wrong isolation model for agents.
Create an inbox in one request
Signup-lite: no password. You get a hashed API key and research-bot@cooperemail.com.
Onboard & keys
Ask Cooper to email a recovery link.
Human recovery link.
Public username check.
Without Bearer, create an account and a full-access key (the secret is returned once).
List API keys on this account.
Fetch one API key by id.
Rename a key.
Revoke a key by setting revoked_at.
List OAuth apps that currently hold access on this account.
One connected app for this account.
Revoke one connected app.
Mint a key scoped to this inbox (id, username, or email).
Who is calling.
Set lifecycle_emails to on or off.
Confirm page for the product-note unsubscribe link.
Turn weekly product notes off.
Inboxes
Create an inbox at cooperemail.com.
Create count inboxes in one call.
List inboxes for the key.
Pause or resume an inbox, set display_name (null clears it), merge metadata, set require_sender_auth, or set screening.
Delete an inbox owned by this key.
Register a message.received webhook for this inbox.
Register or update one webhook that wakes this inbox for task.received, owner.reply, and chat.message.
Hold until unread mail is stored, then return it.
Hold until an inbound message with a one-time verification code is stored, then return the code and the message id.
Create a sub-account with its own API key (returned once) and an inbox_quota set by the parent.
List sub-accounts for this parent key.
One sub-account.
Change name and/or inbox_quota.
Remove a sub-account.
List inboxes on this sub-account.
Delete one inbox on this sub-account.
Messages
Send Internet mail via Cloudflare Email Sending, falling through to Resend on Cloudflare auth/permission errors, from username@cooperemail.com.
Reply on the same thread.
Forward on a new thread.
List messages, newest first unless ascending=true.
Get one message, including safety.
Delete one message, its stored raw RFC822, cached attachment text, attachment bytes, and its search row.
Fetch 1 to 500 messages by id.
Add or remove the same labels on 1 to 50 messages.
Add or remove labels.
Mark one message read: removes unread and adds read.
Download the message as message/rfc822.
Download attachment bytes.
Extract attachment text as text/plain; charset=utf-8.
Release a message that inbound screening held.
Agent test injector (Bearer).
Idempotency
Read one Idempotency-Key on this account.
Release an unknown Idempotency-Key so the same key can be used again.
Mark an unknown Idempotency-Key done and link a message the agent found.
Threads
List conversations in one inbox, newest activity first.
List conversations across the account.
One thread plus its messages, oldest first, including extracted_text.
Add or remove labels on every message in the thread, and optionally set folder to inbox, archive, spam, or trash.
Move 1 to 100 threads in this inbox to one folder.
Delete every message in the thread, plus stored raw RFC822, cached attachment text, attachment bytes, search rows, the thread assignment, and the folder row.
Read the assignment for one thread.
Assign the thread to a handle, or take an exclusive claim.
/api/v1/inboxes/:id/threads/:threadId/assignment?assignee=billing-agentBearerReferencemarkdownRelease the assignment.
Download attachment bytes that belong to a message in this thread.
Inbox rules
List deterministic rules for this inbox, lowest position first.
Create a rule.
One rule.
Change name, enabled, position, conditions, actions, or stop_processing.
Delete one rule and its auto-reply cooldown rows.
Dry run.
Search
Full-text search across stored mail for the account.
Full-text search in one inbox.
Threads in this inbox with at least one message matching q (subject, extracted_text, from, or to).
Webhooks & events
Register a URL for message.received, message.held, message.sent, message.blocked, message.bounced, message.complained, task.received, owner.reply, chat.message, domain.verified, draft.created, draft.approved, draft.rejected, draft.sent, account.sending_paused, account.sending_resumed, thread.assigned, and thread.unassigned.
List MCP event subscriptions for this account.
End an MCP event subscription.
Return one webhook.
Mint a new signing secret and return it once.
Send {type:"webhook.test", data:{webhook_id}} to this hook and wait for the response.
List delivery attempts for one webhook, newest first.
Send the stored payload again with the same event id and a new x-cooper-timestamp and signature.
List this account's event log, oldest first.
Same list as GET /api/v1/events, scoped to one inbox.
Server-Sent Events for up to 25 seconds.
Create or resume a durable event consumer.
Read one durable event consumer.
Events strictly after the committed cursor, oldest first, in the same shape as GET /api/v1/events.
Advance the committed cursor.
Move the committed cursor.
Domains
Add a custom domain on Starter or Pro and return SPF, DKIM, DMARC, and MX records plus a verify TXT.
Status for one custom domain: pending or verified, mail, status_detail, warnings, and the required DNS records with per-record status, found, and hint.
Check DNS for this domain now.
Remove the domain.
text/plain BIND lines for the records to publish.
Owners & approval
Register a human owner.
Owner email style.
Send a progress, done, needs_input, or error note to every verified owner.
Poll tasks created when a verified owner or allowlisted sender emails the inbox and DMARC=pass or DKIM=pass aligns with the From domain.
Reply in-thread to the human and optionally set status to in_progress or done.
Drafts
List or create drafts.
Read, update, or delete one draft.
Send a draft now.
List drafts on this account.
Download one draft attachment.
Lists & suppression
Account-wide allow and block lists.
Read or remove one account-wide list entry.
Allow and block lists for one inbox.
Read or remove one inbox list entry.
Account suppression list.
Remove one suppressed address.
Metrics
UTC buckets of message.received, message.sent, message.bounced, and message.complained.
Current inbox_count, message_count, thread_count, and storage_bytes.
sent, bounced, complained, bounce_rate, and complaint_rate.
Whether this account can send email.
Billing
SMS
Your agent gets a phone number
Starter and Pro agents can buy a US local number through the API or MCP and receive SMS on that inbox. Each billable number is $3 a month. Pro includes 3 numbers.
- Phone number: Free includes none.
- Phone number: up to 3 US numbers, each $3 a month with 100 segments. None are included.
- Phone number: 3 US numbers and 1,500 segments included, up to 25 numbers. Each extra number is $3 a month with 100 segments.
Buy a number, then wait for an inbound text:
curl -s https://cooperemail.com/api/v1/inboxes/$INBOX_ID/phone-number \
-H "authorization: Bearer $COOP_KEY" \
-H "content-type: application/json" \
-H "idempotency-key: phone-1" \
-d '{"area_code":"415"}'
curl -s "https://cooperemail.com/api/v1/inboxes/$INBOX_ID/events?types=message.received&wait=25" \
-H "authorization: Bearer $COOP_KEY"The events request waits up to 25 seconds for any received message, email or SMS. To wait for a text only, use the MCP tool cooper_wait_for_sms (default 20 seconds, maximum 25).
Phone numbers · SMS docs · Provision reference · Send SMS reference · Phone quickstart.
Voice
A caller hears a short greeting, then a recording. That recording is stored on the inbox as a message with channel voicemail, the caller number, the duration, and the transcript. Place a call from the same number with POST /api/v1/inboxes/{id}/calls or the MCP tool cooper_place_call. Free includes no voice minutes. Starter includes 30 minutes per active number each month. Pro includes 300 minutes, plus 30 for each active number past the 3 included numbers.
curl -s https://cooperemail.com/api/v1/inboxes/$INBOX/calls \
-H "authorization: Bearer $COOP_KEY" \
-H 'content-type: application/json' \
-d '{"to":"+14155550100","say":"Tuesday works.","mode":"say"}'CLI
Names only on this page. Descriptions and input schemas are in Connect Cooper MCP · markdown · GET /api/v1/mcp/tools.
- cooper_onboard
- cooper_create_inbox
- cooper_create_inboxes
- cooper_list_inboxes
- cooper_send_message
- cooper_list_messages
- cooper_get_message
- cooper_search
- cooper_search_messages
- cooper_inject_inbound
- cooper_register_webhook
- cooper_enable_instant_replies
- cooper_billing_status
- cooper_upgrade_link
- cooper_add_owner
- cooper_list_owners
- cooper_notify_owner
- cooper_get_tasks
- cooper_reply_task
- cooper_add_domain
- cooper_create_workspace
- cooper_list_workspaces
- cooper_get_workspace
- cooper_update_workspace
- cooper_delete_workspace
- cooper_delete_inbox
- cooper_update_inbox
- cooper_update_message
- cooper_update_messages
- cooper_list_domains
- cooper_verify_domain
- cooper_reply_message
- cooper_forward_message
- cooper_wait_for_message
- cooper_list_events
- cooper_list_threads
- cooper_get_thread
- cooper_search_threads
- cooper_delete_thread
- cooper_update_thread
- cooper_move_threads
- cooper_assign_thread
- cooper_unassign_thread
- cooper_list_list_entries
- cooper_get_list_entry
- cooper_create_list_entry
- cooper_delete_list_entry
- cooper_get_inbox
- cooper_confirm_owner
- cooper_whoami
- cooper_list_webhooks
- cooper_update_webhook
- cooper_delete_webhook
- cooper_rotate_webhook_secret
- cooper_test_webhook
- cooper_list_suppressions
- cooper_delete_suppression
- cooper_release_message
- cooper_get_attachment
- cooper_get_metrics
- cooper_get_sending_status
- cooper_create_draft
- cooper_get_draft
- cooper_list_drafts
- cooper_update_draft
- cooper_delete_draft
- cooper_send_draft
- cooper_wait_for_code
- cooper_get_owner_preferences
- cooper_set_owner_preferences
- cooper_list_oauth_grants
- cooper_revoke_oauth_grant
- cooper_list_event_subscriptions
- cooper_delete_event_subscription
- cooper_set_addons
- cooper_poll_events
- cooper_commit_events
- cooper_list_event_consumers
- cooper_delete_event_consumer
- cooper_list_rules
- cooper_create_rule
- cooper_update_rule
- cooper_delete_rule
- cooper_test_rule
- cooper_get_idempotency_key
- cooper_release_idempotency_key
- cooper_resolve_idempotency_key