Skip to main content
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.
Last modified on September 13, 2026