Transactional email, from your own domain.

coss.com Email is a transactional email API. Send single, batch and scheduled email from your domains, with templates, tracking and per-recipient webhooks.

Read the docs

How it works

One call sends an email. coss.com queues it, hands it to the mail provider and reports what happens to each recipient.

// An email with an attachment, safe to retry under your own key.
const { : ,  } = await ..(
  {
    : "Acme <billing@acme.com>",
    : "ada@example.com",
    : "Your October invoice",
    : "<p>Your invoice is attached.</p>",
    : [{ : "invoice.pdf", :  }],
    : "billing",
  },
  { : "invoice-2026-10-ada" },
);

// A published template, rendered at send in the recipient's language, sent later.
await ..({
  : "Acme <hello@acme.com>",
  : "grace@example.com",
  : "welcome",
  : "de",
  : { : "Grace" },
  : "2026-11-02T09:00:00Z",
});

// Up to 100 emails in one request, all or nothing.
await ..([
  { : "Acme <digest@acme.com>", : "ada@example.com", : "Your week", : "<p>Hi Ada</p>" },
  { : "Acme <digest@acme.com>", : "linus@example.com", : "Your week", : "<p>Hi Linus</p>" },
]);

Sends return 202 with status: "queued" (or scheduled). Follow each recipient with coss.email.get() or the email.delivered, email.bounced and other webhooks. The API reference lists every field.

Sending

Everything a product needs to send its own email: content in code or in coss.com, at once or later, retried without duplicates.

Single, batch and scheduled

coss.email.send() sends one email, sendBatch() up to 100 in one all-or-nothing request. scheduled_at sends up to 30 days ahead, and a scheduled email can be rescheduled or canceled until it leaves.

Idempotent by default

The SDK puts an Idempotency-Key on every send and reuses it across its retries. Pass your own, such as an invoice id, and a repeat within 24 hours returns the first email instead of sending a second. See idempotency.

Templates

Keep subjects and bodies in coss.com: edit a draft, publish numbered versions, hold one subject, HTML and text per locale, and declare typed variables. Templates are rendered at send, so later publishes never change an email already sent or scheduled.

React Email and text parts

Pass a React Email component as react and the SDK renders it to HTML and text. Send only HTML and coss.com adds a plain-text part generated from it, with links written out.

Attachments

Base64 files, inline images by content_id, up to 20 per email. The bytes are deleted once the email is sent, fails or is canceled; reads and webhooks only ever show their metadata.

Per-recipient events

Each recipient has its own status, from queued to delivered, bounced or complained. Every change is an event on the email and a signed webhook, with your tags and category, never the content.

Deliverability

The parts of email that decide whether it reaches the inbox, set up and watched for you.

Domains with Domain Connect

Each domain gets three DKIM keys, a MAIL FROM subdomain with SPF, and a recommended DMARC record. With a DNS provider that supports Domain Connect, the dashboard adds the missing records in one click.

DMARC reports and BIMI

coss.com receives your domains' DMARC aggregate reports, shows every source sending as you, and tells you when it is safe to move from p=none to p=reject. Each domain also gets a BIMI record check.

Tracking on your domain

Open and click tracking per environment, category or send. A custom tracking domain such as links.acme.com serves the links from your own brand, with a certificate coss.com issues.

Suppressions

Permanent bounces and complaints are suppressed automatically, and one-click unsubscribe suppresses per category. One list per environment, managed, imported and exported through the API.

Two streams

Transactional and marketing email leave on separate sending configurations with separate reputations, so a newsletter's complaints never hold up a password reset.

Dedicated IPs

With the add-on, live email leaves from your own Amazon SES managed dedicated IPs, warmed up per mailbox provider. What they can't take yet goes out on shared IPs, so warm-up never delays a send.

Sensitive content can skip storage: with content storage set to discard, coss.com keeps an email's subject and bodies only until it is sent.

Specifications

The limits a send is checked against. The docs list each one in context.

Emails per batch
100, all or nothing
Recipients per field
50
Scheduling
up to 30 days ahead
Attachments
20 files, 25 MB combined
Request size
40 MB
Custom headers
15
Tags per email
50
Idempotency window
24 hours
Locales per template version
30
Email retention
45 days
Custom tracking domains
Pro, Scale and Enterprise
Dedicated IPs add-on
Scale and Enterprise

Pricing

Email is billed per recipient. Sandbox environments send nothing and are free.

Free includes 3,000 email recipients a month. Dedicated IPs are an add-on:

See pricing for the plans.

Questions

What is the coss.com email API?
A REST API and TypeScript SDK for sending transactional email such as sign-in links, receipts and password resets from your own verified domains. Each email is tracked per recipient, and every delivery event can be sent to your webhook endpoint.
How do I send an email with coss.com in Node.js or TypeScript?
Install the coss package, set COSS_API_KEY, and call coss.email.send() with from, to, subject and html or text. The call returns { data, error } instead of throwing, and the SDK retries failed requests under the same Idempotency-Key so an email is never sent twice.
Can I send emails in bulk or in batches?
Yes. coss.email.sendBatch() sends up to 100 emails in one request, each with its own sender, recipients and content. A batch is all or nothing, so if one email is invalid nothing is sent, and one idempotency key covers the whole batch.
Can I schedule an email to send later?
Yes. Pass scheduled_at as an ISO 8601 time up to 30 days ahead. Until it is sent, you can move it with coss.email.reschedule() or cancel it with coss.email.cancel().
How do I set up DKIM, SPF and DMARC for my domain?
Add the domain in the dashboard or with coss.domains.create() and publish the records it returns, three DKIM CNAMEs, a MAIL FROM MX and SPF record, and a recommended DMARC record. If your DNS provider supports Domain Connect, the dashboard adds them for you in one click.
Does coss.com offer dedicated IP addresses?
Yes, as the Dedicated IPs add-on. They are Amazon SES managed dedicated IPs, warmed up automatically per mailbox provider, and while they warm up the mail they can't take yet leaves from shared IPs. The pricing page lists the plans it can be added to.
How much does sending email cost?
Email is billed per recipient, with a monthly allowance on the Free plan and volume tiers on paid plans. Sandbox environments send nothing and are free. The pricing page lists the current rates.
On the same key, SDK, webhooks and logs: nothing more to set up.

Compared

How it stacks up against the services you may be using, with sources.

Start with Email today.

Development keys record every request and event and deliver nothing, so you can build and test before you verify a domain. Hand your coding agent this prompt:

Add coss.com to this project: read https://coss.com/llms.txt, get a development key with `npx coss-cli init --agents`, and build and test with it.

Pricing