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
-
newsletter
-
general contact
-
transactional
-
*@sigstack.dev
-
any address works
Use when: Sending transactional emails, marketing campaigns, contact management, domain setup, webhook configuration