Resend Expert
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: tips@sigstack.dev)
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 <tips@sigstack.dev>",
"to": ["recipient@example.com"],
"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 <hello@sigstack.dev>',
to: ['user@example.com'],
subject: 'Welcome!',
html: '<h1>Hello World</h1>',
});
// With React Email component
const { data, error } = await resend.emails.send({
from: 'SigStack Tips <tips@sigstack.dev>',
to: ['user@example.com'],
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 <hello@sigstack.dev>",
"to": ["user@example.com"],
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
from |
string | Yes | "Name <email@domain>" format |
to |
string[] | Yes | Recipients (max 50) |
subject |
string | Yes | Subject line |
html |
string | No* | HTML body |
text |
string | No* | Plain text (auto-generated from html if omitted) |
react |
ReactNode | No* | React Email component (Node.js only) |
cc |
string[] | No | Carbon copy |
bcc |
string[] | No | Blind carbon copy |
reply_to |
string[] | No | Reply-to addresses |
scheduled_at |
string | No | ISO 8601 or natural language |
attachments |
array | No | {filename, content, content_type?} |
tags |
array | No | {name, value} pairs (256 char limit) |
headers |
object | No | Custom 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": "user@example.com", "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 onboarding@resend.dev as sender for testing before domain verification.
SDKs
Node.js, Python, PHP, Laravel, Ruby, Go, Rust, Java, .NET
Common Patterns
Newsletter (tips@sigstack.dev):
await resend.emails.send({
from: 'SigStack Tips <tips@sigstack.dev>',
to: [subscriber.email],
subject: 'Weekly Dev Tips',
html: newsletterHtml,
});
Transactional (noreply@sigstack.dev):
await resend.emails.send({
from: 'SigStack <noreply@sigstack.dev>',
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
tips@sigstack.dev- newsletterhello@sigstack.dev- general contactnoreply@sigstack.dev- transactional*@sigstack.dev- any address works
Use when: Sending transactional emails, marketing campaigns, contact management, domain setup, webhook configuration