Installation
Copy
Ask AI
npm install sendi-email
Setup
Copy
Ask AI
import { Sendi } from 'sendi-email';
const sendi = new Sendi('snd_your_api_key');
Emails
Send an email
Copy
Ask AI
const { id } = await sendi.emails.send({
from: 'you@yourdomain.com',
to: 'user@example.com',
subject: 'Welcome!',
html: '<h1>Welcome aboard</h1>',
// Optional
cc: 'cc@example.com',
bcc: ['bcc1@example.com', 'bcc2@example.com'],
replyTo: 'reply@yourdomain.com',
attachments: [{ filename: 'invoice.pdf', content: '<base64>' }],
tags: { campaign: 'welcome' },
scheduledAt: '2026-03-08T12:00:00Z',
});
Batch send (up to 100)
Copy
Ask AI
const { data } = await sendi.emails.batch([
{ from: 'you@yourdomain.com', to: 'user1@example.com', subject: 'Hi', text: 'Hello' },
{ from: 'you@yourdomain.com', to: 'user2@example.com', subject: 'Hi', text: 'Hello' },
]);
// data = [{ emailId: '...' }, { emailId: '...' }]
Get an email
Copy
Ask AI
const email = await sendi.emails.get('email_id');
List emails
Copy
Ask AI
const { emails, pagination } = await sendi.emails.list({
page: 1,
limit: 50,
status: 'delivered',
});
Update schedule
Copy
Ask AI
await sendi.emails.update('email_id', {
scheduledAt: '2026-03-09T15:00:00Z',
});
Cancel scheduled email
Copy
Ask AI
await sendi.emails.cancel('email_id');
Domains
Copy
Ask AI
// Add a domain
const domain = await sendi.domains.create({ domain: 'yourdomain.com' });
// List domains
const domains = await sendi.domains.list();
// Verify domain
const { verified } = await sendi.domains.verify('domain_id');
// Remove domain
await sendi.domains.remove('domain_id');
Webhooks
Copy
Ask AI
// Create endpoint
const endpoint = await sendi.webhooks.create({
url: 'https://yourapp.com/webhooks',
events: ['email.delivered', 'email.bounced', 'email.opened'],
});
// endpoint.secret — save this for signature verification
// List endpoints
const endpoints = await sendi.webhooks.list();
// Toggle active/inactive
await sendi.webhooks.update('webhook_id', { active: false });
// Remove
await sendi.webhooks.remove('webhook_id');
Analytics
Copy
Ask AI
// Email time series (7 or 30 days)
const { result, totalCounts } = await sendi.analytics.timeSeries({ days: 30 });
// Reputation metrics
const { bounceRate, complaintRate } = await sendi.analytics.reputation();
// Filter by domain
const stats = await sendi.analytics.timeSeries({ days: 7, domainId: 'domain_id' });
Error Handling
Copy
Ask AI
import { Sendi, SendiError } from 'sendi-email';
try {
await sendi.emails.send({ /* ... */ });
} catch (err) {
if (err instanceof SendiError) {
console.log(err.message); // "Rate limit exceeded"
console.log(err.statusCode); // 429
}
}