Email from
your terminal.
The Reloop CLI sends, schedules and receives email from a shell, a CI job or a coding agent. Every command speaks JSON.
Up and running in a minute
Sign in through the browser, give your agent the skill, and send.
Install and sign in
Opens your browser to authorize your workspace. No API key to paste.
npx -y reloop-cli init --all --browserTeach your agent the CLI
Adds the Reloop skill to Claude Code, Codex and other skill-aware agents.
npx skills add reloop/reloop-cliSend your first email
Every command takes --json for machine-readable output in scripts and agents.
1reloop emails send \2 --from "you@yourdomain.com" \3 --to "user@example.com" \4 --subject "Hello from Reloop" \5 --text "It works."Built for scripts and agents
Predictable output, stdin everywhere and safe retries. The same commands work in a shell, a CI job or a coding agent.
JSON output for agents
Add --json to any command. Output goes to stdout with no spinners, exit codes are 0 for success and 1 for errors, and every error has a message and a code.
1{2 "error": {3 "message": "No API key found",4 "code": "auth_error"5 }6}Pipe content from stdin
Pass - to any file flag to read from stdin. Works with --text-file, --html-file and --file.
1echo "Your order has shipped." | reloop emails send \2 --from "Acme <onboarding@example.com>" \3 --to delivered@example.com \4 --subject "Order update" \5 --text-file -Batch sending
Send up to 100 emails in one request from a JSON file or a pipe.
cat emails.json | reloop emails batch --file -Safe retries
Retry a failed send with the same --idempotency-key and Reloop won't deliver it twice. Supported on emails send and emails batch.
1reloop emails send \2 --from "Acme <onboarding@example.com>" \3 --to delivered@example.com \4 --subject "Welcome" \5 --text "Hello!" \6 --idempotency-key "welcome-user-123"Scheduling
Schedule with --scheduled-at, then cancel or reschedule by id.
1reloop emails send \2 --from "Acme <onboarding@example.com>" \3 --to delivered@example.com \4 --subject "Your trial ends soon" \5 --text "Your free trial expires in 3 days." \6 --scheduled-at "tomorrow at 9am ET"7
8reloop emails cancel <id>9reloop emails update <id> --scheduled-at <datetime>Read inbound email
Stream new inbound email as JSON from a long-running process, or fetch one by id. Needs a verified domain with receiving enabled.
1reloop emails receiving listen --json2
3reloop emails receiving get <email-id>Webhooks in your terminal
Subscribe to webhook events and stream them to your terminal, or forward them to a local server. The webhook is removed when you disconnect.
1reloop webhooks listen \2 --url https://hostname.tailnet-name.ts.net \3 --events email.delivered email.bounced email.received4
5reloop webhooks listen \6 --url https://hostname.tailnet-name.ts.net \7 --forward-to http://localhost:4321/api/webhookWorking in Claude, Cursor or VS Code instead of a shell? Use the Reloop MCP server.
Send email from your terminal.
One command to start.
Create a free account, run init, and send your first email from the shell or your agent.
FAQ
Frequently asked questions.
Run npx -y reloop-cli init --all --browser. It sets up the CLI and opens your browser so you can authorize your workspace.
Install the agent skill with npx skills add reloop/reloop-cli so Claude Code, Codex and other skill-aware agents know the commands. Agents pass --json to get machine-readable output, exit code 0 on success and 1 on errors, and errors with a message and a code.
Yes. reloop emails batch sends up to 100 emails in a single request. Pass a JSON file, or use --file - to read it from stdin.
Pass --idempotency-key with a stable value, such as welcome-user-123. Retrying with the same key won't send the email again. It works on emails send and emails batch.
Yes. reloop emails receiving listen --json streams new inbound email, and reloop emails receiving get fetches one by id. You need a verified domain with receiving enabled.
Run reloop webhooks listen with a public --url (Tailscale Funnel, ngrok or similar) and the events you want. Add --forward-to to send them to a local server. The webhook is removed when you press Ctrl+C.