# Sendly for developers — one API for transactional email

> The Sendly developer platform: one REST API for transactional email, idempotent sends, webhooks, an event stream, typed SDKs, and MCP access for AI agents.

Canonical page: https://sendly.now/developers

For developers · REST API + SDKs

# Send email with   
_one_ API call.

A REST API designed by people who have to use it. Idempotency keys, tagged sends, full event streams, and SDKs that look like the docs.

[Read the docs →](https://docs.sendly.now)[Get API key](https://app.sendly.now/auth/signup)

1curl 'https://api.sendly.now/api/emails' \

2  -X POST \

3  -H "Authorization: Bearer sk_live_…" \

4  -H "Idempotency-Key: ord_8f2a1c" \

5  -H "Content-Type: application/json" \

6  -d '{

7    "from": { "name": "Acme", "email": "hello@acme.com" },

8    "to": "jane@example.com",

9    "subject": "Welcome to Acme, Jane.",

10    "body": "<p>Your account is ready.</p>",

11    "tags": ["onboarding", "welcome"]

12  }'

1import { Sendly } from 'sendly-sdk'

2 

3const sendly = new Sendly(process.env.SENDLY_KEY)

4 

5await sendly.emails.send({

6  from: 'Acme <hello@acme.com>',

7  to: 'jane@example.com',

8  subject: 'Welcome to Acme, Jane.',

9  html: '<p>Your account is ready.</p>',

10  tags: ['onboarding', 'welcome'],

11  idempotencyKey: 'ord_8f2a1c',

12})

1from sendly import Sendly

2 

3sendly = Sendly(key=os.environ['SENDLY_KEY'])

4 

5sendly.emails.send(

6    from_='Acme <hello@acme.com>',

7    to='jane@example.com',

8    subject='Welcome to Acme, Jane.',

9    html='<p>Your account is ready.</p>',

10    tags=['onboarding', 'welcome'],

11    idempotency_key='ord_8f2a1c',

12)

200 OK·142 ms·fra-1

{ "id": "msg\_8f2a1c4b9d", "status": "queued", "to": "jane@example.com", "tags": \["onboarding", "welcome"\], "created\_at": "2026-05-24T14:32:09Z" }

§ 02First-class DX

## Built to send at _scale._

A REST API with idempotency keys baked in, queued by region, retried with exponential backoff, and signed webhooks for every event. Nothing falls on the floor.

▸ 200 OKmsg\_8f2a1c4b9djane@example.com128 ms

▸ 200 OKmsg\_8f2a1c4b9enoah@acme.io141 ms

▸ 200 OKmsg\_8f2a1c4b9fsam@hometeam.dev132 ms

▸ 200 OKmsg\_8f2a1c4ba0priya@studio.co119 ms

▸ 200 OKmsg\_8f2a1c4ba1leo@minor.app148 ms

▸ 200 OKmsg\_8f2a1c4ba2mira@orbit.so137 ms

§ 03Webhooks

## Every event,   
_as it happens._

HMAC-signed payloads, automatic retries with exponential backoff, dead-letter inspection. Server-Sent Events too if you'd rather stream straight to your dashboard.

