CarlyEmail docs

CLI

Every part of the API from a terminal, with no install.

npx carlyemail signup

It asks for your email, offers an inbox name, and saves the key to ~/.carlyemail/config.json. Scripting it? Pass --human-email and --username; with no terminal it fails rather than waiting on a prompt.

Confirm the emailed code and it can send:

npx carlyemail verify 123456
npx carlyemail send --from my-agent@agents.carlyemail.com \
  --to someone@example.com --subject "Hello" --text "Sent by an agent."

Install it if you reach for it often. The same package carries the SDK.

npm install -g carlyemail

Node 18 or newer. No dependencies.

Commands

signup Create an account and an inbox
verify <code> Confirm the owner email
whoami Identity and scope of the current key
inboxes List inboxes
create --username <u> Create an inbox
delete <inbox> --yes Delete an inbox and its mail
send --from <i> --to <a> --subject <s> --text <t> Send an email
messages <inbox> List messages
read <inbox> <id> Read one message in full
search <inbox> <text> Search messages
threads <inbox> List conversations
reply <inbox> <id\|--last> --text <t> Reply to the sender (--all to copy everyone)
drafts <inbox> List drafts
draft <inbox> --to <a> --text <t> Write a draft without sending
send-draft <inbox> <id> Send a draft written earlier
webhook <url> --events <e,e> Create a webhook endpoint
webhooks List webhook endpoints
domains List custom domains, with their DNS records
plan Current plan and usage against every limit
upgrade <plan> A Stripe checkout link
billing Invoices, card changes, cancellation
mcp The MCP endpoint, for Claude and other clients

Checking your headroom

Usage against every limit in one view, so you see what is about to run out before a request is refused:

carlyemail plan
free  $0/mo

  inboxes   3 / 3
  domains   0 / 1
  pods      1 / 2
  webhooks  0 / 2
  storage   0.0 GB / 3.0 GB
  email     3000 a month

Scripting

--json prints the API response untouched — the same shape the API reference documents.

carlyemail inboxes --json | jq -r '.inboxes[].email'
carlyemail plan --json | jq '.organization.storage_bytes'

Failures exit 1 under --json too, and the error is still printed, so set -e behaves.

Configuration

The key is saved to ~/.carlyemail/config.json, written 0600.

Two environment variables override it, and the environment always wins:

CARLYEMAIL_API_KEY Use this key instead of the saved one
CARLYEMAIL_API_URL Point at a different deployment

So running as a different account is a prefix, not a login:

CARLYEMAIL_API_KEY=ce_us_... carlyemail whoami

Things worth knowing

An owner email is not a login. Running sign-up again for an existing address returns account_exists and leaves every key untouched. Recover access with an emailed code in the console; use create from an authenticated CLI session to add another inbox.

delete requires --yes. It removes the inbox and every message in it, and there is no undo.

reply goes to the sender only. --all is opt-in.

reply --last skips the id. It answers the newest message the inbox did not itself send. messages prints every id if you want to pick one.

Errors carry their fix.

✗ Inbox limit reached (3 on the free plan).
  Upgrade the plan, or delete an inbox you no longer need.
  https://docs.carlyemail.com/inboxes