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": true records an opt-out. It only blocks marketing mail: receipts and password resets still reach that address.
  • Field names are lowercase letters, digits and _ (for example plan_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.