Early access · Email API + campaigns · Built for India

One list for every email you send.

An email API for the email your product sends. A full campaign studio for the email your team writes. Both work on the same contacts, and every email is sent from Mumbai.

Already sending from code? Keep your request shapes: point your existing integration at api.refiremail.com and swap in a Refiremail key.How switching works

  • REST email API
  • SMTP relay + inbound
  • DPDP consent ledger
  • Sent from Mumbai
Illustration with sample data: an API call sends Asha an order receipt, and the same contact record is picked up by a campaign segment.

Why one list

Most teams run two email tools: one for the email the product sends, one for the email marketing writes. Two contact lists, two unsubscribe states, two bills, and a sync job holding them together.

Refiremail is the one list underneath both.

01, Send

An API your code already speaks.

A plain REST API with the routes, field names, list envelopes and error names developers expect. Keep your request shapes, point your integration at api.refiremail.com, and your code doesn’t need to know it moved.

  • REST API

    Send one email or a batch of up to 100, with tags, attachments and templates.

  • SMTP relay

    For CMSs, ERPs and anything else that only speaks SMTP.

  • Inbound email

    Give your app an address and receive mail as parsed JSON.

  • Signed webhooks

    Delivery, bounce, open and click events, signed and retried until you answer.

  • Idempotency keys

    Retry a send safely. The same key never sends twice within 24 hours.

  • Scheduled sends

    Queue a message up to 30 days ahead, and cancel it any time before it goes.

send.tsTypeScript
const res = await fetch('https://api.refiremail.com/emails', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.REFIREMAIL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    from: 'Nimbu <[email protected]>',
    to: ['[email protected]'],
    subject: 'Order #1042 is confirmed',
    html: '<p>Thanks, Asha. Your order ships tomorrow.</p>',
  }),
});

const { id } = await res.json(); // 200 OK → { "id": "…" }
send.pyPython
import os
import requests

res = requests.post(
    "https://api.refiremail.com/emails",
    headers={"Authorization": f"Bearer {os.environ['REFIREMAIL_API_KEY']}"},
    json={
        "from": "Nimbu <[email protected]>",
        "to": ["[email protected]"],
        "subject": "Order #1042 is confirmed",
        "html": "<p>Thanks, Asha. Your order ships tomorrow.</p>",
    },
    timeout=10,
)
res.raise_for_status()
email_id = res.json()["id"]
send.phpPHP
<?php
$ch = curl_init('https://api.refiremail.com/emails');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('REFIREMAIL_API_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'from' => 'Nimbu <[email protected]>',
        'to' => ['[email protected]'],
        'subject' => 'Order #1042 is confirmed',
        'html' => '<p>Thanks, Asha. Your order ships tomorrow.</p>',
    ]),
]);

$email = json_decode(curl_exec($ch), true); // ['id' => '…']
send.shShell
curl -X POST https://api.refiremail.com/emails \
  -H "Authorization: Bearer $REFIREMAIL_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-1042" \
  -d '{
    "from": "Nimbu <[email protected]>",
    "to": ["[email protected]"],
    "subject": "Order #1042 is confirmed",
    "html": "<p>Thanks, Asha. Your order ships tomorrow.</p>"
  }'

Errors with names

One JSON envelope with the status, a machine-readable name and a sentence, so a handler can switch on name.

422 Unprocessable EntityJSON
{
  "statusCode": 422,
  "name": "missing_required_field",
  "message": "Missing `to` field."
}

The API’s main routes, each with its status. The developer page lists every route and its methods.

  • POST/emails, Live
  • POST/emails/batch, Live
  • GET/emails/{id}, Live
  • /domains, Live
  • /api-keys, Live
  • /contacts, Live
  • /segments, Live
  • /topics, Live
  • /broadcasts, Live
  • /templates, Live
  • /webhooks, Live
  • GET/logs, Live

02, Grow

Campaigns, without a second copy of your users.

Design broadcasts in a visual editor, test subject lines, segment on anything your product already records, and build journeys that respond to what people do. All of it runs on the contacts your API already created.

  • Visual editor

    Blocks that render cleanly in the major inboxes and mail apps, and on phones.

  • Segments

    Rules over properties, topics and email events, kept current as the data changes.

  • A/B tests

    Try two subjects or two versions on a slice of the audience, then send the winner.

  • Automations

    Triggers, waits, branches and sends, with a clear view of who is where.

  • Signup formsComing

    Hosted or embedded, with double opt-in and a consent record for every signup.

  • ReportsComing

    Delivered, bounced, clicked and unsubscribed, per campaign and per link.

Automations · Welcome journeySample data
Sample journey: a signup waits a day, gets a welcome email, then either tips for their first project or, once WhatsApp steps ship, a nudge there.

03, Connect

Every email teaches the next one.

When the receipt and the newsletter share a contact record, what your product sends shapes what marketing sends, and what someone declines is respected everywhere it should be.

Diagram: the email API, SMTP relay, inbound mail and webhooks on one side, broadcasts, segments, automations and forms on the other, all reading and writing one contact record with its consent ledger and suppression list.

A bounce counts everywhere.

An address that hard-bounces on a password reset is skipped by next week’s campaign. A marketing unsubscribe stops marketing, never the password reset.

Product events become segments.

Build a segment from what actually happened: people who got a shipping update this week, or who clicked a link in a receipt.

Consent is recorded once.

Every opt-in, from a signup form or an API call, lands in one ledger: who, when, how, for which topic and under which notice.

04, India

Built for how Indian companies buy and comply.

Prices in rupees, with a GST tax invoice carrying your GSTIN once billing opens. Mail sent from Mumbai today, with contacts and content to be stored in India. A consent ledger designed around the DPDP Act.

Tax invoice

SAMPLE
Refiremail · GSTIN (ours, on the real invoice)Bill to: Your Company Pvt Ltd · GSTIN (yours)
Transactional1,00,000 emails / month₹2,699.00
Marketing10,000 subscribed contacts₹2,999.00
Subtotal₹5,698.00
CGST @ 9%₹512.82
SGST @ 9%₹512.82
Total₹6,723.64

Intra-state supply shown (CGST + SGST). Inter-state supply is billed as IGST @ 18%. Your GSTIN on the invoice lets you claim input tax credit.

Sample tax invoice at 1,00,000 emails and 10,000 subscribed contacts a month.

WhatsApp journeys.Coming

A WhatsApp step in the same journey, on the same contact, with the same consent record.

Sending from Mumbai
region
ap-south-1
sending
Mumbai, India
stored
  • contacts and properties
  • message content
  • events and logs

Stored in IndiaComing

Where your mail is sent from and where your data is kept.
Consent ledgerSample data
  1. [email protected]granted22 Sep, 10:14 IST · Marketing: New arrivals · notice v3 · via signup form
  2. [email protected]granted22 Sep, 11:02 IST · Marketing: Offers · notice v3 · via API
  3. [email protected]withdrawn22 Sep, 16:40 IST · Marketing: Offers · notice v3 · via preference page
Sample consent ledger rows, including a withdrawal.

05, Agencies

A reputation for every client.

Client sub-accounts are coming: each client will run with its own domains, keys, suppression list and sending reputation, so one client’s bad list can’t drag down another client’s inbox placement, and you will get one invoice with a line per client.

Per-client reputation isolationComing

Illustration of client sub-accounts, which are coming: three clients under one agency. A bounce spike in one client stays in that client’s lane.

Fair by design.

The send queue takes turns between accounts, so one account’s large campaign doesn’t hold up another account’s receipts.

06, Switch

Switching is a config change, not a rewrite.

From another email API

  1. Add and verify your domain. We show you the exact DNS records.

  2. Create an API key.

  3. Keep your request shapes: point your existing integration at api.refiremail.com and swap in the new key.

From another marketing tool

  1. Export your audience as a CSV file.

  2. Import it and map its columns to contact properties.

  3. Review consent for DPDP before your first campaign. Past campaign reports stay where they are.

07, Spec

No logos yet. Just the spec.

We’re new, so instead of a wall of customer logos, here is exactly what you get. Every row links to where you can check it.

API
REST: /emails /emails/batch /domains /api-keys /contacts /segments /topics /broadcasts /templates /webhooks /logs
API reference
Protocols
HTTPS REST · SMTP submission (API key as password) · Inbound MX
SMTP relay
Sending region
ap-south-1 (Mumbai)
Residency
Authentication
DKIM-signed with your domain’s key · SPF · DMARC guidance
Deliverability
Unsubscribe
RFC 8058 one-click on bulk mail, never added to transactional mail
RFC 8058
Webhooks
Signed (Standard Webhooks format), retried with backoff
Webhooks
Idempotency
Idempotency-Key on sends, kept for 24 h
Email API
Secrets at rest
API keys stored as SHA-256 hashes · DKIM private keys encrypted with AES-256-GCM
Privacy policy
Consent
A per-contact consent ledger, designed around the DPDP Act
India

Bring your list. Keep your code.

Switching? Point your existing integration at this base URL and swap in a Refiremail key.

https://api.refiremail.com

Free to start. Billed in rupees as you grow.

Free for both halves: 3,000 transactional emails and 1,000 subscribed contacts a month.

See pricing