Editor's Note
pp-resend
The full Resend API (100 endpoints across emails, broadcasts, audiences, contacts, domains, templates, webhooks)... Trigger phrases: `send an email with resend`, `check resend deliverability`, `list resend audiences`, `what did we send to <email>`, `use resend`, `run resend`.
Install
npx skills add https://github.com/mvanhorn/printing-press-library --skill pp-resendResend — Printing Press CLI
Prerequisites: Install the CLI
This skill drives the resend-pp-cli binary. You must verify the CLI is installed before invoking any command from this skill. If it is missing, install it first:
- Install via the Printing Press installer into a user bin directory:
npx -y @mvanhorn/printing-press-library install resend --cli-only --bin-dir ~/.local/bin - Verify:
resend-pp-cli --version - Ensure
~/.local/binis on$PATHfor the agent/runtime that will invoke this skill.
If the npx install fails (no Node, offline, etc.), fall back to a direct Go install (requires Go 1.26.3 or newer):
go install github.com/mvanhorn/printing-press-library/library/productivity/resend/cmd/resend-pp-cli@latest
If --version reports "command not found" after install, the runtime cannot see the binary directory on $PATH. Do not proceed with skill commands until verification succeeds.
When to Use This CLI
Use this CLI when an agent needs to answer cross-resource questions about a Resend account that the dashboard or SDK cannot answer in one call — what did we send to a specific recipient, which audiences is a contact in, how does broadcast performance trend over time, what's the 7-day bounce rate. Stick with npx resend send for one-shot transactional sends or with React Email for templates; this CLI is the agent-facing companion, not a replacement.
Unique Capabilities
These capabilities aren't available in any other tool for this API.
Cross-resource queries over local state
-
emails to— Every email sent to a single recipient address, with delivery status and timestamps, ordered newest-first.Reach for this when an agent needs to reconstruct what a single user has received — support tickets, GDPR exports, dispute investigations.
resend-pp-cli emails to <your-email> --json --select id,subject,status,sent_at -
emails timeline— Collapsed event chain for a single email: sent → delivered → opened → clicked → bounced, in one ordered table.Use when debugging 'why didn't this arrive?' — one command shows whether it was sent, delivered, opened, or bounced and when.
resend-pp-cli emails timeline 4ef9a417-d4ff-4ec5-9af2-c80a4d5d2c1f --json -
audiences inventory— Per-audience rollup: contact count, unsubscribed count, last-broadcast timestamp, recent open-rate.Use before planning a campaign — quickly see which audiences are healthy and recently engaged.
resend-pp-cli audiences inventory --json -
contacts where— Find every audience, segment, and topic a contact (by email or name) belongs to in one query.Use when triaging unsubscribe requests, GDPR deletions, or 'why is bob getting this email?'.
resend-pp-cli contacts where <contact-email> --json --select audience_name,subscribed
Aggregate analytics from local store
-
broadcasts performance— Open / click / bounce rate across all broadcasts, sortable; not limited to a single broadcast or 30-day window.Use to compare campaign performance across the lifetime of the account.
resend-pp-cli broadcasts performance --json --select broadcasts,count,status -
domains health— Verification + DKIM/SPF/DMARC status across every domain in one table, flags missing or unverified records.Use on call-out / deliverability incidents to confirm all sending domains are fully verified.
resend-pp-cli domains health --json -
deliverability summary— Bounce rate, complaint rate, and suppression count over a rolling window (default 7d) computed from local event data.Use weekly to monitor IP/domain reputation trends before they cause deliverability incidents.
resend-pp-cli deliverability summary --window 7d --json
Operational hygiene
-
api-keys rotation— API keys sorted by age + last-used timestamp (joined from logs); flags stale keys older than N days.Use during quarterly security reviews — find unused keys that should be rotated or revoked.
resend-pp-cli api-keys rotation --older-than 90d --json
Command Reference
api-keys — Create and manage API Keys through the Resend API.
resend-pp-cli api-keys create— Create a new API keyresend-pp-cli api-keys delete— Remove an existing API keyresend-pp-cli api-keys list— Retrieve a list of API keys
audiences — Deprecated: Use Segments instead. Create and manage Audiences through the Resend API.
resend-pp-cli audiences create— Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.resend-pp-cli audiences delete— Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.resend-pp-cli audiences get— Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.resend-pp-cli audiences list— Deprecated: Use Segments instead. These endpoints still work, but will be removed in the future.
automations — Create and manage Automations through the Resend API.
resend-pp-cli automations create— Create an automationresend-pp-cli automations delete— Delete an automationresend-pp-cli automations get— Retrieve a single automationresend-pp-cli automations list— Retrieve a list of automationsresend-pp-cli automations update— Update an automation
broadcasts — Create and manage Broadcasts through the Resend API.
resend-pp-cli broadcasts create— Create a broadcastresend-pp-cli broadcasts delete— Remove an existing broadcast that is in the draft statusresend-pp-cli broadcasts get— Retrieve a single broadcastresend-pp-cli broadcasts list— Retrieve a list of broadcastsresend-pp-cli broadcasts update— Update an existing broadcast
contact-properties — Create and manage Contact Properties through the Resend API.
resend-pp-cli contact-properties create— Create a new contact propertyresend-pp-cli contact-properties delete— Remove an existing contact propertyresend-pp-cli contact-properties get— Retrieve a single contact propertyresend-pp-cli contact-properties list— Retrieve a list of contact propertiesresend-pp-cli contact-properties update— Update an existing contact property
contacts — Create and manage Contacts through the Resend API.
resend-pp-cli contacts create— Create a new contactresend-pp-cli contacts delete— Remove an existing contact by ID or emailresend-pp-cli contacts get— Retrieve a single contact by ID or emailresend-pp-cli contacts list— Retrieve a list of contactsresend-pp-cli contacts update— Update a single contact by ID or email
domains — Create and manage domains through the Resend API.
resend-pp-cli domains create— Create a new domainresend-pp-cli domains delete— Remove an existing domainresend-pp-cli domains get— Retrieve a single domainresend-pp-cli domains list— Retrieve a list of domainsresend-pp-cli domains update— Update an existing domain
emails — Start sending emails through the Resend API.
resend-pp-cli emails create— Send an emailresend-pp-cli emails create-batch— Trigger up to 100 batch emails at once.resend-pp-cli emails get— Retrieve a single emailresend-pp-cli emails get-receiving— Retrieve a single received emailresend-pp-cli emails get-receiving-2— Retrieve a list of attachments for a received emailresend-pp-cli emails get-receiving-3— Retrieve a single attachment for a received emailresend-pp-cli emails list— Retrieve a list of emailsresend-pp-cli emails list-receiving— Retrieve a list of received emailsresend-pp-cli emails update— Update a single email
events — Create and manage Events through the Resend API.
resend-pp-cli events create— Create an eventresend-pp-cli events create-send— Send an eventresend-pp-cli events delete— Delete an eventresend-pp-cli events get— Retrieve a single eventresend-pp-cli events list— Retrieve a list of eventsresend-pp-cli events update— Update an event
logs — Retrieve API request logs through the Resend API.
resend-pp-cli logs get— Retrieve a single logresend-pp-cli logs list— Retrieve a list of logs
segments — Create and manage Segments through the Resend API.
resend-pp-cli segments create— Create a new segmentresend-pp-cli segments delete— Remove an existing segmentresend-pp-cli segments get— Retrieve a single segmentresend-pp-cli segments list— Retrieve a list of segments
templates — Create and manage Templates through the Resend API.
resend-pp-cli templates create— Create a templateresend-pp-cli templates delete— Remove an existing templateresend-pp-cli templates get— Retrieve a single templateresend-pp-cli templates list— Retrieve a list of templatesresend-pp-cli templates update— Update an existing template
topics — Create and manage Topics through the Resend API.
resend-pp-cli topics create— Create a new topicresend-pp-cli topics delete— Remove an existing topicresend-pp-cli topics get— Retrieve a single topicresend-pp-cli topics list— Retrieve a list of topicsresend-pp-cli topics update— Update an existing topic
webhooks — Create and manage Webhooks through the Resend API.
resend-pp-cli webhooks create— Create a new webhookresend-pp-cli webhooks delete— Remove an existing webhookresend-pp-cli webhooks get— Retrieve a single webhookresend-pp-cli webhooks list— Retrieve a list of webhooksresend-pp-cli webhooks update— Update an existing webhook
Finding the right command
When you know what you want to do but not which command does it, ask the CLI directly:
resend-pp-cli which "<capability in your own words>"
which resolves a natural-language capability query to the best matching command from this CLI's curated feature index. Exit code 0 means at least one match; exit code 2 means no confident match — fall back to --help or use a narrower query.
Recipes
Reconstruct what a user has received
resend-pp-cli emails to user@example.com --json --select id,subject,status,sent_at,opened_at --limit 50
Use this for support tickets and GDPR exports — every email sent to one recipient, with delivery state.
Pre-campaign audience check
resend-pp-cli audiences inventory --json --select name,contact_count,unsubscribed_count,last_broadcast_at
Run before scheduling a broadcast — surfaces audiences with high unsubscribe rates or stale engagement.
Weekly deliverability review
resend-pp-cli deliverability summary --window 7d --agent --select bounce_rate,complaint_rate,suppression_count
Trend snapshot for IP/domain reputation; pipe through jq to alert on threshold breaches.
Audit stale API keys
resend-pp-cli api-keys rotation --older-than 90d --json --select name,created_at,last_used_at
Find unused keys during quarterly security reviews.
Search every sent email for a phrase
resend-pp-cli search 'password reset' --json --select id,subject,to,sent_at
FTS5-backed; needs sync --full first.
Auth Setup
Run resend-pp-cli auth setup for the URL and steps to obtain a token (add --launch to open the URL). Then store it:
resend-pp-cli auth set-token YOUR_TOKEN_HERE
Or set RESEND_API_KEY as an environment variable.
Run resend-pp-cli doctor to verify setup.
Agent Mode
Add --agent to any command. Expands to: --json --compact --no-input --no-color --yes.
-
Pipeable — JSON on stdout, errors on stderr
-
Filterable —
--selectkeeps a subset of fields. Dotted paths descend into nested structures; arrays traverse element-wise. Critical for keeping context small on verbose APIs:resend-pp-cli api-keys list --agent --select id,name,status -
Previewable —
--dry-runshows the request without sending -
Offline-friendly — sync/search commands can use the local SQLite store when available
-
Non-interactive — never prompts, every input is a flag
-
Explicit retries — use
--idempotentonly when an already-existing create should count as success, and--ignore-missingonly when a missing delete target should count as success
Response envelope
Commands that read from the local store or the API wrap output in a provenance envelope:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}
Parse .results for data and .meta.source to know whether it's live or local. A human-readable N results (live) summary is printed to stderr only when stdout is a terminal — piped/agent consumers get pure JSON on stdout.
Agent Feedback
When you (or the agent) notice something off about this CLI, record it:
resend-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
resend-pp-cli feedback --stdin < notes.txt
resend-pp-cli feedback list --json --limit 10
Entries are stored locally at ~/.resend-pp-cli/feedback.jsonl. They are never POSTed unless RESEND_FEEDBACK_ENDPOINT is set AND either --send is passed or RESEND_FEEDBACK_AUTO_SEND=true. Default behavior is local-only.
Write what surprised you, not a bug report. Short, specific, one line: that is the part that compounds.
Output Delivery
Every command accepts --deliver <sink>. The output goes to the named sink in addition to (or instead of) stdout, so agents can route command results without hand-piping. Three sinks are supported:
| Sink | Effect |
|---|---|
stdout | Default; write to stdout only |
file:<path> | Atomically write output to <path> (tmp + rename) |
webhook:<url> | POST the output body to the URL (application/json or application/x-ndjson when --compact) |
Unknown schemes are refused with a structured error naming the supported set. Webhook failures return non-zero and log the URL + HTTP status on stderr.
Named Profiles
A profile is a saved set of flag values, reused across invocations. Use it when a scheduled agent calls the same command every run with the same configuration - HeyGen's "Beacon" pattern.
resend-pp-cli profile save briefing --json
resend-pp-cli --profile briefing api-keys list
resend-pp-cli profile list --json
resend-pp-cli profile show briefing
resend-pp-cli profile delete briefing --yes
Explicit flags always win over profile values; profile values win over defaults. agent-context lists all available profiles under available_profiles so introspecting agents discover them at runtime.
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 2 | Usage error (wrong arguments) |
| 3 | Resource not found |
| 4 | Authentication required |
| 5 | API error (upstream issue) |
| 7 | Rate limited (wait and retry) |
| 10 | Config error |
Argument Parsing
Parse $ARGUMENTS:
- Empty,
help, or--help→ showresend-pp-cli --helpoutput - Starts with
install→ ends withmcp→ MCP installation; otherwise → see Prerequisites above - Anything else → Direct Use (execute as CLI command with
--agent)
MCP Server Installation
Install the MCP binary from this CLI's published public-library entry or pre-built release, then register it:
claude mcp add resend-pp-mcp -- resend-pp-mcp
Verify: claude mcp list
Direct Use
- Check if installed:
which resend-pp-cliIf not found, offer to install (see Prerequisites at the top of this skill). - Match the user query to the best command from the Unique Capabilities and Command Reference above.
- Execute with the
--agentflag:resend-pp-cli <command> [subcommand] [args] --agent - If ambiguous, drill into subcommand help:
resend-pp-cli <command> --help.