Resend-compatible extras
SendNeo is a transactional email API. These endpoints stay so integrations written against Resend's audiences,
contacts and broadcasts calls keep working, and so accounts that already use them lose nothing. They use the same base
URL (https://sendneo.yorkermedia.com/api), the same keys and the same monthly email quota as POST /emails.
Sending newsletters to an audience as a product of its own? That is what LetterNeo is for.
Audiences
| Endpoint | Body / notes |
|---|---|
POST /audiences |
{"name": "Product updates"}. The Free plan holds one audience. |
GET /audiences |
Every audience with its subscribers count. |
GET /audiences/{id} |
By id or slug. |
DELETE /audiences/{id} |
Deletes the audience and its contacts. |
An audience object looks like this:
{"object": "audience", "id": "8f1c…", "name": "Product updates", "slug": "product-updates",
"created_at": "2026-10-16T12:00:00+00:00", "double_optin": true,
"form_url": "https://sendneo.yorkermedia.com/f/8f1c…", "page_url": "https://sendneo.yorkermedia.com/n/product-updates"}
Contacts
| Endpoint | Body / notes |
|---|---|
POST /audiences/{id}/contacts |
email (required), first_name, last_name, tags (up to 20), fields (up to 50 custom values), confirmed, unsubscribed |
GET /audiences/{id}/contacts |
The 1,000 newest contacts. |
GET /audiences/{id}/contacts/{id or email} |
One contact. |
PATCH /audiences/{id}/contacts/{id or email} |
first_name, last_name, fields (merged; null removes a field), unsubscribed: true |
DELETE /audiences/{id}/contacts/{id or email} |
Removes the contact. |
- Audiences use double opt-in by default: with a live key, a new contact gets a confirmation email first unless you
send
"confirmed": true. Only set it when the person really asked to join. Test keys add contacts as confirmed. "unsubscribed": truerecords an opt-out. It only blocks marketing mail: receipts and password resets still reach that address.- Field names are lowercase letters, digits and
_(for exampleplan_name).
Broadcasts
| Endpoint | Body / notes |
|---|---|
POST /broadcasts |
audience_id, subject, and markdown, html or text. Optional: from, reply_to, preheader, segment_tag, track, subject_b, ab_percent (4–50), ab_wait_minutes (15–4320), ab_metric (opens or clicks) |
GET /broadcasts |
The 100 newest broadcasts with their stats. |
GET /broadcasts/{id} |
One broadcast; stats once it is sending; ab_test when it has a second subject. |
POST /broadcasts/{id}/test |
{"to": ["you@example.com"]}: one to five test copies. |
POST /broadcasts/{id}/send |
Send now, or {"scheduled_at": "2026-10-20T09:00:00Z"}. Live keys only. |
POST /broadcasts/{id}/duplicate |
A new draft with the same content. |
DELETE /broadcasts/{id} |
Drafts, scheduled and paused broadcasts only. |
Before a broadcast can go out, the account must be approved, the From address must be on a verified domain and the
account needs a postal address in Settings (anti-spam laws require one in marketing mail). Every copy carries one-click
unsubscribe headers (RFC 8058) and a visible unsubscribe link. {{first_name}}, {{last_name}}, {{email}} and any
custom field work as merge tags, with {{field|fallback}} for empty values.
SendNeo pauses a broadcast by itself when more than 2% of delivered copies bounce or more than 0.08% complain, once at least 200 have been delivered.
When an agent key or an "Agent access" OAuth connection calls send, nothing goes out: SendNeo files an approval request, emails the account's team, and sends only after someone approves it in the dashboard.
Sequences
| Endpoint | Body / notes |
|---|---|
GET /sequences |
Existing sequences with their step and enrolment counts. |
POST /sequences/{id}/enroll |
{"email": "…"}: starts the sequence for a subscribed contact of its audience. |
Hosted pages and events
Audiences keep their hosted pages: the sign-up form endpoint (POST /f/{audience_id}), the public archive
(/n/{slug}), confirmation links and one-click unsubscribe. Webhooks can subscribe to contact.subscribed and
contact.unsubscribed next to the email events; see Webhooks.