[Webhook docs →](https://docs.sendly.now/guides/webhooks)

TimeEventRecipientLat

14:32:09Deliveredjane@example.com · msg\_8f2a1c142 ms

14:32:14Openedjane@example.com · gmail · iOS5.1 s

14:32:31Clickedjane@example.com · acme.com/setup22 s

14:32:40Deliverednoah@acme.io · msg\_8f2a1c4ba0141 ms

14:32:41Bouncedold@archive.dev · hard · suppressed98 ms

14:32:55Openednoah@acme.io · outlook · macOS14.8 s

{
  "type": "email.delivered",
  "id": "evt_3d9c2b",
  "created_at": "2026-05-24T14:32:09Z",
  "data": {
    "email_id": "msg_8f2a1c4b9d",
    "to": "jane@example.com",
    "tags": ["onboarding", "welcome"],
    "latency_ms": 142
  }
}

§ 04Templates

## Write emails in _React._

First-class React Email support. Components, props, themes — the same toolchain you already use, rendered to inbox-perfect HTML on send.

 1// emails/welcome.tsx
 2import { Html, Heading, Text, Button } from '@react-email/components'
 3
 4export default function Welcome({ name, url }) {
 5  return (
 6    <Html>
 7      <Heading>Welcome to Acme, {name}.</Heading>
 8      <Text>Your account is ready. Here's what
 9            to do next…</Text>
10      <Button href={url}>Set up your domain</Button>
11    </Html>
12  )
13}
14
15Sent via sendly.emails.send({ react: <Welcome … /> })

§ 05Broadcasts

## Write, design, _send._   
No code required.

For the marketers on your team — a visual composer that produces the same React Email components your transactional pipeline already uses.

FromAcme <hello@acme.com>

ToAudience: Active users · 24,180 contacts

SubjectA new way to write to your customers.

B

I

U

H₁

H₂

¶

↗

▦

▤

⌘

HERO IMAGE · 1200 × 600

### A new way to write to your customers.

This week, Sendly ships a visual composer alongside the React Email pipeline you already know. Same components, same theme tokens — now with a drag handle.

Designed for the marketers on your team. Reviewed by the engineers who own the codebase.

Read the announcement →

Styles

HeadlineNewsreader

BodyManrope · 15

Line height1.55

Colors

Palette

Spacing

Block ↑24

Block ↓24

Inline12

§ 06Audiences

## One contact, _complete_ history.

Every send, open, click and bounce attached to a single record. Build live segments on any property — they update the moment a contact changes.

Active founders

tag\="founders"

AND

opened\_count\>5

AND

last\_seen\>30d ago

Live count4,218

§ 07Deliverability

## Reach inboxes, _not spam._

DKIM, SPF and DMARC records generated for every domain you add. Continuous reputation monitoring, automatic suppression lists.

Inbox-first

Reputation

Sending reputation tracked against Google Postmaster, Microsoft SNDS, and a panel of seed addresses — surfaced in your dashboard, not buried in a vendor portal.

Auto-suppress

Bounces & complaints

Hard bounces and complaints automatically suppress, never charged, never retried. Manual override is one click away.

TypeRecordTTLStatus

CNAMEsendly.\_domainkey.acme.com3600Verified

TXTacme.com → v=spf1 include:sendly…3600Verified

TXT\_dmarc.acme.com → v=DMARC1; p=…3600Verified

CNAMEbounces.acme.com3600Verified

CNAMEtrack.acme.com3600Verified

§ 08Platform Features

## Everything in _your_ control.

Analytics

Intuitive analytics.

Sent, delivered, opened, clicked — bucketed per domain, per tag, per template, with daily and hourly resolution.

Logs

Detailed logs.

Every API call, every webhook delivery, every retry attempt — searchable by message ID, tag, or recipient.

200 POST /emails · msg\_8f2a1c · 142ms

200 POST /emails · msg\_8f2a1d · 138ms

429 POST /emails · rate\_limit · 12ms

200 POST /emails · msg\_8f2a1f · 156ms

200 GET /emails · 6 items · 24ms

Access

Scoped API keys.

Issue keys per environment, per domain, or sending-only. Hashed at rest, revocable in one click.

sk\_live\_prod\_••••2a1cFULL

sk\_live\_send\_••••8b42SEND

sk\_live\_eu\_••••f193DOMAIN

Domains

Domain auth, in one click.

Add a domain, copy four DNS records, and Sendly verifies in the background. Multi-region SES included.

●acme.comVERIFIED

●mail.acme.euVERIFIED

●tx.acme.coPENDING

Teams

Team management.

Invite by email, assign owner / admin / member roles.

amin@sendly.nowOwner

jane@acme.comAdmin

noah@acme.ioMember

\+ 3 moreMember

Limits

Rate limits, visible.

Per-key request budgets surfaced live. No silent throttling — you see the meter before SES does.

Today · 68,402 / 100,00068%

Burst · 87 / 200 rps44%

§ 09SDKs

## Your stack, _first-class_ support.

Hand-written SDKs that mirror the docs verbatim. Type-safe end to end. Versioned in lockstep with the API.

Node.jsv0.2.0 · ESM + CJS

$ npm install sendly-sdk

import { Sendly } from 'sendly-sdk'

const sendly = new Sendly(process.env.SENDLY_KEY)

await sendly.emails.send({
  from: 'Acme <hello@acme.com>',
  to: 'jane@example.com',
  subject: 'Welcome.',
  react: <Welcome name="Jane" />
})

Pythonv0.1.0 · py 3.10+

$ pip install sendly-python

from sendly import Sendly

sendly = Sendly(key=os.environ['SENDLY_KEY'])

sendly.emails.send(
  from_='Acme <hello@acme.com>',
  to='jane@example.com',
  subject='Welcome.',
  html=render(welcome, name='Jane'),
)

Or keep the SDK you already run — Sendly speaks the transactional-send APIs of Resend, SendGrid, Postmark, Mailgun, and Plunk. Swap the base URL and the key. [Migration guides](https://docs.sendly.now/migrate)

§ 10Quick start

## Three lines.   
_One inbox._

Install the SDK, paste your API key, send. The dev-mode CLI watches your templates and renders live previews so you ship intentionally, not anxiously.

[Read the quickstart →](https://docs.sendly.now)[Open API reference](https://docs.sendly.now/api-reference/overview)

§ 11MCP

## An endpoint for _agents._

Sendly runs a remote Model Context Protocol server, so an AI client can work in your account directly. You choose what it may do: permissions that cannot be undone — sending mail, revoking API keys — are never granted by default. They sit unchecked behind a warning, and you tick them yourself.

ConnectSTREAMABLE HTTP

Sign in with OAuth

`claude mcp add --transport http sendly https://app.sendly.now/api/mcp`

Or hand it a secret key

`claude mcp add --transport http sendly https://app.sendly.now/api/mcp \ --header "Authorization: Bearer sk_…"`

OAuth suits a person connecting a desktop client — you approve the permissions on a consent screen. A secret key suits a headless or CI agent, where the key’s own permissions are what the agent may do. Sending-only `pk_` keys are refused.

What you can grantPICK PER CONNECTION

Read your account

Domains, mailboxes, contacts, templates, campaigns, analytics, usage

Manage contacts & segments

Create, update, delete, and re-segment your audience

Manage templates & domains

Draft templates, add sending domains, run guided DNS setup

Build campaigns & webhooks

Campaign drafts, webhook endpoints, custom events

Send yourself a test email

Prove sending works from the sandbox. Reaches your own address and no one else

Send emailNeeds approval

One-off sends, and mailing a campaign to its whole audience

Run automationsNeeds approval

Edit and enable workflows that keep sending on their own

Create & delete mailboxesNeeds approval

Provision inboxes on a verified domain — deleting one erases every message it holds

Account administrationNeeds approval

Create, rotate and revoke API keys, create projects, edit your suppression list

An agent only sees the tools its grant covers — the rest are never registered. Withdraw a permission from Settings and the agent is refused on its next call.

[Read the MCP guide →](https://docs.sendly.now/guides/mcp)

[Add to Claude](https://claude.ai/directory/e2cba79c-6e59-4784-af25-93ce631ad368 "Add Sendly to Claude")

[Claude Code](https://docs.sendly.now/agent-setup/claude-code "Claude Code")[Codex](https://docs.sendly.now/agent-setup/codex "Codex")[Cursor](https://docs.sendly.now/agent-setup/cursor "Cursor")[OpenCode](https://docs.sendly.now/agent-setup/opencode "OpenCode")

## Stamp something _today._

A free API key, three lines of code, and your first message lands in seconds. No card, no overage email, no surprises.

[Get your API key →](https://app.sendly.now/auth/signup)[Read the docs](https://docs.sendly.now)
