Email for developers

Send it once.
Know it arrived.

The receipts, the reset links, the invoices. One call to send them, and a straight answer about what happened to each one — including the ones that bounced.

Create an API key
  • Free to start
  • No credit card
  • Send in five minutes
import { Kourio } from '@kourio/sdk';

const kourio = new Kourio(process.env.KOURIO_API_KEY);

await kourio.emails.send({
  from: 'Acme <receipts@acme.com>',
  to: ['ana@example.com'],
  subject: 'Your order is confirmed',
  html: '<p>Ships tomorrow.</p>',
});

Everything a product needs to send mail, and nothing else

No drag-and-drop campaign suite bolted onto an API. The features below exist because a transactional sender hits them in the first week.

  • Send in one call
  • Know what bounced, and why
  • Your own domain
  • Delivery events, pushed to you
  • Retries that never duplicate
  • Bad addresses skipped for you
  • Typed SDKs
  • Every message, searchable
  • Contact lists
  • Campaigns

Send

One request. Nothing to wire up first.

A key from your dashboard, a verified sender, a JSON body. The response carries the message id you will see again on every delivery event, so a bounce three hours later still points back at the exact send that caused it.

Idempotency is a header, not a project: repeat a request with the same key after a timeout and you get the original message back instead of a duplicate receipt.

Your domain

One DNS record, and you are sending as yourself.

Paste one record we generate for you, and mail leaves as your brand — no shared subdomain, no “via kourio.app” in the inbox. Nothing to manage after that.

We keep checking that it still holds, so a domain that quietly breaks stops sending instead of sliding into the spam folder without telling anyone.

Delivery status

Know what happened, without asking twice.

Delivered, bounced, complained, deferred, opened, clicked — recorded against the message and pushed to your endpoint as a signed webhook. The reason string is passed through as the receiving server wrote it, because “550 5.1.1 User unknown” tells you something that “failed” does not.

Or just ask: GET /v1/emails/:id returns the message with its full timeline — the same one at the top of this page.

Built for the mail nobody is allowed to miss

Transactional email is the kind where a failure is a support ticket, not a lost impression.

SaaS products

Password resets and receipts that cannot sit in a spam folder while a customer waits on support.

Marketplaces

Order confirmations to two sides of a transaction, each one traceable back to the request that sent it.

Fintechs

Statements and invoices, on a domain you control, from infrastructure inside the country.

Agencies

One account per client domain, with delivery numbers you can show them without exporting anything.

Internal tools

The alert that has to arrive at 3am, and the record proving whether it did.

Anyone leaving SMTP

A REST call instead of a connection pool, and a bounce reason instead of a silent failure.

Frequently asked questions

Send your first email today.

Publish one DNS record, create a key, make one request. The whole setup is shorter than this page, and the free tier covers 3,000 messages a month.