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.
Transactional email with domain verification, batch sending, and full event history.
SMS
Text messages routed per country to the cheapest provider, with delivery receipts.
Template and session messages through the same API and balance.
OTP
One-time codes with generation, delivery, and verification handled for you.
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
202in milliseconds and are delivered by a rate-aware worker. - Zero-dependency SDK on npm as retransmit.dev, or plain REST from any language.
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_xxxxxxxxxxxxBatch
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.deliveredwebhooks and in the message's event history.
const { data, error } = await retransmit.sms.send({
from: "Acme",
to: "+237670000000",
text: "Your code is 493 021",
});
console.log(data.id); // sms_xxxxxxxxxxxxWebhooks
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 dataRetransmit 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 GitHubCloud
Prepaid credits
One balance across every channel. Fund it in your local currency, including bank transfer and mobile money.
Get startedReady to send?
Grab an API key and send your first email or SMS in under five minutes.