Skip to content
Resend Expert logo

Resend Expert

Send emails via Resend API - transactional, batch, contacts, domains, webhooks, React Email

SKILL.md

Full skill instructions

Resend Expert

Complete Resend email API expertise for transactional emails, marketing broadcasts, and contact management.

Quick Reference

Base URL: https://api.resend.com Auth: Authorization: Bearer $RESEND_API_KEY User's Key: re_Czsz1gQW_Dz4H2a9dH8tTjgteeDCjVujF Verified Domain: sigstack.dev (newsletter: [email protected])

Core Endpoints

Send Single Email

curl -X POST https://api.resend.com/emails \
  -H "Authorization: Bearer re_Czsz1gQW_Dz4H2a9dH8tTjgteeDCjVujF" \
  -H "Content-Type: application/​json" \
  -d '{
    "from": "SigStack Tips <[email protected]>",
    "to": ["[email protected]"],
    "subject": "Hello",
    "html": "<p>Email body</​p>"
  }'

Response: {"id": "uuid-string"}

Send Batch Emails (up to 100)

POST https://api.resend.com/emails/batch
# Body: Array of email objects (same structure as single)
# Note: No attachments or scheduling in batch mode

Get/​Update/​Cancel Email

GET    /​emails/​{id}        # Retrieve email details
PATCH  /​emails/​{id}        # Update scheduled email
DELETE /​emails/​{id}/​cancel # Cancel scheduled email

Node.js SDK

npm install resend
import { Resend } from 'resend';
const resend = new Resend('re_Czsz1gQW_Dz4H2a9dH8tTjgteeDCjVujF');

// Send email
const { data, error } = await resend.emails.send({
  from: 'SigStack <[email protected]>',
  to: ['[email protected]'],
  subject: 'Welcome!',
  html: '<h1>Hello World</​h1>',
});

// With React Email component
const { data, error } = await resend.emails.send({
  from: 'SigStack Tips <[email protected]>',
  to: ['[email protected]'],
  subject: 'Welcome!',
  react: <WelcomeEmail name="User" />,
});

// Batch send
const { data, error } = await resend.batch.send([
  { from: '...', to: ['...'], subject: '...', html: '...' },
  { from: '...', to: ['...'], subject: '...', html: '...' },
]);

Python SDK

pip install resend
import resend
resend.api_key = "re_Czsz1gQW_Dz4H2a9dH8tTjgteeDCjVujF"

# Send email
email = resend.Emails.send({
    "from": "SigStack <[email protected]>",
    "to": ["[email protected]"],
    "subject": "Hello",
    "html": "<p>Welcome!</​p>"
})

# With attachments
email = resend.Emails.send({
    "from": "...",
    "to": ["..."],
    "subject": "...",
    "html": "...",
    "attachments": [
        {"filename": "invoice.pdf", "content": base64_content}
    ]
})

Email Parameters

ParameterTypeRequiredDescription
fromstringYes"Name <email@domain>" format
tostring[]YesRecipients (max 50)
subjectstringYesSubject line
htmlstringNo*HTML body
textstringNo*Plain text (auto-generated from html if omitted)
reactReactNodeNo*React Email component (Node.js only)
ccstring[]NoCarbon copy
bccstring[]NoBlind carbon copy
reply_tostring[]NoReply-to addresses
scheduled_atstringNoISO 8601 or natural language
attachmentsarrayNo{filename, content, content_type?}
tagsarrayNo{name, value} pairs (256 char limit)
headersobjectNoCustom email headers

*One of html, text, or react required

Idempotency

-H "Idempotency-Key: unique-key-123"
# Prevents duplicate sends within 24 hours

Contact Management

# Create contact
POST /​contacts
{"email": "[email protected]", "first_name": "John", "unsubscribed": false}

# List contacts
GET /​contacts?limit=50

# Update contact
PATCH /​contacts/​{id}

# Delete contact
DELETE /​contacts/​{id}

Domain Management

# List domains
GET /​domains?limit=20

# Create domain
POST /​domains
{"name": "yourdomain.com"}

# Verify domain
POST /​domains/​{id}/​verify

# Delete domain
DELETE /​domains/​{id}

Webhooks

Events: email.sent, email.delivered, email.bounced, email.complained, email.opened, email.clicked, contact.created, contact.updated, contact.deleted

# Create webhook
POST /​webhooks
{"url": "https://yourapp.com/webhook", "events": ["email.delivered", "email.bounced"]}

Signature Verification (Node.js):

import { Webhook } from 'resend';
const webhook = new Webhook(process.env.RESEND_WEBHOOK_SECRET);
const payload = webhook.verify(body, headers);

Templates

# Create template
POST /​templates
{"name": "welcome", "html": "<p>Hello {{name}}</​p>"}

# Send with template
POST /​emails
{"from": "...", "to": ["..."], "template": {"id": "template-id", "variables": {"name": "John"}}}

API Keys

# Create key
POST /​api-keys
{"name": "production", "permission": "sending_access"}
# permission: "full_access" | "sending_access"

# List keys
GET /​api-keys

# Delete key
DELETE /​api-keys/​{id}

Rate Limits & Quotas

  • Free tier: 100 emails/​day, 3,000/​month
  • Batch: Max 100 emails per request
  • Recipients: Max 50 per email
  • Attachments: Max 40MB total

Testing Domain

Use [email protected] as sender for testing before domain verification.

SDKs

Node.js, Python, PHP, Laravel, Ruby, Go, Rust, Java, .NET

Common Patterns

Newsletter ([email protected]):

await resend.emails.send({
  from: 'SigStack Tips <[email protected]>',
  to: [subscriber.email],
  subject: 'Weekly Dev Tips',
  html: newsletterHtml,
});

Transactional ([email protected]):

await resend.emails.send({
  from: 'SigStack <[email protected]>',
  to: [user.email],
  subject: 'Reset your password',
  react: <PasswordResetEmail token={token} />,
});

Marketing broadcast:

// Use Broadcasts API for marketing campaigns with unsubscribe handling
POST /​broadcasts

Verified Sender Addresses

Use when: Sending transactional emails, marketing campaigns, contact management, domain setup, webhook configuration