Resend

Live

BEARER TOKEN

EMAIL

Communication

Resend gives your agent authenticated access to transactional email, broadcasts, and audiences, with every send attributed to a real user.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Resend
agent · Acme Q3
Run
Did the password reset emails go out?
S
resend_emails_list
72ms
Email agent
318 reset emails sent in the last hour. 316 delivered, 2 bounced on a dead domain.
Sources: 318 emails, last 60 minutes
resend
318 emails
18:29
Message Claude...

Tools your agent reaches for on Resend, scoped per user.

CALL ANY TOOL
Send transactional email, run broadcasts and automations, and manage domains and audiences with the signed-in user's own Resend access.
resend_api_key_create
Create api key
Create a new API key for the Resend account. The full token is only returned once in the response of this call and cannot be retrieved again afterwards, so it must be saved immediately. By default the key has full_access permission; restrict it to sending_access to only allow sending emails, optionally scoped to a single domain.
Parameters
Name
Type
Required
Description
name
string
Required
A descriptive name for the API key, e.g. "Production" or "CI Pipeline".
domain_id
string
Optional
Restrict this API key to only send emails from a specific verified domain. Only used when permission is sending_access; ignored otherwise.
permission
string
Optional
The API key's access level. "full_access" can create, delete, get, and update any resource. "sending_access" can only send emails. If omitted, the key defaults to full_access.
resend_api_key_delete
Delete api key
resend_api_key_list
List api key
resend_automation_get
Get automation
resend_automation_stop
Stop automation
resend_automation_update
Update automation
resend_broadcast_cancel
Cancel broadcast
resend_broadcast_recipients_list
List broadcast recipients
resend_broadcast_send
Send broadcast
resend_contact_create
Create contact
resend_contact_delete
Delete contact
resend_contact_get
Get contact
resend_contact_segment_add
Add contact segment
resend_contact_segment_remove
Remove contact segment
resend_contact_segments_list
List contact segments
resend_contact_topics_update
Update contact topics
resend_domain_claim
Domain claim
resend_domain_claim_get
Get domain claim
resend_domain_create
Create domain
resend_email_metrics_get
Get email metrics
resend_event_delete
Delete event
resend_event_list
List event
resend_event_update
Update event
resend_received_email_get
Get received email
resend_received_email_list
List received email
resend_suppression_create
Create suppression
resend_template_delete
Delete template
resend_template_get
Get template
resend_template_publish
Publish template
resend_topic_list
List topic

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Resend tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["resend"], toolNames: [
    "resend_api_key_create",
    "resend_api_key_delete",
    "resend_api_key_list"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Is the Salesforce sync healthy?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["resend"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Which data sources are connected?" }],
  tools,
});

// Execute the tool call with the user's vaulted Resend credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["resend"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Pull open Zendesk tickets created this week." }],
  tools,
});

// Tool call runs with the user's vaulted Resend credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["resend"] }, pageSize: 100,
});

const agent = new Agent({
  name: "resend_agent",
  model: "gemini-2.5-pro",
  instruction: "Work with Resend for the signed-in user.",
  tools,
});

await agent.run("What auth does the Shopify connector need?");
Try these prompts
Paste any prompt into your agent to get started.
Transactional
Copy the prompt
Copied
Did the password reset emails deliver in the last hour?
Copy the prompt
Copied
Show me the emails that bounced today.
Copy the prompt
Copied
Send a test email to my address using this template.
Broadcasts
Copy the prompt
Copied
List the broadcasts scheduled this week.
Copy the prompt
Copied
Show me the recipients on this broadcast.
Copy the prompt
Copied
Cancel the broadcast queued for tomorrow.
Setup
Copy the prompt
Copied
List the verified sending domains.
Copy the prompt
Copied
Create a new API key with send-only access.
Copy the prompt
Copied
Show me the audiences and their contact counts.
SEE HOW AUTH WORKS
Your users connect Resend once. Their credentials stay vaulted, every call is scope checked, and every send is logged.
1
Authorize
Your user connects
Resend
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Resend
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Resend
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Resend
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other connectors.
Support and Ops Teams
Email-to-calendar agent
Reads scheduling intent out of Gmail threads, resolves the times everyone actually has free, and creates the event on the user's own Google Calendar. No shared service account.
Engineering Teams
DevOps assistant agent
Polls GitHub for failing checks and stale PRs, opens Linear issues for the ones that need work, and posts a daily digest to Slack. It acts as the engineer, not a shared service account.
Engineering Teams
Engineering standup agent
Pulls commits from GitHub and GitLab, tracks issue movement in Jira, and posts a per-engineer standup brief to Slack. Each engineer's activity is read on their own delegated OAuth.
Engineering Teams
Auto release notes agent
Reads merged GitHub PRs, groups them into structured release notes, publishes the page to Notion, and announces the release in Slack. Every call runs on the engineer's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other connectors.
OPS
Email-to-calendar scheduling agent
Read scheduling intent out of Gmail threads, resolve mutual free time, and create the Google Calendar event.
ENGINEERING
DevOps assistant agent
Poll GitHub for failing checks and stale pull requests, open Linear issues for the ones that need work, and digest to Slack.
ENGINEERING
Engineering standup agent
Pull commits from GitHub and GitLab, track Jira issue movement, and post a per-engineer standup brief to Slack.
ENGINEERING
Auto-release notes agent
Group merged GitHub PRs into structured release notes, publish the page to Notion, and announce the release in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Resend token looks fine in a demo. In production every action looks like one service account, and you cannot tell who wired a source or ran a query. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Resend today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Can the agent create API keys?
Only if you scope it to. The api_key tools are separate from the send tools, so a send-only agent stays send-only.
How many Resend tools are available?
101 across emails, broadcasts, automations, audiences, contacts, domains, and API keys. The page shows a representative 30.
Is the send synchronous?
The send call returns an id immediately. Use the get and list tools to check delivery state as a separate scoped call.
Who is attributed for an agent-sent email?
The user who triggered the agent, because their credential is what Scalekit resolves at request time.
How are credentials isolated?
Per tenant in an encrypted vault, resolved at request time and never in LLM context.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""resend"": {
""url"": ""https://mcp.scalekit.com/resend"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.resend]
url = ""https://mcp.scalekit.com/resend""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""resend"": {
""url"": ""https://mcp.scalekit.com/resend"",
""type"": ""http""
}
}
}