ax-check.com
by Gauge
R
Resend
resend.com
ax-check.com
Checked 7 October 2026
A
100/100
Agents need your login
Resend's docs, pricing, and setup all resolve cleanly for agents
All 23 checked items passed, with pricing stated as plain tables and quickstarts, CLI, SDKs, and MCP server all reachable without interaction.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no resend.com account. Recorded 7 October 2026 on Pi.
3 recorded · 2m 4s
2m 4s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
Let me check the repository.
The user wants me to build a simple example using Resend, explain how the pricing mechanism works, and tell them whether it would be easy for me to manage. First, let me take a look at the repository.
Let me explore the working directory to understand the context.
pwd; ls -la; git log --oneline -5 2>/dev/null | head
/sandbox/repo
/sandbox/repo total 16 drwxr-xr-x 3 root root 4096 Sep 18 08:00 . drwxr-xr-x 7 root root 4096 Oct 7 17:05 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore 9ebf5fb Initial workspace
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-10-07T17:05:59.920Z",
"name": "bash",
"turn": 1,
"input": {
"command": "pwd; ls -la; git log --oneline -5 2>/dev/null | head"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8ecd2cdb3102a231",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-07T17:05:59.920Z",
"turn": 1,
"output": {
"content": [
{
"text": "/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Oct 7 17:05 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n9ebf5fb Initial workspace\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8ecd2cdb3102a231",
"is_error": false,
"tool_kind": "shell"
}cd /sandbox/repo 2>/dev/null && cat README.md 2>/dev/null | head -50; echo "---PKG---"; cat package.json 2>/dev/null
Failed---PKG---
---PKG--- Command exited with code 1
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-07T17:05:59.920Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo 2>/dev/null && cat README.md 2>/dev/null | head -50; echo \"---PKG---\"; cat package.json 2>/dev/null"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8d32ad708043fd7f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 5,
"ts": "2026-10-07T17:05:59.920Z",
"turn": 1,
"output": {
"content": [
{
"text": "---PKG---\n\n\nCommand exited with code 1",
"type": "text"
}
],
"details": {}
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8d32ad708043fd7f",
"is_error": true,
"tool_kind": "shell"
}›Thinking…
The repository is basically empty. The user wants to build a simple example using Resend (an email API service). Let me think about this.
Resend is a hosted email API service. Let me check whether there's internet access and whether I can install the SDK. I'll check the environment.
What the user is asking for is:
- Build a simple example using Resend
- Tell them how the pricing mechanism works
- Concisely tell them whether it would be easy for me to manage this product
- Let them know if I get blocked
- If this product doesn't have a developer workflow that I can handle, say so frankly and stop
- Keep it lightweight: use the hosted product via SDK or API
- Don't spin up a local service stack or wait on long-running commands; if either is needed in the quickstart, say so frankly and stop
First, let me check the environment—internet access, node version, etc.
node --version 2>/dev/null; npm --version 2>/dev/null; echo "---NET---"; curl -s -m 8 -o /dev/null -w "%{http_code}" https://registry.npmjs.org/ 2>&1; echo; curl -s -m 8 -o /dev/null -w "%{http_code}" https://api.resend.com/ 2>&1; echov22.23.2
v22.23.2 10.9.8 ---NET--- 200 200
Recorded tool call
{
"type": "tool_call",
"seq": 9,
"ts": "2026-10-07T17:06:05.099Z",
"name": "bash",
"turn": 1,
"input": {
"command": "node --version 2>/dev/null; npm --version 2>/dev/null; echo \"---NET---\"; curl -s -m 8 -o /dev/null -w \"%{http_code}\" https://registry.npmjs.org/ 2>&1; echo; curl -s -m 8 -o /dev/null -w \"%{http_code}\" https://api.resend.com/ 2>&1; echo"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a942eb560dde482d",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-10-07T17:06:05.888Z",
"turn": 1,
"output": {
"content": [
{
"text": "v22.23.2\n10.9.8\n---NET---\n200\n200\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a942eb560dde482d",
"is_error": false,
"tool_kind": "shell"
}echo "RESEND_API_KEY set: ${RESEND_API_KEY:+yes}${RESEND_API_KEY:-no}"; env | grep -i resend; cat .gitignoreRESEND_API_KEY set: no
RESEND_API_KEY set: no # Keep generated and vendored files out of source diffs. # Logs / OS cruft *.log .DS_Store # JavaScript / TypeScript node_modules/ .next/ dist/ build/ coverage/ # Python .venv/ venv/ __pycache__/ *.py[cod] .pytest_cache/ *.egg-info/ # Rust target/ # Go / PHP / Ruby vendored deps vendor/ .bundle/ # Java / Kotlin / Scala .gradle/ # .NET bin/ obj/ # Elixir _build/ deps/ # Dart / Flutter .dart_tool/
Recorded tool call
{
"type": "tool_call",
"seq": 12,
"ts": "2026-10-07T17:06:05.099Z",
"name": "bash",
"turn": 1,
"input": {
"command": "echo \"RESEND_API_KEY set: ${RESEND_API_KEY:+yes}${RESEND_API_KEY:-no}\"; env | grep -i resend; cat .gitignore"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b38138d88c168d7f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 13,
"ts": "2026-10-07T17:06:05.099Z",
"turn": 1,
"output": {
"content": [
{
"text": "RESEND_API_KEY set: no\n# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/\n.next/\ndist/\nbuild/\ncoverage/\n\n# Python\n.venv/\nvenv/\n__pycache__/\n*.py[cod]\n.pytest_cache/\n*.egg-info/\n\n# Rust\ntarget/\n\n# Go / PHP / Ruby vendored deps\nvendor/\n.bundle/\n\n# Java / Kotlin / Scala\n.gradle/\n\n# .NET\nbin/\nobj/\n\n# Elixir\n_build/\ndeps/\n\n# Dart / Flutter\n.dart_tool/\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b38138d88c168d7f",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Good. I have the following:
- Node v22, npm 10
- Internet access (both npm registry and Resend API return 200)
- RESEND_API_KEY is not set
Resend is a hosted email API. It has a developer workflow that I can execute (SDK/API). The quickstart doesn't require a local service stack or long-running commands — just install the SDK and call the API. So this is doable.
Let me build a simple example. Resend's SDK is resend on npm. Let me set up a minimal Node project with a simple script that sends an email using the Resend SDK.
Let me install the SDK and create the example. What I'll create:
- package.json
- a send script (JS or TS)
- a README explaining pricing and usage
Let me think about what "a simple example" means. The Resend quickstart is usually:
- Install the
resendpackage - Create an API key
- Send an email
Let me build a minimal example. I'll use the SDK. Since there's no API key, I can't actually send a real email, but I can write the code and show that it works up to the point where credentials are needed. Let me be transparent about that.
Let me install the resend package.
Environment looks good: Node v22, npm works, network reaches both the npm registry and api.resend.com (200). No RESEND_API_KEY is set. Resend is a hosted email API with a normal SDK/API developer workflow and no local stack or long-running process needed — so I'll proceed.
Let me set up a minimal project and install the official SDK.
cd /sandbox/repo && npm init -y >/dev/null 2>&1 && npm install resend 2>&1 | tail -5; echo "---VER---"; node -e "console.log(require('./node_modules/resend/package.json').version)"added 5 packages, and audited 6 packages in 3s
added 5 packages, and audited 6 packages in 3s found 0 vulnerabilities ---VER--- 6.32.1
Recorded tool call
{
"type": "tool_call",
"seq": 18,
"ts": "2026-10-07T17:06:11.375Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npm init -y >/dev/null 2>&1 && npm install resend 2>&1 | tail -5; echo \"---VER---\"; node -e \"console.log(require('./node_modules/resend/package.json').version)\""
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a560d951f79348e3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 20,
"ts": "2026-10-07T17:06:15.802Z",
"turn": 1,
"output": {
"content": [
{
"text": "\nadded 5 packages, and audited 6 packages in 3s\n\nfound 0 vulnerabilities\n---VER---\n6.32.1\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a560d951f79348e3",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
SDK v6.32.1 is already installed. Let's check the SDK's API surface to correctly grasp how to call it (the Resend SDK has changed across versions).
SDK v6.32.1 installed. Let me verify the current API surface so my example matches this version.
cd /sandbox/repo && node -e "const {Resend}=require('resend'); const r=new Resend('re_test'); console.log('has emails:', !!(r.emails&&r.emails.send)); console.log('methods:', Object.keys(r)); console.log('emails keys:', Object.keys(r.emails||{}));" 2>&1 | headhas emails: true
has emails: true methods: [ 'key', 'segments', 'apiKeys', 'audiences', 'automations', 'batch', 'broadcasts', 'contactProperties', 'contacts', 'domains', 'emails', 'events', 'logs', 'oauthGrants', 'suppressions', 'templates',
Recorded tool call
{
"type": "tool_call",
"seq": 24,
"ts": "2026-10-07T17:06:18.169Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && node -e \"const {Resend}=require('resend'); const r=new Resend('re_test'); console.log('has emails:', !!(r.emails&&r.emails.send)); console.log('methods:', Object.keys(r)); console.log('emails keys:', Object.keys(r.emails||{}));\" 2>&1 | head"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-91907eb6f47dbbd0",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 25,
"ts": "2026-10-07T17:06:18.169Z",
"turn": 1,
"output": {
"content": [
{
"text": "has emails: true\nmethods: [\n 'key', 'segments',\n 'apiKeys', 'audiences',\n 'automations', 'batch',\n 'broadcasts', 'contactProperties',\n 'contacts', 'domains',\n 'emails', 'events',\n 'logs', 'oauthGrants',\n 'suppressions', 'templates',\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-91907eb6f47dbbd0",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
r.emails.send exists. Good. So let's create a sample script. I'll make an ESM script (since package.json's type might be commonjs by default). Let me check the package.json that npm init created.
Actually, let's write a clean sample. Things to create:
send-email.js— a simple script that sends an email using the SDKcheck-pricing.jsmight not be necessary. The pricing explanation goes in the README.
No wait, let's keep it simple. Things to create:
send-email.mjs(ESM) — reads RESEND_API_KEY from env and sends a simple email- Update package.json to add a script
README.md— usage, pricing, and admin notes
Let me check the current package.json.
emails.send is available. Now I'll write a minimal, runnable example plus a README. Let me check the generated package.json first.
✓read /sandbox/repo/package.json✓└{"content":[{"text":"{\n \"name\": \"repo\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \…ctrl+o
{"content":[{"text":"{\n \"name\": \"repo\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"keywords\": [],\n \"author\": \"\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"resend\": \"^6.32.1\"\n }\n}\n","type":"text"}]}›Thinking…
Let's set up package.json properly. Make it ESM, add a send script. Next, create send-email.mjs and README.md.
Let's update package.json:
- name: resend-example
- type: module
- scripts: send
Next, write the sample script. It should be robust: check the API key, send the email, handle errors, and display the result.
Let's write a clean example that demonstrates the core quickstart. Make it able to handle cases where the API key isn't set properly (so that instead of crashing, it displays clear instructions).
File edits
1 file
Writtenpackage.jsonView changes
/sandbox/repo/package.json
Written content · previous contents were not recorded
{"name": "resend-example","version": "1.0.0","description": "Minimal example of sending email with the Resend SDK","type": "module","main": "send-email.mjs","scripts": {"send": "node send-email.mjs"},"license": "ISC","dependencies": {"resend": "^6.32.1"}}
Source: write · chatcmpl-tool-a7c900ae5add3e89
Recorded tool call
{
"type": "tool_call",
"seq": 33,
"ts": "2026-10-07T17:06:29.574Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/package.json",
"content": "{\n \"name\": \"resend-example\",\n \"version\": \"1.0.0\",\n \"description\": \"Minimal example of sending email with the Resend SDK\",\n \"type\": \"module\",\n \"main\": \"send-email.mjs\",\n \"scripts\": {\n \"send\": \"node send-email.mjs\"\n },\n \"license\": \"ISC\",\n \"dependencies\": {\n \"resend\": \"^6.32.1\"\n }\n}\n"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a7c900ae5add3e89",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 36,
"ts": "2026-10-07T17:06:29.574Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 297 bytes to /sandbox/repo/package.json",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a7c900ae5add3e89",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtensend-email.mjsView changes
/sandbox/repo/send-email.mjs
Written content · previous contents were not recorded
// Minimal Resend example: send a single transactional email.//// Usage:// export RESEND_API_KEY="re_xxx"// npm run send//// Optional overrides (defaults are Resend's shared test sender):// FROM - verified sender, e.g. you@yourdomain.com// TO - recipient addressimport { Resend } from "resend";const apiKey = process.env.RESEND_API_KEY;if (!apiKey) {console.error("RESEND_API_KEY is not set.\n" +"Create one at https://resend.com/api-keys, then:\n" +' export RESEND_API_KEY="re_xxx" && npm run send');process.exit(1);}const resend = new Resend(apiKey);// "onboarding@resend.dev" only works while your account is in test mode and// the recipient is the address you signed up with. For real sends, verify a// domain and use FROM=you@yourdomain.com.const from = process.env.FROM ?? "onboarding@resend.dev";const to = process.env.TO ?? "delivered@resend.dev";try {const { data, error } = await resend.emails.send({from,to,subject: "Hello from Resend",html: "<p>Hi there — this email was sent with the Resend SDK.</p>",});if (error) {console.error("Resend returned an error:", error);process.exit(1);}console.log("Sent. Email id:", data.id);} catch (err) {console.error("Request failed:", err.message);process.exit(1);}
Source: write · chatcmpl-tool-a673cedc4bb93c0a
Recorded tool call
{
"type": "tool_call",
"seq": 34,
"ts": "2026-10-07T17:06:29.574Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/send-email.mjs",
"content": "// Minimal Resend example: send a single transactional email.\n//\n// Usage:\n// export RESEND_API_KEY=\"re_xxx\"\n// npm run send\n//\n// Optional overrides (defaults are Resend's shared test sender):\n// FROM - verified sender, e.g. you@yourdomain.com\n// TO - recipient address\n\nimport { Resend } from \"resend\";\n\nconst apiKey = process.env.RESEND_API_KEY;\nif (!apiKey) {\n console.error(\n \"RESEND_API_KEY is not set.\\n\" +\n \"Create one at https://resend.com/api-keys, then:\\n\" +\n ' export RESEND_API_KEY=\"re_xxx\" && npm run send'\n );\n process.exit(1);\n}\n\nconst resend = new Resend(apiKey);\n\n// \"onboarding@resend.dev\" only works while your account is in test mode and\n// the recipient is the address you signed up with. For real sends, verify a\n// domain and use FROM=you@yourdomain.com.\nconst from = process.env.FROM ?? \"onboarding@resend.dev\";\nconst to = process.env.TO ?? \"delivered@resend.dev\";\n\ntry {\n const { data, error } = await resend.emails.send({\n from,\n to,\n subject: \"Hello from Resend\",\n html: \"<p>Hi there — this email was sent with the Resend SDK.</p>\",\n });\n\n if (error) {\n console.error(\"Resend returned an error:\", error);\n process.exit(1);\n }\n\n console.log(\"Sent. Email id:\", data.id);\n} catch (err) {\n console.error(\"Request failed:\", err.message);\n process.exit(1);\n}\n"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a673cedc4bb93c0a",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 35,
"ts": "2026-10-07T17:06:29.574Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 1335 bytes to /sandbox/repo/send-email.mjs",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a673cedc4bb93c0a",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Alright, let's run the example and verify it (since there's no API key, a clear message should be displayed and it should exit with exit code 1 — that's fine and expected). Let's check whether it can be loaded and executed without any syntax errors.
Let me verify the script runs cleanly (it should print the "no key" guidance since no key is set — that's the expected path).
cd /sandbox/repo && npm run send 2>&1 | tail -8; echo "exit=${PIPESTATUS[0]}"> resend-example@1.0.0 send
> resend-example@1.0.0 send > node send-email.mjs RESEND_API_KEY is not set. Create one at https://resend.com/api-keys, then: export RESEND_API_KEY="re_xxx" && npm run send exit=1
Recorded tool call
{
"type": "tool_call",
"seq": 40,
"ts": "2026-10-07T17:06:31.630Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npm run send 2>&1 | tail -8; echo \"exit=${PIPESTATUS[0]}\""
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b09ac29332048cb3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 41,
"ts": "2026-10-07T17:06:32.062Z",
"turn": 1,
"output": {
"content": [
{
"text": "\n> resend-example@1.0.0 send\n> node send-email.mjs\n\nRESEND_API_KEY is not set.\nCreate one at https://resend.com/api-keys, then:\n export RESEND_API_KEY=\"re_xxx\" && npm run send\nexit=1\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b09ac29332048cb3",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The script runs and properly handles the case where the key is missing. Let me also verify with a fake key that the request is actually sent to the API and returns an authentication error (this will prove that the network path and SDK calls work end-to-end, and just require real credentials). This is a quick, non-long-running call.
Now let me confirm the SDK call actually reaches Resend's API end-to-end using a dummy key (expect an auth error — proving the code path works and only real credentials are missing). This is a quick, non-blocking request.
cd /sandbox/repo && RESEND_API_KEY="re_dummy_not_real" timeout 15 node send-email.mjs 2>&1 | tail -6; echo "exit=${PIPESTATUS[0]}"}
}
Resend returned an error: {
message: 'API key is invalid',
name: 'validation_error',
statusCode: 401
}
exit=1
Recorded tool call
{
"type": "tool_call",
"seq": 45,
"ts": "2026-10-07T17:06:35.590Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && RESEND_API_KEY=\"re_dummy_not_real\" timeout 15 node send-email.mjs 2>&1 | tail -6; echo \"exit=${PIPESTATUS[0]}\""
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-96e3426d42dfb434",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 46,
"ts": "2026-10-07T17:06:35.976Z",
"turn": 1,
"output": {
"content": [
{
"text": "}\nResend returned an error: {\n message: 'API key is invalid',\n name: 'validation_error',\n statusCode: 401\n}\nexit=1\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-96e3426d42dfb434",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The SDK reached the actual Resend API and received a 401 API key is invalid response. This confirmed the following:
- The code is correct
- The network path works
- The only thing missing is a real API key
The example is complete and verified as far as possible without real credentials. I'll create a concise README covering usage, pricing, and manageability, and then report back.
Getting the pricing right. Resend's pricing (as of my knowledge):
- Free plan: 3,000 emails per month, 100 emails per day, 1 custom domain, limited sending.
- Pro plan: $20/month for 50,000 emails, with additional emails billed on a metered/overage basis. Higher daily caps, more domains, etc.
- Scale / Enterprise plans: For larger volumes, custom pricing.
- Pricing is based on email volume (number of emails sent) and plan tier. Overages are billed at tier-specific per-email rates.
- There's a distinction: marketing/broadcast emails and transactional. The actual core billing is emails sent per month.
I should be careful not to state exact figures as gospel since pricing changes. I'll present the model (tier + volume-based with overage metering), give approximate current numbers, and refer to the official pricing page for authoritative/latest info. Let's make it clear that the numbers are approximate and need verification.
Actually, let me reconsider — I should provide accurate and useful info while flagging that pricing changes and they should check resend.com/pricing. Since I have network access, I might be able to fetch the pricing page to get the latest figures. Let me quickly give it a shot, though it's a marketing page (heavily JS-dependent). I'll try fetching it, but not rely on it. Let's do it quickly.
Confirmed: the code reaches Resend's live API and returns 401 API key is invalid with a dummy key — so the example is correct and only real credentials are missing. Let me try to pull current pricing numbers rather than rely on memory.
cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | tr '>' '>\n' | grep -iE '\$[0-9]|emails/mo|per month|free|pro|scale|/month|emails per' | sed 's/<[^>]*>//g' | grep -iE '\$|emails' | head -40
(no output)
(no output) [Showing lines 17-16 of 16 (50.0KB limit). Full output: /tmp/pi-bash-d2c99773c1184aa8.log]
Recorded tool call
{
"type": "tool_call",
"seq": 50,
"ts": "2026-10-07T17:07:15.920Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | tr '>' '>\\n' | grep -iE '\\$[0-9]|emails/mo|per month|free|pro|scale|/month|emails per' | sed 's/<[^>]*>//g' | grep -iE '\\$|emails' | head -40"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a1a8de9f454f0d2f",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 52,
"ts": "2026-10-07T17:07:17.394Z",
"turn": 1,
"output": {
"content": [
{
"text": "(no output)\n\n[Showing lines 17-16 of 16 (50.0KB limit). Full output: /tmp/pi-bash-d2c99773c1184aa8.log]",
"type": "text"
}
],
"details": {
"truncation": {
"content": "",
"maxBytes": 51200,
"maxLines": 2000,
"truncated": true,
"totalBytes": 242562,
"totalLines": 16,
"outputBytes": 0,
"outputLines": 0,
"truncatedBy": "bytes",
"lastLinePartial": false,
"firstLineExceedsLimit": false
},
"fullOutputPath": "/tmp/pi-bash-d2c99773c1184aa8.log"
}
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-a1a8de9f454f0d2f",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The pricing page heavily uses JavaScript, so scraping it didn't yield anything useful. Let me try a different approach—maybe there's a JSON endpoint, or perhaps I can check raw text. No, let's not dig in too deep. I'll try to fetch the page text once more with a simpler method, and if that fails, I'll fall back on approximate known figures with a clear disclaimer and a link to the official page.
cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | python3 -c "import sys,re,html; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); t=html.unescape(t); t=re.sub(r'\s+',' ',t); import re as r; print('\n'.join(m for m in r.findall(r'.{0,25}(?:\\\$[0-9][0-9,.]*|emails/mo|emails per month|per month|Free|Pro plan|Scale).{0,25}', t))[:40])" 2>&1 | head -40ricing Add-ons Domains - $20 / mo Your p
ricing Add-ons Domains - $20 / mo Your p
Recorded tool call
{
"type": "tool_call",
"seq": 55,
"ts": "2026-10-07T17:07:21.149Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | python3 -c \"import sys,re,html; t=sys.stdin.read(); t=re.sub(r'<script.*?</script>','',t,flags=re.S); t=re.sub(r'<style.*?</style>','',t,flags=re.S); t=re.sub(r'<[^>]+>',' ',t); t=html.unescape(t); t=re.sub(r'\\s+',' ',t); import re as r; print('\\n'.join(m for m in r.findall(r'.{0,25}(?:\\\\\\$[0-9][0-9,.]*|emails/mo|emails per month|per month|Free|Pro plan|Scale).{0,25}', t))[:40])\" 2>&1 | head -40"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-bddef880e2a08af5",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 57,
"ts": "2026-10-07T17:07:23.756Z",
"turn": 1,
"output": {
"content": [
{
"text": "ricing Add-ons Domains - $20 / mo Your p\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-bddef880e2a08af5",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The page content is mostly rendered client-side, so all I could get was a fragment about the domain add-on ($20/month). This backs up the fact that the domain is a $20/month add-on. Without a more thorough scrape, I can't reliably get all the latest plan figures.
Based on known pricing info, I'll provide an accurate description of the model, clearly noting that the numbers are approximate and subject to change, and attach a link to the official page. I've confirmed that the custom domain add-on is $20/month. Let me try one more targeted extraction of plan names and prices from the raw HTML/JSON (like the NEXT_DATA JSON blob).
cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | grep -oiE '(free|pro|scale|enterprise|startup|business)[^<]{0,4}|\$[0-9][0-9,.]*|"[0-9]+ emails|emails/mo|per month|/month' | sort | uniq -c | sort -rn | head -3019 Propert
19 Propert
12 protect
11 provide
10 product
8 prototy
8 free and
7 Enterprise
6 scale up
6 propert
6 promise
6 progres
6 profit
6 free tri
6 Scale, an
6 Scale
6 Promise
6 Pro
6 Free pla
6 Free and
6 Free
6 $1
5 Scale\"}]
5 Scale pla
5 Pro\"}]
5 Free\"}]
5 Enterprise\"}]
5 $2
4 promoti
4 free-for
4 Provide
Recorded tool call
{
"type": "tool_call",
"seq": 60,
"ts": "2026-10-07T17:07:27.215Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && curl -s -m 12 https://resend.com/pricing 2>/dev/null | grep -oiE '(free|pro|scale|enterprise|startup|business)[^<]{0,4}|\\$[0-9][0-9,.]*|\"[0-9]+ emails|emails/mo|per month|/month' | sort | uniq -c | sort -rn | head -30"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8977f8224af0a130",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 62,
"ts": "2026-10-07T17:07:28.056Z",
"turn": 1,
"output": {
"content": [
{
"text": " 19 Propert\n 12 protect\n 11 provide\n 10 product\n 8 prototy\n 8 free and\n 7 Enterprise\n 6 scale up \n 6 propert\n 6 promise\n 6 progres\n 6 profit \n 6 free tri\n 6 Scale, an\n 6 Scale\n 6 Promise\n 6 Pro\n 6 Free pla\n 6 Free and\n 6 Free\n 6 $1\n 5 Scale\\\"}]\n 5 Scale pla\n 5 Pro\\\"}]\n 5 Free\\\"}]\n 5 Enterprise\\\"}]\n 5 $2\n 4 promoti\n 4 free-for\n 4 Provide\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-8977f8224af0a130",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
From this fragmentary data, I can confirm the plan tiers: Free, Pro, Scale, Enterprise. The dollar amounts are mostly truncated ($1, $2...). The page is rendered client-side. Confirmed items:
- Plans: Free, Pro, Scale, Enterprise
- Custom domain add-on: $20/month
- Free tier exists
I'll present an accurate explanation of the pricing model along with approximate figures, add a clear note that the user should check the official page for the latest pricing, and also mention the confirmed $20/month domain add-on. This is honest and useful. Now let me write the README and wrap up.
Let me write a concise, clear README.
I have enough to describe pricing accurately (plan tiers Free/Pro/Scale/Enterprise confirmed; custom-domain add-on confirmed at $20/mo). Exact volume figures render client-side, so I'll give the model + approximate numbers and point to the authoritative page. Writing the README now.
File edits
1 file
WrittenREADME.mdView changes
/sandbox/repo/README.md
Written content · previous contents were not recorded
# Resend — minimal exampleA tiny Node example that sends one transactional email through the officialResend SDK (`resend`). No local services, no long-running processes — it's asingle request to Resend's hosted API.## Files- `send-email.mjs` — sends one email via `resend.emails.send(...)`.- `package.json` — pins the `resend` dependency and adds `npm run send`.## Run it```bashnpm installexport RESEND_API_KEY="re_xxx" # create one at https://resend.com/api-keysnpm run send```Optional overrides:```bashFROM=you@yourdomain.com TO=someone@example.com npm run send```### About the default senderThe script defaults to `from: onboarding@resend.dev`, which only works whileyour account is in **test mode** and the recipient is the address you signed upwith. For real sends, verify your own domain in the Resend dashboard and use`FROM=you@yourdomain.com`.### Verifying it works without real credentialsWith a dummy key the request still reaches Resend and returns`401 API key is invalid`, which confirms the code path is correct:```bashRESEND_API_KEY="re_dummy" npm run send# -> Resend returned an error: { name: 'validation_error', statusCode: 401 }```## How Resend pricing worksResend is a hosted email API; you pay for the **hosted service**, not forrunning anything yourself. Billing is **plan tier + monthly email volume**:- **Free** — a small monthly allowance (roughly ~3,000 emails/mo with a lowdaily cap), enough to develop and test. Uses Resend's shared sender until youadd a domain.- **Pro** — paid entry tier (around **$20/mo**) with a larger monthly volume(roughly ~50,000 emails) and higher daily limits.- **Scale / Enterprise** — higher/custom volume tiers for large senders, withvolume-based pricing and SLAs.- **Overages** — sending beyond your plan's included volume is metered andbilled per email at your tier's rate.- **Add-ons** — extra verified custom domains are billed separately(**$20/mo per additional domain**, confirmed on the pricing page).Figures above are approximate and change over time — treat**https://resend.com/pricing** as the source of truth. The key point forbudgeting: cost scales with **emails sent per month** and the **plan tier**, andcustom domains are an extra monthly fee.## Is this easy for me (the agent) to manage?Yes — this is about as low-friction as a hosted product gets for me:- **Pure SDK/API, no infra.** One `npm install`, one function call. No Docker,no database, no local servers, nothing long-running to babysit.- **Fast, verifiable feedback.** Every change is a single quick HTTP requestthat returns a clear JSON result or error, so I can iterate and self-checkimmediately.- **Simple config.** Behavior is driven by a couple of env vars(`RESEND_API_KEY`, optional `FROM`/`TO`).The only thing I **can't** do autonomously is the account-side setup: creatingthe API key and verifying a sending domain happen in the Resend web dashboardand need a human. Once `RESEND_API_KEY` is in the environment, everything hereis fully scriptable and easy to manage.
Source: write · chatcmpl-tool-9760b299ae6d701d
Recorded tool call
{
"type": "tool_call",
"seq": 66,
"ts": "2026-10-07T17:07:40.190Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/README.md",
"content": "# Resend — minimal example\n\nA tiny Node example that sends one transactional email through the official\nResend SDK (`resend`). No local services, no long-running processes — it's a\nsingle request to Resend's hosted API.\n\n## Files\n\n- `send-email.mjs` — sends one email via `resend.emails.send(...)`.\n- `package.json` — pins the `resend` dependency and adds `npm run send`.\n\n## Run it\n\n```bash\nnpm install\nexport RESEND_API_KEY=\"re_xxx\" # create one at https://resend.com/api-keys\nnpm run send\n```\n\nOptional overrides:\n\n```bash\nFROM=you@yourdomain.com TO=someone@example.com npm run send\n```\n\n### About the default sender\n\nThe script defaults to `from: onboarding@resend.dev`, which only works while\nyour account is in **test mode** and the recipient is the address you signed up\nwith. For real sends, verify your own domain in the Resend dashboard and use\n`FROM=you@yourdomain.com`.\n\n### Verifying it works without real credentials\n\nWith a dummy key the request still reaches Resend and returns\n`401 API key is invalid`, which confirms the code path is correct:\n\n```bash\nRESEND_API_KEY=\"re_dummy\" npm run send\n# -> Resend returned an error: { name: 'validation_error', statusCode: 401 }\n```\n\n## How Resend pricing works\n\nResend is a hosted email API; you pay for the **hosted service**, not for\nrunning anything yourself. Billing is **plan tier + monthly email volume**:\n\n- **Free** — a small monthly allowance (roughly ~3,000 emails/mo with a low\n daily cap), enough to develop and test. Uses Resend's shared sender until you\n add a domain.\n- **Pro** — paid entry tier (around **$20/mo**) with a larger monthly volume\n (roughly ~50,000 emails) and higher daily limits.\n- **Scale / Enterprise** — higher/custom volume tiers for large senders, with\n volume-based pricing and SLAs.\n- **Overages** — sending beyond your plan's included volume is metered and\n billed per email at your tier's rate.\n- **Add-ons** — extra verified custom domains are billed separately\n (**$20/mo per additional domain**, confirmed on the pricing page).\n\nFigures above are approximate and change over time — treat\n**https://resend.com/pricing** as the source of truth. The key point for\nbudgeting: cost scales with **emails sent per month** and the **plan tier**, and\ncustom domains are an extra monthly fee.\n\n## Is this easy for me (the agent) to manage?\n\nYes — this is about as low-friction as a hosted product gets for me:\n\n- **Pure SDK/API, no infra.** One `npm install`, one function call. No Docker,\n no database, no local servers, nothing long-running to babysit.\n- **Fast, verifiable feedback.** Every change is a single quick HTTP request\n that returns a clear JSON result or error, so I can iterate and self-check\n immediately.\n- **Simple config.** Behavior is driven by a couple of env vars\n (`RESEND_API_KEY`, optional `FROM`/`TO`).\n\nThe only thing I **can't** do autonomously is the account-side setup: creating\nthe API key and verifying a sending domain happen in the Resend web dashboard\nand need a human. Once `RESEND_API_KEY` is in the environment, everything here\nis fully scriptable and easy to manage.\n"
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-9760b299ae6d701d",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 67,
"ts": "2026-10-07T17:07:40.190Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 3111 bytes to /sandbox/repo/README.md",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-9760b299ae6d701d",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let's do a final check to make sure everything is in place.
cd /sandbox/repo && ls -1 *.mjs *.json *.md 2>/dev/null && echo "---syntax check---" && node --check send-email.mjs && echo "OK"
README.md
README.md package-lock.json package.json send-email.mjs ---syntax check--- OK
Recorded tool call
{
"type": "tool_call",
"seq": 70,
"ts": "2026-10-07T17:07:41.986Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && ls -1 *.mjs *.json *.md 2>/dev/null && echo \"---syntax check---\" && node --check send-email.mjs && echo \"OK\""
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b62b3d9bbb51e8d3",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 71,
"ts": "2026-10-07T17:07:41.986Z",
"turn": 1,
"output": {
"content": [
{
"text": "README.md\npackage-lock.json\npackage.json\nsend-email.mjs\n---syntax check---\nOK\n",
"type": "text"
}
]
},
"run_id": "cmuyczp9400320iszn0sir7qz",
"tool_id": "chatcmpl-tool-b62b3d9bbb51e8d3",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Everything is in place and verified. Let's deliver a concise summary to the user answering the three questions:
- Building a simple example ✓
- How the pricing structure works ✓
- Whether it's easy for me to manage ✓
- Whether I got stuck ✓
I didn't get stuck. Resend has an actionable developer workflow (SDK/API), a lightweight setup, and no local stack or long-running commands needed. So I went ahead with it.
Let me write the concise final answer.
Done — nothing blocked me. Resend has a real developer workflow I can act on (SDK/API), it's light (one npm install, one HTTP call), and the quickstart needs no local stack or long-running process, so I built it.
What I built (/sandbox/repo)
send-email.mjs— sends one email via the official SDK:resend.emails.send({ from, to, subject, html }), with clear handling for a missing key and API errors.package.json— pinsresend@^6.32.1, addsnpm run send, ESM.README.md— usage, pricing, and manageability notes.
Run it:
export RESEND_API_KEY="re_xxx" # https://resend.com/api-keys
npm run send
Verified: with a dummy key the request reaches Resend's live API and returns 401 API key is invalid — so the code path is correct end-to-end. The only missing piece is a real key (account setup happens in the web dashboard, which needs you).
How pricing works
Resend is a hosted email API — you pay for the service, not to run anything yourself. Billing = plan tier + monthly email volume:
- Free — small allowance (~3,000 emails/mo, low daily cap) for dev/test.
- Pro — paid entry tier (~$20/mo) with larger volume (~50k emails) and higher limits.
- Scale / Enterprise — higher/custom volume tiers with volume-based pricing.
- Overages — beyond included volume, metered per email.
- Add-on — extra verified domains are $20/mo each (confirmed on their page).
Numbers are approximate and change — https://resend.com/pricing is the source of truth. Rule of thumb: cost scales with emails sent/month and tier, plus a monthly fee per custom domain.
Easy for me to manage?
Yes — very. No infra (no Docker/DB/servers), single quick HTTP call per change with clear JSON feedback so I can iterate and self-check fast, and config is just a couple of env vars. The one thing I can't do autonomously is account-side setup (creating the API key, verifying a sending domain) since that's in the web dashboard. Once RESEND_API_KEY is set, everything here is fully scriptable.
One caveat worth flagging: I couldn't send a real email because there's no RESEND_API_KEY in the environment — that requires you to create the key. Want me to add anything else, like a React Email template, batch sending, or webhook handling for delivery events?
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents