Introducing SNDR v1Read the announcement

Email infrastructure you can watch work

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.

Send email

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

7D
M
T
W
T
F
S
S

Domain health

View all →
rkiza.saSPF · DKIM · DMARCverified
mail.rkiza.saSPF · DKIM · DMARCverified
updates.rkiza.saSPF · DKIM · DMARCpending

Recent activity

View all emails →
  • aYour sign-in codeto ahmed@rkiza.sa · from auth@rkiza.sadelivered12s
  • jReceipt #4821to j.okafor@fieldnote.app · from billing@rkiza.sadelivered48s
  • lReset your passwordto lena@kiteworks.dev · from auth@rkiza.sadelivered2m
  • oWelcome to Rkizato omar@lumen.sa · from hello@rkiza.saqueued3m
  • oInvoice overdueto ops@old-domain.test · from billing@rkiza.sabounced9m

How it works

From new domain to delivered, in six steps.

This is the real dashboard, filled with sample data. Scroll through the steps; the window follows along.

  1. 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.

    • SPF
    • DKIM 2048-bit
    • DMARC
    • MTA-STS
    • Daily re-checks

    Domains

    Sending domains and their DNS state.

    Send email

    Verified domains

    2 / 10

    rkiza.sa verified

    SPF

    Verified

    DKIM

    Verified

    DMARC

    Verified

    DNS records

    TypeNameValue
    TXTrkiza.sav=spf1 include:_spf.sndr.sh ~all
    TXTsndr._domainkey.rkiza.sav=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv3…
    TXT_dmarc.rkiza.sav=DMARC1; p=quarantine; rua=mailto:dmarc@rkiza.sa; pct=100

    Optional records for MTA-STS, TLS-RPT and BIMI are listed too. SNDR re-checks every domain daily.

  2. 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.

    • send / read scopes
    • Hashed at rest
    • Last-used tracking

    API Keys

    Manage the keys your applications use to send email.

    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 Copy
    sendread
    NameKeyScopesLast used
    production-apisndr_live_7Hq2…••••sendreadjust now
    worker-queuesndr_live_Pz81…••••send4m ago
    analytics-readsndr_live_cN3w…••••read2h ago
  3. POST /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.

    • Idempotency keys
    • Auto-retry in the SDK
    • CC / BCC / attachments

    Emails

    Every message you've sent. Search, filter, and replay.

    Send email
    send.ts@rkiza/sndr
    await sndr.emails.send({
      from: 'Rkiza <auth@rkiza.sa>',
      to: 'ahmed@rkiza.sa',
      template_id: 'tpl_signin',
      variables: { code: '482913' },
    });
    202 Accepted · { id: "em_8f2k…", status: "queued" } · 41ms
    AllQueuedDeliveredBounced
    • deliveredYour sign-in code is 482913ahmed@rkiza.sanow
    • deliveredReceipt #4821j.okafor@fieldnote.app48s
    • deliveredReset your passwordlena@kiteworks.dev2m
    • queuedWelcome to Rkizaomar@lumen.sa3m
    • bouncedInvoice overdueops@old-domain.test9m

    webhook → email.delivered · 200 OK

  4. Store subject and HTML once, with {{ variables }}. Your code sends a template id and the values; product can change the copy without a deploy.

    • {{ merge tags }}
    • Live preview
    • Versioned

    Templates

    Reusable email templates with merge tags and live preview.

    Send email

    Sign-in code

    tpl_signin

    v3

    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>
    first_nameapp_namecode
    Live preview

    From Rkiza · auth@rkiza.sa

    Hi Ahmed,

    Your code for Rkiza is

    482913

    It expires in 10 minutes.

  5. Import contacts, put them in groups and send a broadcast. Unsubscribes, bounces and suppressions are respected automatically.

    • CSV import
    • Contact groups
    • One-click unsubscribe

    Broadcasts

    Compose a marketing send to a contact group.

    Send email

    Broadcast

    March product update

    to Beta users · from updates@rkiza.sa

    sent

    Recipients

    2,400

    Sent

    2,400

    Delivered

    2,390

    Bounced

    10

    Contacts

    Subscribed2,381
    Unsubscribed12
    Bounced7

    Every broadcast email carries a one-click List-Unsubscribe header.

    Recipients

    ava@helio.codelivered
    ben@orbit.devdelivered
    chen@pallet.iodelivered
    dara@quill.appdelivered
    eli@tessera.sadelivered
  6. Subscribe an endpoint to delivered, bounced and failed events. Each request is HMAC-signed, and failures retry with backoff.

    • HMAC-SHA256
    • 12 retries
    • Key rotation

    Webhooks

    Realtime event delivery to your endpoints.

    Send email
    https://api.rkiza.sa/hooks/sndractive
    email.deliveredemail.bouncedemail.failed

    X-Sndr-Signature: t=1758620113,v1=5f0c2e9b1a7d…

    EventStatusDurationAttempt
    email.delivered20084ms1 / 12
    email.delivered20091ms1 / 12
    email.bounced503timeout1 / 12
    email.bounced200102ms2 / 12
    email.delivered20077ms1 / 12

    Failed deliveries retry with exponential backoff, up to 12 attempts.

Live demo

Send an email. Watch where it goes.

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.

Send email

From a verified domain on the rkiza workspace

  1. API202 · 41ms
  2. DKIM signrsa-sha256
  3. Relays2
  4. MX lookuprkiza.sa
  5. Inbox250 OK
  6. Webhook200 OK

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>',
});
Event log

waiting for a request

Under the hood

Your email's path, from API call to inbox.

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

s1.sndr.sh
s2.sndr.sh
s3.sndr.sh
s4.sndr.sh

Recipient MX

SMTP · STARTTLS · port 25

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 IP per recipient domain

Mail to a given domain always leaves from the same source IP, so reputation with Gmail or Outlook builds in one place.

Failover without duplicates

A relay that fails three times is benched for a minute. SNDR retries on another relay only if the first provably didn't send.

Suppression by default

Hard bounces and unsubscribes go on your suppression list automatically, for To, CC and BCC alike.

Developers

Everything in the dashboard is an API call.

API reference
POST/v1/sendscope: send

Send 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" }
  }'
Response202 Accepted
{
  "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

Start free. Upgrade when you're sending for real.

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.

  • 3,000 emails / month
  • 1 verified domain
  • 1 teammate

Pro

Most popular

$12/ month

For startups shipping every week.

  • 50,000 emails / month
  • 10 verified domains
  • 5 teammates

Scale

$75/ month

Production at any scale.

  • 500,000 emails / month
  • 100 verified domains
  • 25 teammates
Compare all plans
PlanFreeProScale
Price / monthFree$12$75
Emails / month3,00050,000500,000
Verified domains110100
Teammates1525
API keys11050
Webhook endpoints11050
Templates51001,000

Full pricing details →

FAQ

Questions, answered.

Do I need my own domain?

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.

What counts toward my monthly quota?

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.

What happens when an email bounces?

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.

Can I retry a request safely?

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.

How do I know a webhook really came from SNDR?

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.

Can I send newsletters and announcements too?

Yes. Import contacts, organise them into groups and send a broadcast. Every broadcast email includes a one-click unsubscribe, and unsubscribes are honoured automatically.

Send your first email in five minutes.

3,000 emails a month on the free plan. No credit card, no sales call. Upgrade when your volume needs it.