$/transactional-email-api providers โ†—
โ† all free tiers
free tier ยท node.js

9 Best Free Transactional Email APIs for Node.js (2026), Tested

Every provider here has a permanent free tier and either an official Node.js SDK or standard SMTP support. Trials excluded, checked against current pricing pages.

criteria

  1. 01

    Mailjet

    Transactional Marketing

    6,000/mo capped at 200/day. Permanent and useful for steady low-volume sends.

  2. 02

    Loops

    Marketing Transactional

    Unlimited emails on the Free plan within a 1,000-contact ceiling. Different model: optimal when your contact list grows slowly but your volume is high.

  3. 03

    Brevo

    Transactional Marketing

    300/day permanent. Best for low daily volumes that do not spike on launch day.

  4. 04

    Mailtrap

    Transactional Testing

    4,000/mo permanent on the sending side, plus a free testing tier.

  5. 05

    Resend

    Transactional

    3,000/mo permanent on a single domain.

  6. 06

    MailerSend

    Transactional

    3,000/mo permanent.

  7. 07

    Plunk

    Self-hosted Marketing

    3,000/mo on hosted free plan, or self-host for unlimited.

  8. 08

    Amazon SES

    Transactional

    New accounts get up to $200 in AWS credits for six months. The old 62,000/mo-from-EC2 allowance is gone.

  9. 09

    SMTP2GO

    Transactional

    1,000/mo permanent, no daily cap.

Send your first email from Node.js

Minimal send calls on the free tier, in ranking order. Swap the from address for a domain you have verified with the provider.

Loops npm install loops
import { LoopsClient } from 'loops';

const loops = new LoopsClient(process.env.LOOPS_API_KEY);
await loops.sendTransactionalEmail({
  transactionalId: 'your-transactional-id',
  email: 'user@example.com',
  dataVariables: { name: 'Ada' },
});
free tier: 1,000 contacts and 4,000 sends/mo on the Free plan
Mailtrap npm install mailtrap
import { MailtrapClient } from 'mailtrap';

const client = new MailtrapClient({ token: process.env.MAILTRAP_TOKEN });
await client.send({
  from: { email: 'you@yourdomain.com' },
  to: [{ email: 'user@example.com' }],
  subject: 'Hello',
  text: 'It works.',
});
free tier: 4,000/mo (sending), free testing tier
Resend npm install resend
import { Resend } from 'resend';

const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
  from: 'you@yourdomain.com',
  to: 'user@example.com',
  subject: 'Hello',
  html: '<p>It works.</p>',
});
free tier: 3,000/mo permanent, capped at 100/day, one domain
SMTP2GO npm install nodemailer
import nodemailer from 'nodemailer';

const transport = nodemailer.createTransport({
  host: 'mail.smtp2go.com',
  port: 587,
  auth: { user: process.env.SMTP_USER, pass: process.env.SMTP_PASS },
});
await transport.sendMail({
  from: 'you@yourdomain.com',
  to: 'user@example.com',
  subject: 'Hello',
  text: 'It works.',
});
free tier: 1,000/mo permanent

All 9 compared

Every free-tier provider with Node.js support. Free volume and entry pricing sit with each pick above.

ProviderIdempotency keysWebhooksEvent streamOperating sinceSuppressions APIBest published rate per 1,000Batch sendingSDKs
MailjetNoYesYesNot publishedYesTiers not published in comparable formYesnode, python, go, ruby, php, java, dotnet
LoopsNoYesYes2022YesTiers not published in comparable formYesnode, python, go, ruby, php
BrevoNoYesYes2012YesTiers not published in comparable formYesnode, python, go, ruby, php, java, dotnet
MailtrapNoYesYes2014YesTiers not published in comparable formYesnode, python, go, ruby, php, elixir
ResendYesYesYes2023Yes$0.35Yesnode, python, go, ruby, php, rust, java, elixir, cli
MailerSendNoYesYes2020YesTiers not published in comparable formYesnode, python, go, ruby, php
PlunkNoYesYesNot publishedYesTiers not published in comparable formYesnode, python
Amazon SESNoNoYes2011Yes$0.10Yesnode, python, go, ruby, php, java, rust, dotnet
SMTP2GONoYesYes2006YesTiers not published in comparable formYesnode, python, go, ruby, php

other languages

reading this as teams choosing a transactional API

Judged purely as an API. What the request contract guarantees on retry, how complete the webhook event coverage is, whether suppressions are readable and writable programmatically, and how much the message log retains when something needs debugging in production.

Applied to free Node.js email sending, that means weighing idempotency keys, webhook coverage, event stream, and operating track record ahead of the rest, against high-frequency programmatic sends where a missed delivery is a product failure.

How rankings are produced โ†’