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

# Eventos

> O catálogo de eventos da clínica: quando cada um acontece, o escopo que mostra e o que vem em data.

Todo evento tem a mesma forma. O que muda é o `type` e as chaves de `data`.

```json theme={null}
{
  "id": "3a2b1c0d-9e8f-4a7b-8c6d-5e4f3a2b1c0d",
  "type": "anamnesis.completed",
  "createdAt": "2026-10-15T14:31:07Z",
  "clinicId": "0b9a8c7d-6e5f-4a3b-2c1d-0e9f8a7b6c5d",
  "actor": { "type": "patient", "id": null },
  "data": {
    "anamnesisId": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "patientId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "protocolNumber": "WX-2210-QX"
  }
}
```

Um app vê os eventos dos recursos que ele lê: `patient.*` com **Pacientes · Ler**, `anamnesis.*` com **Anamneses · Ler**, `appointment.*` e `signature_request.*` com **Documentos e assinaturas · Ler**. O evento sai venha a mudança de onde vier: do painel, do link da paciente, do assistente pelo MCP, da Autentique ou de outro app.

## Pacientes

Escopo para ver: **Pacientes · Ler**.

| Evento | Quando acontece | Em `data` |
| - | - | - |
| `patient.created` | Uma ficha de paciente foi criada: pelo app, pelo link de cadastro da clínica ou pela API. | `patientId` |
| `patient.updated` | O cadastro da paciente mudou; `changedFields` diz quais campos, quando a mudança veio do cadastro. | `patientId`, `changedFields` |
| `patient.archived` | A ficha foi arquivada pela gestora. | `patientId` |
| `patient.restored` | A ficha arquivada voltou a ativa. | `patientId` |
| `patient.merged` | Duas fichas da mesma pessoa foram unificadas. | `patientId` |

## Anamneses

Escopo para ver: **Anamneses · Ler**.

| Evento | Quando acontece | Em `data` |
| - | - | - |
| `anamnesis.sent` | A anamnese foi enviada à paciente (ou o link foi gerado). | `anamnesisId`, `patientId` |
| `anamnesis.resent` | O link da anamnese foi reenviado; o anterior deixou de valer. | `anamnesisId`, `patientId` |
| `anamnesis.completed` | A paciente respondeu e enviou a anamnese; traz o protocolo. | `anamnesisId`, `patientId`, `protocolNumber` |
| `anamnesis.canceled` | A anamnese foi cancelada antes de ser respondida. | `anamnesisId`, `patientId` |

## Documentos

Escopo para ver: **Documentos e assinaturas · Ler**.

| Evento | Quando acontece | Em `data` |
| - | - | - |
| `appointment.documents_generated` | O contrato e os termos do atendimento foram gerados (ou gerados de novo); traz a geração. | `appointmentId`, `patientId`, `generation` |
| `appointment.canceled` | Os documentos do atendimento foram cancelados. | `appointmentId`, `patientId` |

## Assinaturas

Escopo para ver: **Documentos e assinaturas · Ler**.

| Evento | Quando acontece | Em `data` |
| - | - | - |
| `signature_request.sent` | Os documentos saíram para a paciente assinar, depois da janela de 10 segundos. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.resent` | O link de assinatura foi reenviado. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.viewed` | A paciente abriu o link de assinatura. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.signed` | Alguém assinou: `signer` é `patient`, `guardian` ou `clinic`. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `signer` |
| `signature_request.completed` | Todos assinaram todos os documentos do envio. É o evento para marcar a venda. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `documentIds` |
| `signature_request.declined` | A paciente recusou assinar. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.expired` | O link de assinatura venceu sem todas as assinaturas. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.canceled` | O envio foi cancelado pela clínica. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber` |
| `signature_request.delivery_failed` | A mensagem com o link não chegou por um canal; traz `channel`. | `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `channel` |

## Quem fez

| `actor.type` | Quem | `actor.id` |
| - | - | - |
| `user` | uma pessoa da clínica, no painel ou pelo assistente (OAuth) | o id da pessoa |
| `integration` | um app de integração, pela chave | o id do app |
| `patient` | a paciente, pelo link (cadastro, anamnese, assinatura) | `null` |
| `provider` | a Autentique, o provedor de assinatura | `null` |
| `system` | a própria Westhetics (link vencido, todos assinaram) | `null` |

## Guardados por 30 dias

Os eventos ficam 30 dias em `GET /v1/events` e `GET /v1/events/{id}`. Depois disso somem; o que aconteceu continua na trilha de auditoria da clínica e no estado de cada recurso.

## Pela consulta: pelo menos uma vez, sem pular

`GET /v1/events` em ordem crescente (`order=asc`, o padrão) é o jeito de consumir sem webhook: guarde o `meta.nextCursor` e peça de novo. O cursor nunca pula evento. A sequência de um evento é dada quando ele é gravado, e uma gravação pode terminar depois de outra que começou mais tarde; por isso a lista só mostra um evento quando nenhuma gravação mais antiga ainda está em andamento. Na prática, um evento pode levar alguns segundos a mais para aparecer na consulta (no webhook, não).

A entrega é **pelo menos uma vez**, na consulta e no webhook: guarde o `id` dos eventos que já tratou e ignore o repetido. Em `order=desc` (os mais recentes primeiro, para mostrar numa tela) não há espera.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.