CLI Reference
The devel CLI wraps the API for day-to-day project management and
sending test emails.
npm install -g @develemail/cli
devel --versionThere are two separate credential stores, depending on the command:
- API key auth (
send,logs,tail) readsDEVELEMAIL_BASE_URLandDEVELEMAIL_API_KEYfrom the environment or a.envfile in the current directory. - Owner session auth (
project,domains,cloudflare,key,init) reads a browser-authenticated session saved bydevel loginto~/.config/develemail/auth.json.
devel login / devel logout
Authenticate via browser and save an owner session.
devel login --url https://your-instance.com/api
devel login --url https://your-instance.com/api --app-url https://app.your-instance.com
devel logout| Option | Description |
|---|---|
--url <url> | Base URL of your DevelEmail API. Default https://develemail.com/api. |
--app-url <url> | Dashboard URL to open for sign-in. Default: discovered from the API server. |
devel login asks the API for its dashboard host (GET /meta/public-urls)
and opens <dashboard>/cli-auth there, so on develemail.com it signs you in
on the dashboard host. If the server doesn't answer within 3 seconds, or
predates that endpoint, it falls back to --url without its trailing /api.
Pass --app-url to skip discovery. devel login prints the
URL to visit and also tries to open it in your browser; the browser is only
launched for http: and https: URLs, so on a headless machine open the
printed URL by hand. The session is saved to
~/.config/develemail/auth.json, and login times out after 5 minutes.
devel init
Provisions a project and API key in one step, then writes the credentials to your env files. Requires an owner session.
devel init --project my-app --from [email protected]| Option | Description |
|---|---|
--project <name> | Project name (created if it doesn't exist). Required. |
--env-file <paths> | Comma-separated env files to write to. Default .env,.env.prod. |
--key-name <name> | Name for the new API key. Default cli. |
--env <env> | Environment for new projects. Default production. |
--from <address> | Default from address for new projects. |
devel project
Manage projects. Requires an owner session.
devel project list
devel project get <id>
devel project create --name my-app --env production --from [email protected]
devel project update <id> --recipient-cooldown 0create also accepts --domain <domainId>, --rate-limit <n>, and
--webhook <url>.
update --recipient-cooldown <minutes> sets how long the same subject can't be
re-sent to the same recipient. The platform default is 5; 0 disables the
check; default restores the platform default. Sends with a different subject
are never blocked by it. A blocked send returns HTTP 429 with
code: "recipient_cooldown".
devel domains
Manage domains. Requires an owner session.
devel domains list
devel domains get <id>
devel domains add example.com
devel domains records <id>
devel domains publish-dns <id>
devel domains verify <id> --wait| Command | Options |
|---|---|
devel domains add <name> | --dkim-selector <selector>, --json |
devel domains records <id> | --json, --format table|bind for the DNS records to publish |
devel domains verify <id> | --wait polls until verified, --timeout <seconds> (default 600) bounds it |
devel domains publish-dns
Publishes a domain's DNS records to Cloudflare. Connect a token first with
devel cloudflare connect. It shows the planned changes and asks for
confirmation before applying them.
| Option | Description |
|---|---|
--zone <zoneId> | Cloudflare zone ID. Default: auto-pick. |
--yes | Apply without prompting. |
--json | Output JSON. |
devel inbound
Manage inbound mailboxes (routes that receive mail for a domain into the
DevelEmail Inbox). Requires an owner session. <domain> is a domain name or
ID, and <local-part> is the part before the @, or * for a catch-all.
devel inbound list example.com
devel inbound add example.com privacy --if-missing
devel inbound update example.com privacy --notify [email protected]
devel inbound remove example.com privacy --yes
devel inbound check example.com| Command | Options |
|---|---|
devel inbound list <domain> | --json |
devel inbound add <domain> <local> | --webhook <url>, --notify <email>, --if-missing exits 0 if the route already exists |
devel inbound update <domain> <local> | --webhook <url|none>, --notify <email|none>, --active, --inactive |
devel inbound remove <domain> <local> | --yes skips the confirmation prompt |
devel inbound check <domain> | --json; shows MX records and whether they reach mail.develemail.com |
A route with no webhook is inbox-only: received mail appears in the Inbox.
devel cloudflare
Manage the Cloudflare integration. Requires an owner session.
export CLOUDFLARE_API_TOKEN=...
devel cloudflare connect --token-env CLOUDFLARE_API_TOKEN
devel cloudflare status
devel cloudflare zonesconnect reads the token from the named environment variable, so it never
appears in your shell history or process list. zones accepts --json.
devel key
Manage API keys for a project. Requires an owner session.
devel key list --project <id>
devel key create --project <id> --name productioncreate also accepts --expires <date> (ISO-8601) and
--rate-limit <n> (requests per minute). The secret is only printed
once — store it immediately.
devel send
Send a test email using API key auth.
devel send --to [email protected] --subject "Test" --html "<p>Hello</p>"--from defaults to $DEVELEMAIL_FROM or [email protected].
Prints the sent email's ID.
devel logs
List recent emails using API key auth.
devel logs --limit 50 --status faileddevel tail
Poll and print new email events as they happen (Ctrl-C to stop).
devel tail
devel tail --since 2026-07-20T00:00:00Z