The API,
one command away.
Every command maps to one REST endpoint and prints the API's JSON verbatim. Built for scripts and AI agents as much as for humans — with confirmation gates on anything irreversible.
View this page as Markdown$ curl -fsSL https://raw.githubusercontent.com/danest/emailbump-cli/main/install.sh | sh- Or grab a binary from
- GitHub Releases
- EMAILBUMP_API_KEY for auth
Send your first email in a minute.
One login, one key model: pick the scope in your browser and every endpoint is a command.
# Log in via the browser: click Authorize, pick the scope (one project or all access) $ emailbump login # (CI/servers: set EMAILBUMP_API_KEY instead — run `emailbump login` again any time to switch) # Check your limits, then send $ emailbump limits $ emailbump emails:send --from 'Acme <[email protected]>' \ --to [email protected] --subject 'Your receipt' \ --html '<p>Thanks, {{ contact.first_name }}!</p>' # [email protected] is a placeholder — example.com accepts no mail, so sends to it are refused. Swap in a mailbox you own. # Draft a campaign — drafting is always safe $ emailbump campaigns:create --data '{"name":"Launch","subject":"We are live", "segment_id":"...","html":"<p>...</p>"}' # Sending is gated: without --yes it shows the campaign and exits 3 $ emailbump campaigns:send 4f2a... { "confirmation_required": true, "campaign": { ... } } $ emailbump campaigns:send 4f2a... --yes # Escape hatch for anything else $ emailbump api GET /v1/segments
Thin on purpose, safe by default.
The CLI is a transparent layer over the REST API — no hidden state, no format of its own, and guardrails an agent cannot talk its way around.
- 01
One command, one endpoint
campaigns:send is POST /v1/campaigns/:id/send — nothing more. The api command reaches any endpoint the named commands don't cover, so the CLI never lags the API.
- 02
The response is the output
Success prints the API's JSON to stdout; failures print a JSON error envelope with the HTTP status to stderr and exit 1. Agents and jq parse the same thing.
- 03
--yes or it doesn't happen
Sends and deletes refuse to run without --yes, print a confirmation_required envelope, and exit with code 3. campaigns:send shows you the full campaign first — audience, subject, from address.
- 04
Log in with a click — or a key
emailbump login opens your browser: approve, choose the scope — one project or all access — done — the credential lands in ~/.config/emailbump (0600). EMAILBUMP_API_KEY still wins when set, for CI and servers.
Around 59 commands, ten groups.
Postiz-style resource:action names. Run emailbump --help for the complete list with flags.
| Group | Commands | What it does |
|---|---|---|
| Sending | emails:send · emails:get · limits | Send or schedule one transactional email, attachments included (--attach); emails:get says what became of it — a send is accepted, not delivered. Check limits before bulk work. |
| Contacts | contacts:list · create · get · update · delete · subscribe · unsubscribe | Manage the audience and its consent. Delete requires --yes. |
| Events | events:track | Track behavior like order_completed to drive segments and flows. |
| Campaigns | campaigns:list · create · get · update · send · variants:create/update/delete · ab · ab:winner | Draft, A/B test, and send marketing campaigns. Sending requires --yes and shows a preview first. |
| Flows | flows:list · create · get · update · delete · test · activate · pause · enroll · enrollments | Automated journeys — triggers, waits, branches. Delete requires --yes; pause is the safe stop. |
| Inbound | inbound:list · get · attachment · forward · address · rules · rules:create · rules:delete | Email people sent you: read it, download attachments to a file, send one on to someone else, or set a rule that forwards what arrives automatically. |
| Audiences | lists:* · segments:list/get | Lists with membership management; segments are read-only live queries. |
| Templates | templates:list · create · get · update · delete | Reusable MJML content referenced from sends by id. |
| Getting in | signup --email · verify-email · login · logout · whoami | signup --email creates the account right here — no browser, no password, just an address to confirm with the six-character code (verify-email). login authorizes this machine on an existing account. whoami asks the server what the key can actually do. |
| Sending domains | domains:list · add · check · tracking:on · tracking:off | This project's sending domains — add one, publish the DNS records it prints, then poll until verified. tracking:on switches links from the shared tracking domain to links.yourdomain.com. All with an ordinary project key. |
| Account | workspaces:list/create · projects:list/get/update/create/delete · projects:keys:create · projects:domains:list/add/verify | Provision workspaces, projects, sending domains, and project keys (needs an all-access key). |
| Anything else | api METHOD /v1/path | Escape hatch: call any endpoint directly with --data and --query. |
Three doors into one platform.
The CLI, answered.
How do I install it?
Run the one-line installer above — it detects your platform, downloads the latest release binary from GitHub, and installs to ~/.local/bin (override with EMAILBUMP_INSTALL_DIR). macOS (Apple Silicon and Intel) and Linux (x86_64 and aarch64) are supported; the Linux builds are static, so one binary works on any distro. On Windows, download the .zip from the releases page and put emailbump.exe on your PATH. You can also download a tarball from the releases page directly. To update, re-run the installer.
How do I authenticate?
Run emailbump login — it opens your browser with a pairing code, you click Authorize, and you choose the key's scope: one project, or all access (which can also act in any project you admin — pass --project). Run it again any time to switch; emailbump logout removes the stored credential. For CI and servers, set EMAILBUMP_API_KEY instead — it always takes precedence. Every credential is revocable in the dashboard.
Why is everything JSON?
The CLI prints the API's response verbatim and sends errors to stderr as JSON with the HTTP status. That makes it equally usable by humans with jq and by AI agents that parse output — there is never a format to scrape.
What happens if I run campaigns:send without --yes?
Nothing sends. The CLI fetches the campaign, prints it with a confirmation_required envelope so you can review the audience, subject, and from address, and exits with code 3. The same gate protects every delete. This is what makes the CLI safe to hand to an AI agent.
Can I point it at a different environment?
Yes — pass --base-url or set EMAILBUMP_BASE_URL. The default is https://emailbump.com/api.
Is this the same binary as the MCP server?
Yes. emailbump mcp starts a Model Context Protocol server on stdio for Claude Desktop, Claude Code, Cursor, and other MCP clients — one install covers both.