The SMASHSEND Emails API allows you to send transactional emails using three powerful methods: raw HTML emails for complete control, templated emails for consistency, and React component emails for dynamic, component-based email generation.
All email endpoints require authentication via API keys with api_user
scope. You can send individual emails or batch multiple emails in a single request.
Base URL: https://api.smashsend.com/v1
Rate Limits: Batch requests support up to 50 emails per request. Scheduling is supported up to 90 days in the future.
All requests must include your API key in the Authorization header:
Authorization: Bearer YOUR_API_KEY
Important: You can only send emails from verified email addresses or domains. If you attempt to send from an unverified address, you'll receive a 400 error with a list of allowed emails and domains.
To add custom domains for sending, visit your domain settings in the SMASHSEND dashboard and complete the domain verification process.
Send a single transactional email using either raw HTML content, a predefined template, or a React component. This endpoint supports both immediate sending and scheduled delivery.
Send emails with complete control over HTML content, styling, and structure. Perfect for custom designs and one-off emails.
Request Body (Raw Email)
{
"from": "support@yourdomain.com",
"fromName": "Your Company Support",
"to": "user@example.com",
"subject": "Welcome to Our Platform!",
"previewText": "Thanks for joining us - here's what to do next",
"replyTo": "noreply@yourdomain.com",
"html": "<html><body><h1>Welcome!</h1><p>Thanks for signing up...</p></body></html>",
"text": "Welcome! Thanks for signing up...",
"contactProperties": {
"firstName": "John",
"company": "Acme Corp"
},
"settings": {
"trackClicks": true,
"trackOpens": false
},
"groupBy": "welcome_emails",
"sendAt": "2024-03-20T15:30:00Z",
"idempotencyKey": "welcome_user_12345"
}
Request Example
curl -X POST "https://api.smashsend.com/v1/emails" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "support@yourdomain.com",
"fromName": "Your Company Support",
"to": "user@example.com",
"subject": "Welcome to Our Platform!",
"previewText": "Thanks for joining us - here'"'"'s what to do next",
"html": "<html><body><h1>Welcome!</h1><p>Thanks for signing up. Here are your next steps:</p><ul><li>Verify your email</li><li>Complete your profile</li><li>Explore our features</li></ul></body></html>",
"settings": {
"trackClicks": true,
"trackOpens": false
},
"groupBy": "welcome_emails"
}'
Use predefined email templates created in your SMASHSEND dashboard. Templates support variable substitution for personalization.
Request Body (Templated Email)
{
"template": "welcome_email",
"to": "user@example.com",
"variables": {
"firstName": "John",
"companyName": "Acme Corp",
"loginUrl": "https://app.yourdomain.com/login",
"supportEmail": "support@yourdomain.com"
},
"settings": {
"trackClicks": true,
"trackOpens": true
},
"sendAt": "2024-03-20T15:30:00Z",
"idempotencyKey": "welcome_user_12345"
}
Request Example
curl -X POST "https://api.smashsend.com/v1/emails" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "welcome_email",
"to": "user@example.com",
"variables": {
"firstName": "John",
"companyName": "Acme Corp",
"loginUrl": "https://app.yourdomain.com/login"
},
"settings": {
"trackClicks": true,
"trackOpens": true
}
}'
Generate emails using React components for dynamic, maintainable email templates. This approach renders React components to HTML and sends them as raw emails.
JavaScript Example with React Email
// First, install the @smashsend/node package
npm install @smashsend/node react-email
// Create your React email component
import { Html, Head, Body, Container, Heading, Text, Button } from '@react-email/components';
interface WelcomeEmailProps {
firstName: string;
companyName: string;
loginUrl: string;
}
export function WelcomeEmail({ firstName, companyName, loginUrl }: WelcomeEmailProps) {
return (
<Html>
<Head />
<Body style={{ fontFamily: 'Arial, sans-serif' }}>
<Container>
<Heading>Welcome to {companyName}!</Heading>
<Text>Hi {firstName},</Text>
<Text>
Thanks for joining us. We're excited to have you on board!
</Text>
<Button
href={loginUrl}
style={{
background: '#3b82f6',
color: 'white',
padding: '12px 20px',
borderRadius: '6px',
textDecoration: 'none'
}}
>
Get Started
</Button>
</Container>
</Body>
</Html>
);
}
// Send the email using SMASHSEND
import { render } from '@react-email/components';
import { SmashSend } from '@smashsend/node';
const smashsend = new Smashsend(process.env.SMASHSEND_API_KEY);
async function sendWelcomeEmail(userEmail: string, userData: any) {
// Render React component to HTML
const emailHtml = render(WelcomeEmail({
firstName: userData.firstName,
companyName: 'Your Company',
loginUrl: 'https://app.yourdomain.com/login'
}));
// Send as raw email
const result = await smashsend.emails.send({
from: 'support@yourdomain.com',
fromName: 'Your Company Support',
to: userEmail,
subject: 'Welcome to Your Company!',
html: emailHtml,
settings: {
trackClicks: true,
trackOpens: true
},
groupBy: 'welcome_emails'
});
return result;
}
Response (All Methods)
{
"email": {
"id": "trs_B7OSYsnTUVwBPOGrgYTjvSGS",
"messageId": "0102018e1234abcd-12345678-1234-1234-1234-123456789abc-000000@us-east-1.amazonses.com",
"status": "SENT",
"to": "user@example.com",
"type": "raw", // or "templated"
"from": "support@yourdomain.com", // only for raw emails
"subject": "Welcome to Our Platform!", // only for raw emails
"template": "welcome_email", // only for templated emails
"groupBy": "welcome_emails" // if provided
}
}
Send up to 50 emails in a single request. You can mix raw and templated emails in the same batch request.
Request Body
{
"emails": [
{
"from": "support@yourdomain.com",
"to": "user1@example.com",
"subject": "Welcome!",
"html": "<h1>Welcome User 1!</h1>",
"groupBy": "batch_welcome"
},
{
"template": "welcome_email",
"to": "user2@example.com",
"variables": {
"firstName": "Jane",
"companyName": "Acme Corp"
}
},
{
"from": "newsletter@yourdomain.com",
"to": "user3@example.com",
"subject": "Monthly Newsletter",
"html": "<h1>This Month's Updates</h1>",
"sendAt": "2024-03-20T09:00:00Z"
}
]
}
Request Example
curl -X POST "https://api.smashsend.com/v1/emails/batch" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"emails": [
{
"from": "support@yourdomain.com",
"to": "user1@example.com",
"subject": "Welcome User 1!",
"html": "<h1>Thanks for signing up!</h1><p>Welcome to our platform.</p>"
},
{
"template": "welcome_email",
"to": "user2@example.com",
"variables": {
"firstName": "Jane",
"companyName": "Acme Corp"
}
}
]
}'
Response
{
"emails": {
"successful": [
{
"id": "trs_B7OSYsnTUVwBPOGrgYTjvSGS",
"messageId": "0102018e1234abcd-12345678-1234-1234-1234-123456789abc-000000@us-east-1.amazonses.com",
"status": "SENT",
"to": "user1@example.com",
"type": "raw"
},
{
"id": "trs_C8PTZtoUVWxCQPHshZUkvTHT",
"messageId": "0102018e1234abcd-87654321-4321-4321-4321-987654321abc-000000@us-east-1.amazonses.com",
"status": "SENT",
"to": "user2@example.com",
"type": "templated",
"template": "welcome_email"
}
],
"failed": []
}
}
Raw Email Parameters
from
(required) - Sender email address or "Name <email@domain.com>" format
fromName
(optional) - Sender display name
to
(required) - Recipient email address
subject
(required) - Email subject line
html
(required) - HTML email content
text
(optional) - Plain text version (auto-generated from HTML if not provided)
previewText
(optional) - Email preview text shown in inbox
replyTo
(optional) - Reply-to email address
contactProperties
(optional) - Additional contact data for tracking
Templated Email Parameters
template
(required) - Name of the template created in SMASHSEND dashboard
to
(required) - Recipient email address
variables
(optional) - Key-value pairs for template variable substitution
Common Parameters (Both Types)
settings.trackClicks
(optional, default: true) - Enable click tracking
settings.trackOpens
(optional, default: true for templates, false for raw) - Enable open tracking
groupBy
(optional) - Group analytics by this identifier
sendAt
(optional) - Schedule email for future delivery (ISO 8601 format, max 90 days)
idempotencyKey
(optional) - Unique key to prevent duplicate sends
The API returns standard HTTP status codes. Common error responses:
400 Bad Request - Invalid From Email
{
"statusCode": 400,
"error": "Bad Request",
"message": "The email address 'unverified@domain.com' is not verified for sending. Please use one of your verified email addresses or add a custom domain. Visit your domain settings to verify domains: https://smashsend.com/workspace-slug/settings/domains",
"allowedEmails": ["support@yourdomain.com", "noreply@yourdomain.com"],
"allowedDomains": ["yourdomain.com"],
"docsUrl": "https://smashsend.com/docs/api/emails#verified-from-addresses"
}
400 Bad Request - Invalid Payload
{
"statusCode": 400,
"error": "Bad Request",
"message": "Invalid email payload: Must match either the Raw Email schema (required fields: from, to, subject, html) or the Templated Email schema (required fields: template, to, variables).",
"docsUrl": "https://smashsend.com/docs/api/emails"
}
401 Unauthorized
{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid API key or insufficient scope. Required scope: api_user"
}
403 Forbidden - Sending Limits
{
"statusCode": 403,
"error": "Forbidden",
"message": "Cannot send email. Monthly sending limit reached. Upgrade your plan to send more emails."
}
Choosing the Right Method
• Raw HTML: Use for one-off emails, highly customized designs, or when you need complete control over the HTML structure
• Templates: Best for recurring email types like welcome emails, notifications, or marketing campaigns with consistent branding
• React Components: Ideal for complex emails with dynamic content, when you want to maintain emails in code, or need component reusability
Performance Tips
• Use batch endpoints when sending multiple emails to improve throughput
• Implement idempotency keys for critical emails to prevent duplicates
• Use the groupBy parameter to organize analytics for different email campaigns
• Schedule emails during optimal sending times using the sendAt parameter
Deliverability
• Always verify your sending domains before production use
• Include both HTML and text versions for better deliverability
• Use meaningful preview text to improve open rates
• Monitor your sending reputation through the SMASHSEND dashboard
User Onboarding Flow
// Send welcome email immediately after signup
await smashsend.emails.send({
template: "welcome_email",
to: user.email,
variables: {
firstName: user.firstName,
activationUrl: generateActivationUrl(user.id)
},
groupBy: "onboarding_flow"
});
// Schedule follow-up email for 24 hours later
await smashsend.emails.send({
template: "onboarding_tips",
to: user.email,
variables: {
firstName: user.firstName,
dashboardUrl: "https://app.yourdomain.com/dashboard"
},
sendAt: new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),
groupBy: "onboarding_flow"
});
Order Confirmation with Dynamic Content
// Generate receipt HTML from React component
const receiptHtml = render(OrderReceiptEmail({
customerName: order.customer.name,
orderNumber: order.id,
items: order.items,
total: order.total,
trackingUrl: order.trackingUrl
}));
// Send as raw email with full control
await smashsend.emails.send({
from: "orders@yourdomain.com",
fromName: "Your Store Orders",
to: order.customer.email,
subject: `Order Confirmation #${order.id}`,
html: receiptHtml,
settings: {
trackClicks: true,
trackOpens: true
},
groupBy: "order_confirmations",
idempotencyKey: `order_${order.id}_confirmation`
});
Batch Newsletter Sending
// Send personalized newsletter to subscriber segments
const emails = subscribers.map(subscriber => ({
template: "monthly_newsletter",
to: subscriber.email,
variables: {
firstName: subscriber.firstName,
subscriberTier: subscriber.tier,
personalizedContent: getPersonalizedContent(subscriber)
},
groupBy: "newsletter_march_2024"
}));
// Send in batches of 50
const batches = chunkArray(emails, 50);
for (const batch of batches) {
await smashsend.emails.sendBatch({ emails: batch });
// Add delay between batches if needed
await new Promise(resolve => setTimeout(resolve, 1000));
}