Email messaging model
Send email through one API with shared contacts, conversations, templates, and delivery events.
Every email goes through the same message API and shares contacts, conversations, delivery events, and templates. This model covers immediate email, scheduled email, and each recipient dispatched by a campaign run.
One send API
Every send is a message: a piece of content, a recipient, and the channel that carries it.
POST /v1/messages names those parts explicitly: a channel discriminator, a to array, and
email content nested under the email key.
{
"to": [{ "contactId": "contact_123" }],
"channel": "email",
"email": { "subject": "Welcome", "html": "<h1>Welcome!</h1>" }
}The email.send() SDK facade is that same call wearing email-shaped clothes. For the full model,
why both shapes exist and when to reach for each, see
Email and the unified API.
Shared primitives
Email sends reuse the same organization-level primitives:
- Contacts: address a
{ contactId }without re-supplying an email address per send. - Conversations: inbound replies thread into the same conversation model as outbound email.
- Events & webhooks: delivery, status, and inbound events arrive in one signed stream; subscribe once. See Webhooks.
- Templates: versioned email content rendered at send time and referenced by
templateIdortemplateSlug.
Scheduled messages and campaigns use these same primitives and finish on the normal email delivery path.