Skip to content
retransmit.
Get started

One API. Every message.

Send transactional email and SMS from one API and one prepaid balance. WhatsApp is next.

Channels

Integrate once. Add channels, not vendors.

Every channel shares the same key, SDK, webhooks, and balance. New ones arrive as an SDK update, not another account.

Live

Email

Transactional email with domain verification, batch sending, and full event history.

Live

SMS

Text messages routed per country to the cheapest provider, with delivery receipts.

Coming soon

WhatsApp

Template and session messages through the same API and balance.

Planned

OTP

One-time codes with generation, delivery, and verification handled for you.

Email

One request. Email delivered.

Verify a domain, grab an API key, and send your first email in under five minutes.

  • Every call returns { data, error }. No thrown surprises.
  • Sends return a 202 in milliseconds and are delivered by a rate-aware worker.
  • Zero-dependency SDK on npm as retransmit.dev, or plain REST from any language.
Read the docs →
import { Retransmit } from "retransmit.dev";

const retransmit = new Retransmit(process.env.RETRANSMIT_API_KEY);

const { data, error } = await retransmit.emails.send({
  from: "Acme <hello@yourdomain.com>",
  to: "user@example.com",
  subject: "Welcome!",
  html: "<h1>Welcome!</h1>",
});

console.log(data.id); // em_xxxxxxxxxxxx

Batch

Send one, or send ten thousand.

One request queues up to 10,000 emails. Poll the batch for per-status counts while the worker drains it at your provider's rate.

const { data, error } = await retransmit.batch.send([
  {
    from: "Acme <hello@yourdomain.com>",
    to: "one@example.com",
    subject: "Hello",
    html: "<p>Hi one</p>",
  },
  // …up to 10,000 messages
]);
  • One HTTP call for thousands of messages. No loops, no client-side rate limiting.
  • Track progress with GET /v1/emails/batch/:id. Counts per status, updated live.
  • Every message in the batch still gets its own id, log entry, and webhook events.

SMS

Text the same way you email.

Same SDK, same response shape, same balance. Pass a number in international format and Retransmit routes the rest.

  • The destination country is detected from the number and each message is routed to the cheapest configured provider.
  • Set your own sender id, up to 11 characters, or use the route's default.
  • Delivery receipts come back as sms.delivered webhooks and in the message's event history.
Read the docs →
const { data, error } = await retransmit.sms.send({
  from: "Acme",
  to: "+237670000000",
  text: "Your code is 493 021",
});

console.log(data.id); // sms_xxxxxxxxxxxx

Webhooks

Know what happens to every message.

Email and SMS events, signed and timestamped, delivered to your endpoint as they happen.

{
  "id": "whd_xxxxxxxxxxxx",
  "type": "email.delivered",
  "created_at": "2026-09-01T12:00:03.000Z",
  "data": {
    "emailId": "em_xxxxxxxxxxxx",
    "to": ["user@example.com"],
    "subject": "Your receipt"
  }
}

Payloads are signed with HMAC-SHA256 over `${timestamp}.${body}` and retried up to 8 times with exponential backoff. Verify in five lines →

Deliverability

Reach the inbox, not the spam folder.

Authentication, suppression, and retries handled correctly by default.

Domain verification

Verify your sending domain with SPF and DKIM. The dashboard gives you exact records to copy.

Bounce & complaint handling

Hard bounces and complaints are caught automatically. Your sender reputation is protected without extra code.

Queue with retries

Every send is queued, rate aware, and retried with exponential backoff.

Signed webhooks

Every event is delivered with an HMAC-SHA256 signature and retried up to 8 times with exponential backoff.

Logs & status

Fetch any message by id and read its full event history, from queued to delivered, opened, or bounced.

API keys

Scoped bearer keys you create and revoke from the dashboard. One header and you're authenticated.

Open source

Run it yourself. Read every line.

The API, dashboard, queue, and SDK live in one repository. Moving between cloud and self-hosted is a base URL change.

$ git clone https://github.com/jpainam/retransmit
$ cd retransmit && pnpm install
$ pnpm db:push
$ pnpm dev

# api on :3002, dashboard on :3001. your keys, your data

Retransmit Cloud

Managed sending on our infrastructure. Fund one prepaid balance by bank transfer or mobile money. No international card required.

Self-hosted

Your servers, your keys, your data. Bring your own provider credentials and keep the same SDK, dashboard, and webhooks.

Pricing

Pay for what you send.

No subscriptions, no seats, no charge for storing contacts. Top up a credit balance and it only moves when a message does.

Self-hosted

Free

Forever, on your own infrastructure. Every feature, no license key, no phone-home.

View on GitHub

Cloud

Prepaid credits

One balance across every channel. Fund it in your local currency, including bank transfer and mobile money.

Get started

Ready to send?

Grab an API key and send your first email or SMS in under five minutes.