1
Send it
email.send takes one recipient and either a template with variables or an inline subject and body. Omit from and it uses the project’s default sender.Give text as well as html when you write both; omit text and it is derived from the HTML. A message with neither is refused.2
Where it came from
The default sender is
no-reply@<your-project-slug>.via.trylath.com — a subdomain of the sending parent, one per project, already authenticated. Nothing to configure and no DNS to wait on.Broadcasts and automations can send from it too. A domain of your own is still worth adding before you send in volume: mail from the shared parent carries a name every other project also sends from, and your own domain keeps your reputation yours.3
Read the reply, not the HTTP status
The call returns the message id and a status.
queued means it is on its way. A 200 with suppressed means the audience policy refused the address — it was stored and not sent, and the suppressed object beside it gives the reason and the detail.This is the distinction most send APIs collapse. A suppressed send is not a failure and not a delivery, and treating the 200 as proof of either is how a bounce loop starts.4
Then use your own domain
email.domain.add returns the domain’s id and the DNS records to add; email.domain.verify takes that id and checks them. Once a domain is verified you can send from any address on it.Delivery, bounce and complaint receipts land on the message either way, and a hard bounce or a complaint suppresses the address and fans out as an event.
