Node.js
No SDK required. Node has fetch built in from version 18, and the API is JSON over HTTPS.
Send
const response = await fetch('https://api.epostix.com/v1/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.EPOSTIX_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
subject: 'It works',
html: '<p>Sent from Node.</p>',
}),
});
const email = await response.json();
console.log(email.id);
Run it against a sandbox address first and nothing is delivered or charged:
Handle failures properly
response.ok is not enough. Read the error envelope and branch on type.
if (!response.ok) {
const error = await response.json();
switch (error.type) {
case 'rate_limit_exceeded':
case 'daily_quota_exceeded':
await sleep(Number(response.headers.get('Retry-After')) * 1000);
return send();
case 'validation_error':
throw new BadRequest(error.details);
default:
throw new Error(`${error.type}: ${error.message} (${error.request_id})`);
}
}
Always keep a default branch. New error types are added without a version bump, so an
exhaustive switch will break. See Versioning.
Make retries safe
Anything you retry should carry an idempotency key derived from your own identifiers, not from the moment of the call.
headers: {
'Idempotency-Key': `order-${order.id}-confirmation`,
}
Retry with the same key and a request that already succeeded returns its original result instead of sending a second email. See Idempotency.
Keep the key on the server
An API key can send mail as your domain. It belongs in an environment variable on a server you control, never in code that reaches a browser or a mobile app.