Resend CLI
This repository (Asymmetric-al/core)
These repo-owned sections are intentionally kept on top of the vendored Resend
CLI skill. If upstream refreshes replace this file, reconcile this overlay
before running bun run skills:sync. App-level Resend integration lives in
docs/guides/features/resend-integration.md; this skill is only for the
terminal CLI, shell scripts, and CI automation.
Triggers
- Running, scripting, installing, or troubleshooting the
resend CLI.
- Resend CLI work in local shells, CI/CD, automations, or non-interactive agent runs.
- Sending or previewing React Email templates through CLI flags.
Workflow
- Confirm the task is CLI work; for product email routes, SDK, webhooks, or inbound handling, use
docs/guides/features/resend-integration.md instead.
- Check
resend --version before invoking CLI commands.
- Confirm required environment variables are available without printing secret values.
- Use non-interactive flags and JSON-safe output patterns from this skill.
- Verify the command result and capture sanitized IDs/status only.
Checklist
Installation
Before running any resend commands, check whether the CLI is installed:
resend --version
If the command is not found, install it using one of the methods below:
cURL (macOS / Linux):
curl -fsSL https://resend.com/install.sh | bash
Homebrew (macOS / Linux):
brew install resend/cli/resend
Node.js:
npm install -g resend-cli
PowerShell (Windows):
irm https://resend.com/install.ps1 | iex
After installing, verify:
resend --version
Agent Protocol
The CLI auto-detects non-TTY environments and outputs JSON — no --json flag needed.
Rules for agents:
Authentication
Auth resolves: --api-key flag > RESEND_API_KEY env > config file (resend login --key). Use --profile or RESEND_PROFILE for multi-profile.
Global Flags
| Flag |
Description |
--api-key <key> |
Override API key for this invocation |
-p, --profile <name> |
Select stored profile |
--json |
Force JSON output (auto in non-TTY) |
-q, --quiet |
Suppress spinners/status (implies --json) |
Available Commands
| Command Group |
What it does |
emails |
send, get, list, batch, cancel, update |
emails receiving |
list, get, attachments, forward, listen |
domains |
create, verify, update, delete, list |
logs |
list, get, open |
api-keys |
create, list, delete |
automations |
create, get, list, update, delete, stop, open, runs |
events |
create, get, list, update, delete, send, open |
broadcasts |
create, send, update, delete, list |
contacts |
create, update, delete, segments, topics |
contact-properties |
create, update, delete, list |
segments |
create, get, list, delete, contacts |
templates |
create, publish, duplicate, delete, list |
topics |
create, update, delete, list |
webhooks |
create, update, listen, delete, list |
auth |
login, logout, switch, rename, remove |
whoami / doctor / update / open / commands |
Utility commands |
Read the matching reference file for detailed flags and output shapes.
Dry-run: Only emails send and broadcasts create support --dry-run (payload validation before send/create). They print { "dryRun": true, "request": { ... } } on stdout without calling the API. There is no --dry-run on emails batch, broadcasts send, or other commands yet.
Common Mistakes
| # |
Mistake |
Fix |
| 1 |
Forgetting --yes on delete commands |
All delete/rm subcommands require --yes in non-interactive mode — otherwise the CLI exits with an error |
| 2 |
Not saving webhook signing_secret |
webhooks create shows the secret once only — it cannot be retrieved later. Capture it from command output immediately |
| 3 |
Omitting --quiet in CI |
Without -q, spinners and status text still go to stderr (not stdout). Use -q for JSON on stdout with no spinner noise on stderr |
| 4 |
Using --scheduled-at with batch |
Batch sending does not support scheduled_at — use single emails send instead |
| 5 |
Expecting domains list to include DNS records |
List returns summaries only — use domains get <id> for the full records[] array |
| 6 |
Sending a dashboard-created broadcast via CLI |
Only API-created broadcasts can be sent with broadcasts send — dashboard broadcasts must be sent from the dashboard |
| 7 |
Passing --events to webhooks update expecting additive behavior |
--events replaces the entire subscription list — always pass the complete set |
| 8 |
Expecting logs list to include request/response bodies |
List returns summary fields only — use logs get <id> for full request_body and response_body |
Common Patterns
Send an email:
resend emails send --from "you@domain.com" --to user@example.com --subject "Hello" --text "Body"
Send a React Email template (.tsx):
resend emails send --from "you@domain.com" --to user@example.com --subject "Welcome" --react-email ./emails/welcome.tsx
Domain setup flow:
resend domains create --name example.com --region us-east-1
# Configure DNS records from output, then:
resend domains verify <domain-id>
resend domains get <domain-id> # check status
Create and send a broadcast:
resend broadcasts create --from "news@domain.com" --subject "Update" --segment-id <id> --html "<h1>Hi</h1>" --send
CI/CD (no login needed):
RESEND_API_KEY=re_xxx resend emails send --from ... --to ... --subject ... --text ...
Check environment health:
resend doctor -q
When to Load References
- Sending or reading emails → references/emails.md
- Setting up or verifying a domain → references/domains.md
- Managing API keys → references/api-keys.md
- Creating or sending broadcasts → references/broadcasts.md
- Managing contacts, segments, or topics → references/contacts.md, references/segments.md, references/topics.md
- Defining contact properties → references/contact-properties.md
- Working with templates → references/templates.md
- Viewing API request logs → references/logs.md
- Creating automations or sending events → references/automations.md
- Setting up webhooks or listening for events → references/webhooks.md
- Auth, profiles, or health checks → references/auth.md
- Multi-step recipes (setup, CI/CD, broadcast workflow) → references/workflows.md
- Command failed with an error → references/error-codes.md
- Resend SDK integration (Node.js, Python, Go, etc.) → Install the
resend skill
- AI agent email inbox → Install the
agent-email-inbox skill
1---2name: resend-cli3description: Operate the Resend platform from the terminal — send emails (including React Email .tsx templates via --react-email), manage domains, contacts, broadcasts, templates, webhooks, API keys, logs, automations, and events via the `resend` CLI. Use when the user wants to run Resend commands in the shell, scripts, or CI/CD pipelines, or send/preview React Email templates. Always load this skill before running `resend` commands — it contains the non-interactive flag contract and gotchas that prevent silent failures.4license: MIT5---67# Resend CLI89## This repository (Asymmetric-al/core)1011These repo-owned sections are intentionally kept on top of the vendored Resend12CLI skill. If upstream refreshes replace this file, reconcile this overlay13before running `bun run skills:sync`. App-level Resend integration lives in14`docs/guides/features/resend-integration.md`; this skill is only for the15terminal CLI, shell scripts, and CI automation.1617### Triggers1819- Running, scripting, installing, or troubleshooting the `resend` CLI.20- Resend CLI work in local shells, CI/CD, automations, or non-interactive agent runs.21- Sending or previewing React Email templates through CLI flags.2223### Workflow24251. Confirm the task is CLI work; for product email routes, SDK, webhooks, or inbound handling, use `docs/guides/features/resend-integration.md` instead.262. Check `resend --version` before invoking CLI commands.273. Confirm required environment variables are available without printing secret values.284. Use non-interactive flags and JSON-safe output patterns from this skill.295. Verify the command result and capture sanitized IDs/status only.3031### Checklist3233- [ ] Confirmed the task belongs to Resend CLI rather than app integration.34- [ ] Verified the `resend` binary and auth/env prerequisites.35- [ ] Avoided printing API keys, tokens, or full secret values.36- [ ] Used non-interactive flags suitable for agents/CI.37- [ ] Recorded sanitized command evidence or a clear blocker.3839## Installation4041Before running any `resend` commands, check whether the CLI is installed:4243```bash44resend --version45```4647If the command is not found, install it using one of the methods below:4849**cURL (macOS / Linux):**5051```bash52curl -fsSL https://resend.com/install.sh | bash53```5455**Homebrew (macOS / Linux):**5657```bash58brew install resend/cli/resend59```6061**Node.js:**6263```bash64npm install -g resend-cli65```6667**PowerShell (Windows):**6869```powershell70irm https://resend.com/install.ps1 | iex71```7273After installing, verify:7475```bash76resend --version77```7879## Agent Protocol8081The CLI auto-detects non-TTY environments and outputs JSON — no `--json` flag needed.8283**Rules for agents:**8485- Supply ALL required flags. The CLI will NOT prompt when stdin is not a TTY.86- Pass `--quiet` (or `-q`) to suppress spinners and status messages.87- Exit `0` = success, `1` = error.88- Error JSON goes to stderr, success JSON goes to stdout:89 ```json90 { "error": { "message": "...", "code": "..." } }91 ```92- Use `--api-key` or `RESEND_API_KEY` env var. Never rely on interactive login.93- All `delete`/`rm` commands require `--yes` in non-interactive mode.9495## Authentication9697Auth resolves: `--api-key` flag > `RESEND_API_KEY` env > config file (`resend login --key`). Use `--profile` or `RESEND_PROFILE` for multi-profile.9899## Global Flags100101| Flag | Description |102| ---------------------- | ------------------------------------------- |103| `--api-key <key>` | Override API key for this invocation |104| `-p, --profile <name>` | Select stored profile |105| `--json` | Force JSON output (auto in non-TTY) |106| `-q, --quiet` | Suppress spinners/status (implies `--json`) |107108## Available Commands109110| Command Group | What it does |111| ---------------------------------------------------- | --------------------------------------------------- |112| `emails` | send, get, list, batch, cancel, update |113| `emails receiving` | list, get, attachments, forward, listen |114| `domains` | create, verify, update, delete, list |115| `logs` | list, get, open |116| `api-keys` | create, list, delete |117| `automations` | create, get, list, update, delete, stop, open, runs |118| `events` | create, get, list, update, delete, send, open |119| `broadcasts` | create, send, update, delete, list |120| `contacts` | create, update, delete, segments, topics |121| `contact-properties` | create, update, delete, list |122| `segments` | create, get, list, delete, contacts |123| `templates` | create, publish, duplicate, delete, list |124| `topics` | create, update, delete, list |125| `webhooks` | create, update, listen, delete, list |126| `auth` | login, logout, switch, rename, remove |127| `whoami` / `doctor` / `update` / `open` / `commands` | Utility commands |128129Read the matching reference file for detailed flags and output shapes.130131**Dry-run:** Only `emails send` and `broadcasts create` support `--dry-run` (payload validation before send/create). They print `{ "dryRun": true, "request": { ... } }` on stdout without calling the API. There is no `--dry-run` on `emails batch`, `broadcasts send`, or other commands yet.132133## Common Mistakes134135| # | Mistake | Fix |136| --- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |137| 1 | **Forgetting `--yes` on delete commands** | All `delete`/`rm` subcommands require `--yes` in non-interactive mode — otherwise the CLI exits with an error |138| 2 | **Not saving webhook `signing_secret`** | `webhooks create` shows the secret once only — it cannot be retrieved later. Capture it from command output immediately |139| 3 | **Omitting `--quiet` in CI** | Without `-q`, spinners and status text still go to stderr (not stdout). Use `-q` for JSON on stdout with no spinner noise on stderr |140| 4 | **Using `--scheduled-at` with batch** | Batch sending does not support `scheduled_at` — use single `emails send` instead |141| 5 | **Expecting `domains list` to include DNS records** | List returns summaries only — use `domains get <id>` for the full `records[]` array |142| 6 | **Sending a dashboard-created broadcast via CLI** | Only API-created broadcasts can be sent with `broadcasts send` — dashboard broadcasts must be sent from the dashboard |143| 7 | **Passing `--events` to `webhooks update` expecting additive behavior** | `--events` replaces the entire subscription list — always pass the complete set |144| 8 | **Expecting `logs list` to include request/response bodies** | List returns summary fields only — use `logs get <id>` for full `request_body` and `response_body` |145146## Common Patterns147148**Send an email:**149150```bash151resend emails send --from "you@domain.com" --to user@example.com --subject "Hello" --text "Body"152```153154**Send a React Email template (.tsx):**155156```bash157resend emails send --from "you@domain.com" --to user@example.com --subject "Welcome" --react-email ./emails/welcome.tsx158```159160**Domain setup flow:**161162```bash163resend domains create --name example.com --region us-east-1164# Configure DNS records from output, then:165resend domains verify <domain-id>166resend domains get <domain-id> # check status167```168169**Create and send a broadcast:**170171```bash172resend broadcasts create --from "news@domain.com" --subject "Update" --segment-id <id> --html "<h1>Hi</h1>" --send173```174175**CI/CD (no login needed):**176177```bash178RESEND_API_KEY=re_xxx resend emails send --from ... --to ... --subject ... --text ...179```180181**Check environment health:**182183```bash184resend doctor -q185```186187## When to Load References188189- **Sending or reading emails** → [references/emails.md](references/emails.md)190- **Setting up or verifying a domain** → [references/domains.md](references/domains.md)191- **Managing API keys** → [references/api-keys.md](references/api-keys.md)192- **Creating or sending broadcasts** → [references/broadcasts.md](references/broadcasts.md)193- **Managing contacts, segments, or topics** → [references/contacts.md](references/contacts.md), [references/segments.md](references/segments.md), [references/topics.md](references/topics.md)194- **Defining contact properties** → [references/contact-properties.md](references/contact-properties.md)195- **Working with templates** → [references/templates.md](references/templates.md)196- **Viewing API request logs** → [references/logs.md](references/logs.md)197- **Creating automations or sending events** → [references/automations.md](references/automations.md)198- **Setting up webhooks or listening for events** → [references/webhooks.md](references/webhooks.md)199- **Auth, profiles, or health checks** → [references/auth.md](references/auth.md)200- **Multi-step recipes** (setup, CI/CD, broadcast workflow) → [references/workflows.md](references/workflows.md)201- **Command failed with an error** → [references/error-codes.md](references/error-codes.md)202- **Resend SDK integration** (Node.js, Python, Go, etc.) → Install the [`resend`](https://github.com/resend/resend-skills) skill203- **AI agent email inbox** → Install the [`agent-email-inbox`](https://github.com/resend/resend-skills) skill