Built for humans and AI agents. Manage your emails from the terminal.
We believe that the best tools meet you where you already are.
For many of us, that's the terminal.
That's why we're introducing the Resend CLI.
An open source project with more than 53 commands across 13 resources.
We created the CLI to work well for both humans and AI agents.
For humans: interactive mode with suggestions, readable tables and spinners, and natural language for things like scheduling ("tomorrow at 9am").
For agents: authenticate directly with an API key, get machine-readable JSON output by piping, and send emails with idempotency keys so agents can safely retry.
cURL
curl -fsSL https://resend.com/install.sh | bash
Node.js
npm install -g resend-cli
Homebrew (macOS / Linux)
brew install resend/cli/resend
PowerShell (Windows)
irm https://resend.com/install.ps1 | iex
Or download the .exe directly from the GitHub releases page.
The login command opens your browser, walks you through creating an API key, and stores your credentials locally.
$ resend login
For agents, you can pass a key directly:
$ resend login --key re_xxxxxxxxx
The fastest way to send a test email:
$ resend emails send \--from "Acme <hello@resend.dev>" \--to "user@gmail.com" \--subject "Hello from the CLI" \--html "<h1>It works!</h1>"
In interactive mode, the CLI suggests your verified domains and common sender prefixes like hello@ and team@, so you can fire off an email with just a few keystrokes.
Already have a local HTML file? The CLI can send it directly:
$ resend emails send \--html-file "welcome.html"
Every resource you can manage in the Resend API is available in the CLI.
That's 53 commands (subcommands) across 13 resources, including:
For example, creating a domain-scoped API key for your CI pipeline:
$ resend api-keys create \--name "ci-pipeline" \--permission "sending_access" \--domain-id "8b8ceabd-7b45-4244-82d9-8082821dcb5b"✔ API key createdName: ci-pipelineID: acf3445b-d0a0-4c0a-8138-0e9fa1c66190Token: re_xxxxxxxxx⚠ Store this token now — it cannot be retrieved again.
One of our favorite features: you can schedule broadcasts using plain English:
$ resend broadcasts send "f47ac10b-58cc-4372-a567-0e02b2c3d479" \--scheduled-at "tomorrow morning"
The CLI parses natural language dates like "in 1 hour" or "next Monday at 3pm" alongside standard ISO 8601 timestamps.
If you work across multiple Resend teams or accounts, the CLI handles that too.
Switch between profiles without logging in and out:
$ resend auth switch│◆ Switch to which profile?│ ○ default│ ● dracula (active)└
You can also use the --profile flag on any command to run it with a specific profile.
$ resend domains list --profile dracula
The CLI has two output modes.
In an interactive terminal, you get styled tables, spinners, and guided prompts.
$ resend domains list✔ Domains fetched┌──────────────────┬──────────┬───────────┬──────────────────────────────────────┐│ Name │ Status │ Region │ ID │├──────────────────┼──────────┼───────────┼──────────────────────────────────────┤│ draculatheme.com │ verified │ sa-east-1 │ 8b8ceabd-7b45-4244-82d9-8082821dcb5b │└──────────────────┴──────────┴───────────┴──────────────────────────────────────┘
When piped or running in CI, it switches to structured JSON.
$ resend domains list --json{"object": "list","has_more": false,"data": [{"id": "8b8ceabd-7b45-4244-82d9-8082821dcb5b","name": "draculatheme.com","status": "verified","created_at": "2026-01-11 16:55:08.253795+00","region": "sa-east-1","capabilities": {"sending": "enabled","receiving": "enabled"}}]}
This is just the beginning.
We're excited to keep improving the CLI and would love to hear your feedback.
Check out the source code, open an issue, or suggest a feature in the GitHub repository.