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.It is allowed for transactional and auth mail and not for marketing. A broadcast needs a domain you own, because bulk mail from a shared parent is how a shared parent stops being deliverable for everybody on it.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 address is on your suppression list — it was stored and not sent, and blocked says which rule stopped it.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, and marketing sends become available.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.
