> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trylath.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Every Lath operation is POST https://platform.trylath.com/<operation name with dots replaced by slashes>, with a JSON body and `Authorization: Bearer <key>`. `email.send` is POST /email/send.
> Branch on `error.code`, never on `error.message`. Every refusal also carries `error.fix`, which names the next step.
> Send an `Idempotency-Key` header on any operation that is not retry-safe, so a retry cannot run it twice.
> A `lath_test_` key emails only the account's own members and sends no SMS; a `lath_live_` key reaches real recipients and is billed.
> The OpenAPI document, generated from the same registry as the routes, is at https://platform.trylath.com/openapi.json.

# Webhook events

> Every event a webhook endpoint can subscribe to — 158 across 7 products.

Subscribe with the exact name or a `product.*` wildcard; an endpoint with no event types receives all of them.

<Note>
  Names are matched exactly, and `developers.webhook.create` refuses an event Lath does not emit — a subscription to a name that does not exist would otherwise produce an endpoint that never fires, with nothing reporting a problem.
</Note>

## account

Take all 12 with `account.*`.

* `account.created`
* `account.updated`
* `account.closed`
* `account.reopened`
* `account.member.invited`
* `account.member.invite_resent`
* `account.member.accepted`
* `account.member.role_changed`
* `account.member.removed`
* `account.theme.draft_saved`
* `account.theme.published`
* `account.theme.reset`

## audience

Take all 16 with `audience.*`.

* `audience.contact.created`
* `audience.contact.updated`
* `audience.contact.deleted`
* `audience.contact.imported`
* `audience.consent.granted`
* `audience.consent.revoked`
* `audience.preferences.changed`
* `audience.suppression.added`
* `audience.suppression.lifted`
* `audience.topic.created`
* `audience.topic.updated`
* `audience.topic.archived`
* `audience.topic.restored`
* `audience.segment.created`
* `audience.segment.updated`
* `audience.segment.deleted`

## auth

Take all 50 with `auth.*`.

* `auth.user.created`
* `auth.user.updated`
* `auth.user.deleted`
* `auth.user.banned`
* `auth.user.unbanned`
* `auth.user.impersonated`
* `auth.signin.started`
* `auth.signin.completed`
* `auth.signin.failed`
* `auth.link.completed`
* `auth.oauth.started`
* `auth.session.refreshed`
* `auth.session.revoked`
* `auth.session.signed_out`
* `auth.session.exchanged`
* `auth.session.family_revoked`
* `auth.identity.add_started`
* `auth.identity.added`
* `auth.identity.removed`
* `auth.passkey.added`
* `auth.passkey.removed`
* `auth.password.set`
* `auth.password.changed`
* `auth.password.removed`
* `auth.factor.activated`
* `auth.factor.removed`
* `auth.factor.replaced`
* `auth.factor.recovery_regenerated`
* `auth.mfa.required`
* `auth.mfa.failed`
* `auth.mfa.recovery_used`
* `auth.device.started`
* `auth.device.approved`
* `auth.device.denied`
* `auth.device.completed`
* `auth.org.created`
* `auth.org.updated`
* `auth.org.deleted`
* `auth.org.invited`
* `auth.org.invite_revoked`
* `auth.org.joined`
* `auth.org.left`
* `auth.org.member_updated`
* `auth.org.member_removed`
* `auth.org.switched`
* `auth.settings.changed`
* `auth.settings.reset`
* `auth.oauth.app.changed`
* `auth.signing_key.rotated`
* `auth.signing_key.retired`

## billing

Take all 8 with `billing.*`.

* `billing.cap.changed`
* `billing.cap.reached`
* `billing.payment.setup_started`
* `billing.payment.updated`
* `billing.payment.failed`
* `billing.passthrough.recorded`
* `billing.credit.recorded`
* `billing.credit.reversed`

## developers

Take all 12 with `developers.*`.

* `developers.key.created`
* `developers.key.updated`
* `developers.key.rotated`
* `developers.key.revoked`
* `developers.webhook.created`
* `developers.webhook.updated`
* `developers.webhook.secret_rotated`
* `developers.webhook.enabled`
* `developers.webhook.disabled`
* `developers.webhook.test`
* `developers.webhook.replayed`
* `developers.webhook.dead_replayed`

## email

Take all 36 with `email.*`.

* `email.queued`
* `email.sent`
* `email.failed`
* `email.suppressed`
* `email.cancelled`
* `email.bounced`
* `email.broadcast.created`
* `email.broadcast.updated`
* `email.broadcast.queued`
* `email.broadcast.cancelled`
* `email.broadcast.paused`
* `email.broadcast.resumed`
* `email.automation.created`
* `email.automation.updated`
* `email.automation.activated`
* `email.automation.paused`
* `email.automation.archived`
* `email.automation.cancelled`
* `email.automation.sent`
* `email.automation.suppressed`
* `email.template.draft_saved`
* `email.template.published`
* `email.template.deleted`
* `email.domain.added`
* `email.domain.removed`
* `email.domain.verified`
* `email.domain.pending`
* `email.domain.failed`
* `email.domain.registered`
* `email.domain.active`
* `email.domain.receiving_enabled`
* `email.domain.receiving_disabled`
* `email.inbound.received`
* `email.inbound.refused`
* `email.inbound.deleted`
* `email.sender.changed`

## sms

Take all 24 with `sms.*`.

* `sms.queued`
* `sms.sent`
* `sms.failed`
* `sms.suppressed`
* `sms.cancelled`
* `sms.broadcast.created`
* `sms.broadcast.queued`
* `sms.broadcast.cancelled`
* `sms.broadcast.paused`
* `sms.broadcast.resumed`
* `sms.template.draft_saved`
* `sms.template.published`
* `sms.template.deleted`
* `sms.settings.changed`
* `sms.settings.reset`
* `sms.number.assigned`
* `sms.inbound.received`
* `sms.automation.sent`
* `sms.automation.suppressed`
* `sms.registration.submitted`
* `sms.registration.registering`
* `sms.registration.active`
* `sms.registration.action_needed`
* `sms.registration.failed`
