Keys stay with the API
Messages are built and DKIM-signed before they leave the API. Relay servers only ever see signed bytes, never your private key.
One API for transactional email and broadcasts. Verify a domain, send your first email and follow every delivery from one dashboard.
Overview
A live view of your sending activity.
Sent (7d)
12,482
+18% vs last week
Delivered
99.2%
12,382 accepted by MX
Bounce rate
0.4%
auto-suppressed
Failed
18
all retry-safe
Sending volume
last 7 days
Domain health
View all →Recent activity
View all emails →How it works
This is the real dashboard, filled with sample data. Scroll through the steps; the window follows along.
Add your domain and SNDR generates the SPF, DKIM and DMARC records. Paste them into your DNS and each one turns green as it resolves.
Domains
Sending domains and their DNS state.
Verified domains
2 / 10
SPF
Verified
DKIM
Verified
DMARC
Verified
DNS records
Optional records for MTA-STS, TLS-RPT and BIMI are listed too. SNDR re-checks every domain daily.
Keys are scoped to send, read or both, and shown once. SNDR stores only a SHA-256 hash, so a database leak never exposes a working key.
API Keys
Manage the keys your applications use to send email.
API keys
3 / 10
Key created: production-api
Copy it now. SNDR stores only a SHA-256 hash, so it can't be shown again.
sndr_live_7Hq2mXv9KpR4tZcW1nB8sLdE3yJ0aF6u CopyPOST /v1/send, or use the SDK. The call returns 202 in milliseconds and the email appears in your log, then moves from queued to delivered.
Emails
Every message you've sent. Search, filter, and replay.
await sndr.emails.send({ from: 'Rkiza <auth@rkiza.sa>', to: 'ahmed@rkiza.sa', template_id: 'tpl_signin', variables: { code: '482913' }, });
webhook → email.delivered · 200 OK
Store subject and HTML once, with {{ variables }}. Your code sends a template id and the values; product can change the copy without a deploy.
Templates
Reusable email templates with merge tags and live preview.
Sign-in code
tpl_signin
Subject
Your sign-in code is {{ code }}
HTML
<h1>Hi {{ first_name }},</h1> <p>Your code for {{ app_name }} is</p> <p class="code">{{ code }}</p> <p>It expires in 10 minutes.</p>
From Rkiza · auth@rkiza.sa
Hi Ahmed,
Your code for Rkiza is
482913
It expires in 10 minutes.
Import contacts, put them in groups and send a broadcast. Unsubscribes, bounces and suppressions are respected automatically.
Broadcasts
Compose a marketing send to a contact group.
Broadcast
March product update
to Beta users · from updates@rkiza.sa
Recipients
2,400
Sent
2,400
Delivered
2,390
Bounced
10
Contacts
Every broadcast email carries a one-click List-Unsubscribe header.
Recipients
Subscribe an endpoint to delivered, bounced and failed events. Each request is HMAC-signed, and failures retry with backoff.
Webhooks
Realtime event delivery to your endpoints.
X-Sndr-Signature: t=1758620113,v1=5f0c2e9b1a7d…
Failed deliveries retry with exponential backoff, up to 12 attempts.
Domains
Sending domains and their DNS state.
Verified domains
2 / 10
SPF
Verified
DKIM
Verified
DMARC
Verified
DNS records
Optional records for MTA-STS, TLS-RPT and BIMI are listed too. SNDR re-checks every domain daily.
01 / 06·Verify your domain
Live demo
Write a request and press Send to follow it from your code to the inbox. Turn on a bounce to see the address get suppressed.
Press Send to follow the email from your code to the inbox.
import { Sndr } from '@rkiza/sndr';
const sndr = new Sndr(process.env.SNDR_API_KEY);
await sndr.emails.send({
from: 'Rkiza <auth@rkiza.sa>',
to: 'ahmed@rkiza.sa',
subject: 'Your sign-in code is 482913',
html: '<p>Your code is <b>482913</b></p>',
});waiting for a request
Under the hood
SNDR runs its own relay servers and sends straight to the recipient's mail server. This is what sits between your request and the inbox.
Your app
SDK · REST
SNDR API
checks · render · DKIM sign
Relay pool
Recipient MX
SMTP · STARTTLS · port 25
Messages are built and DKIM-signed before they leave the API. Relay servers only ever see signed bytes, never your private key.
Mail to a given domain always leaves from the same source IP, so reputation with Gmail or Outlook builds in one place.
A relay that fails three times is benched for a minute. SNDR retries on another relay only if the first provably didn't send.
Hard bounces and unsubscribes go on your suppression list automatically, for To, CC and BCC alike.
Developers
/v1/sendscope: sendSend a transactional email, inline or from a template.
curl https://api.sndr.sh/v1/send \
-H "Authorization: Bearer $SNDR_API_KEY" \
-H "Idempotency-Key: signup-8f2k" \
-d '{
"from": "Rkiza <auth@rkiza.sa>",
"to": ["ahmed@rkiza.sa"],
"template_id": "tpl_7c1e9a04-2b3",
"variables": { "code": "482913" }
}'{
"id": "em_3f9a1c2e-7b4",
"from": "Rkiza <auth@rkiza.sa>",
"to": ["ahmed@rkiza.sa"],
"subject": "Your sign-in code is 482913",
"status": "queued",
"template_id": "tpl_7c1e9a04-2b3",
"created_at": "2026-09-23T10:15:13Z"
}Safe to retry
Idempotency-Key replays return the original result for 24 hours.
One error shape
Every error has a code, a message and a request id.
Scoped keys
Give each service send, read or both. Keys are hashed at rest.
Signed webhooks
HMAC-SHA256 with zero-downtime secret rotation.
Pricing
Monthly plans in USD, billed by Paddle, which also handles VAT and sales tax. Change or cancel from the dashboard at any time.
Free
Free
For testing and tiny side-projects.
Pro
Most popular$12/ month
For startups shipping every week.
Scale
$75/ month
Production at any scale.
| Plan | Free | Pro | Scale |
|---|---|---|---|
| Price / month | Free | $12 | $75 |
| Emails / month | 3,000 | 50,000 | 500,000 |
| Verified domains | 1 | 10 | 100 |
| Teammates | 1 | 5 | 25 |
| API keys | 1 | 10 | 50 |
| Webhook endpoints | 1 | 10 | 50 |
| Templates | 5 | 100 | 1,000 |
FAQ
Yes. You send from an address on a domain you own. Add it in the dashboard, publish the SPF, DKIM and DMARC records SNDR generates, and it verifies within minutes of your DNS updating.
Each recipient: an email to one To and two CC addresses counts as three. Quotas reset on the first of each month (UTC). A send that would go over the limit is refused with a clear error, never silently dropped.
A hard bounce adds the address to your suppression list, so later sends to it are refused before they hurt your reputation. You also get an email.bounced webhook with the SMTP error.
Send an Idempotency-Key header and a repeated request within 24 hours returns the original result instead of sending twice. The Node SDK adds one automatically and retries on network errors and 5xx responses.
Every request carries an X-Sndr-Signature header: an HMAC-SHA256 over the timestamp and raw body, using your endpoint secret. The SDK verifies it in one call, and you can rotate secrets without downtime.
Yes. Import contacts, organise them into groups and send a broadcast. Every broadcast email includes a one-click unsubscribe, and unsubscribes are honoured automatically.
3,000 emails a month on the free plan. No credit card, no sales call. Upgrade when your volume needs it.