> ## 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.

# Sincronizar pacientes

> Mantenha o cadastro igual nos dois sistemas: uma carga inicial por cursor, a atualização por updatedSince e os eventos patient.* no meio do caminho.

O cadastro de pacientes muda nos dois lados: a recepção edita na Westhetics, a paciente se cadastra pelo link da clínica, o CRM cria pela API. Este é o jeito de manter tudo igual sem duplicar ficha e sem ler a lista inteira toda hora.

Escopo: **Pacientes · Ler** (e **Ler e escrever**, se o seu sistema também cria e edita).

## 1. A carga inicial

Leia tudo uma vez, em ordem de atualização, e guarde o `updatedAt` da última ficha.

```javascript theme={null}
const API = 'https://api.westhetics.io/v1'
const headers = { Authorization: `Bearer ${process.env.WESTHETICS_API_KEY}` }

async function syncPatients(since) {
  let url = new URL(`${API}/patients`)
  url.searchParams.set('limit', '100')
  if (since) url.searchParams.set('updatedSince', since)
  let last = since
  for (;;) {
    const page = await (await fetch(url, { headers })).json()
    for (const patient of page.data) {
      await upsertLocal(patient)
      last = patient.updatedAt
    }
    if (!page.meta.nextCursor) return last
    url = new URL(`${API}/patients`)
    url.searchParams.set('limit', '100')
    url.searchParams.set('cursor', page.meta.nextCursor)
  }
}
```

## 2. A atualização

De tempos em tempos (de hora em hora, de noite), rode a mesma função com o `updatedSince` guardado. Ela devolve só o que mudou.

## 3. Os eventos no meio do caminho

Para não esperar a próxima rodada, assine `patient.created`, `patient.updated`, `patient.archived`, `patient.restored` e `patient.merged`. O evento traz só o id: busque a ficha com `GET /v1/patients/{id}` e atualize.

```json theme={null}
{
  "type": "patient.updated",
  "data": {
    "patientId": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
    "changedFields": ["email", "address"]
  }
}
```

`changedFields` vem quando a mudança passou pelo cadastro: ajuda a decidir se vale buscar a ficha.

## O que guardar

* **O `id` da Westhetics** ao lado do seu. Ele é a chave estável da ficha.
* **`mergedIntoId`**: quando a gestora unifica duas fichas da mesma pessoa, a que sai fica `merged` e aponta para a que fica. Una no seu lado também.
* **O CPF não é chave.** Uma pessoa pode ter documento estrangeiro, ou nenhum.

## Criar sem duplicar

Antes de criar, busque por CPF, WhatsApp ou e-mail com `search`. Se mesmo assim duas criações se cruzarem, o `409` traz a ficha que já existe em `error.existing.id`. Use `Idempotency-Key` em todo `POST`.


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