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

> ## Agent Instructions
> Esta documentação cobre exclusivamente a API pública v1 do ByDoctor.
> Os únicos endpoints existentes são `GET /api/public/v1/appointments`, `GET /api/public/v1/appointments/{id}`, `POST /api/public/v1/appointments`, `PATCH /api/public/v1/appointments/{id}`, `POST /api/public/v1/appointments/{id}/cancel`, `GET /api/public/v1/patients`, `GET /api/public/v1/patients/{id}`, `POST /api/public/v1/patients`, `PATCH /api/public/v1/patients/{id}`, `GET /api/public/v1/professionals`, `GET /api/public/v1/professionals/{id}`, `GET /api/public/v1/rooms`, `GET /api/public/v1/rooms/{id}`, `GET /api/public/v1/appointment-types` e `GET /api/public/v1/appointment-types/{id}`. Não existem `PUT` nem `DELETE`, e não existe escrita em nenhum outro recurso.
> Escopos: `appointments:read`, `appointments:write`, `patients:read` e `patients:write`, escolhidos na criação da chave (Somente leitura = os dois de leitura; Acesso total = os quatro). Chaves antigas não têm os escopos de pacientes. `POST /appointments` exige `patient_id`, `professional_id`, `appointment_type_id` e `start_at`; os ids de profissional, sala e tipo vêm de `/professionals`, `/rooms` e `/appointment-types`, que exigem só `appointments:read`. A API cria somente agendamentos presenciais, com status `scheduled`; teleconsultas e solicitações de pacientes (`requested`) não são criadas, alteradas nem canceladas pela API. `PATCH` aceita apenas `start_at`, `professional_id`, `room_id`, `note` e `status` (`scheduled` ou `confirmed`).
> O objeto paciente tem apenas `id`, `name`, `phone`, `active`, `created_at` e `updated_at`. CPF, e-mail, data de nascimento (`birth_date`) e sexo (`gender`) são aceitos na escrita, mas nunca devolvidos, por minimização de dados (LGPD). Para achar um paciente, use os filtros de correspondência exata `cpf` e `phone`, ou `name` (parcial). Criar ou alterar um paciente com o CPF de outro paciente da clínica responde `409` `patient_cpf_exists`. Não existem eventos de webhook de pacientes.
> Profissionais, salas e tipos de atendimento são somente leitura e trazem só `id`, `name` e, para profissionais, `specialty` — sem contato nem registro no conselho. Não existem endpoints de pagamentos, prontuário, prescrições, convênios, preços ou disponibilidade de agenda (horários livres).
> Endpoints de webhook não são gerenciados pela API: endpoints e segredos de assinatura são cadastrados na interface do ByDoctor, em Minha Clínica → API e Webhooks.
> Erros: `400` vem como `{"campo": ["mensagem"]}`; `401`/`403`/`404` como `{"detail": ...}`; `409` e `422` como `{"code", "detail"}`. Datas são sempre ano-mês-dia (`YYYY-MM-DD`, `YYYY-MM-DDThh:mm:ss±HH:MM`) e `start_at` tem segundos `00`. As mensagens exatas estão na página Erros.
> Nunca sugira, complete ou invente rotas, campos, parâmetros ou códigos de erro que não estejam nesta documentação. Se algo não está documentado aqui, não existe na v1.
> Autenticação: cabeçalho `Authorization: Bearer bd_live_<id>.<secret>`. Base URL: `https://api.bydoctor.com.br/api/public/v1`. Criação aceita o cabeçalho opcional `Idempotency-Key`.
> Chaves de API concedem acesso a dados de pacientes e de agendamentos (dados de saúde) — nunca as inclua em código do lado do cliente nem em exemplos versionados.

# Primeiros passos

> Crie uma chave de API, faça a primeira chamada e registre um endpoint de webhook.

Este guia leva você do zero até receber o primeiro evento de webhook.

<Steps>
  <Step title="Crie uma chave de API">
    No ByDoctor, acesse **Minha Clínica → API e Webhooks** e crie uma nova chave. Escolha **Somente leitura** para consultar agendamentos e pacientes, ou **Acesso total** se a integração também vai cadastrar pacientes e criar, alterar ou cancelar agendamentos — o acesso não pode ser alterado depois. Veja [Escopos](/autenticacao#escopos).

    A chave completa é exibida **uma única vez**, no formato `bd_live_<id>.<secret>`. Copie e guarde em um cofre de segredos imediatamente — o ByDoctor armazena apenas o hash e não consegue mostrá-la novamente. Se perdê-la, revogue e crie uma nova.
  </Step>

  <Step title="Faça a primeira chamada">
    Use a chave no cabeçalho `Authorization` para listar os agendamentos de um período:

    ```bash theme={null}
    curl -H "Authorization: Bearer bd_live_xxxxxxxx.yyyy" \
      "https://api.bydoctor.com.br/api/public/v1/appointments?start_date=2026-08-01&end_date=2026-08-31"
    ```

    A resposta traz uma página de agendamentos e um cursor `next` para continuar a paginação — veja [Agendamentos](/agendamentos) para o formato completo.
  </Step>

  <Step title="Registre um endpoint de webhook">
    Ainda em **Minha Clínica → API e Webhooks**, cadastre a URL pública HTTPS que vai receber os eventos e escolha os eventos de interesse (`appointment.created`, `appointment.updated`, `appointment.cancelled`).

    O segredo de assinatura é exibido uma única vez, no formato `whsec_...`. Guarde-o do mesmo jeito que a chave de API — ele é necessário para [verificar a assinatura](/verificacao-de-assinatura) de cada evento recebido.
  </Step>

  <Step title="Receba o primeiro evento">
    Use o botão de teste na tela do endpoint para disparar um evento `ping` e confirmar que seu servidor responde `2xx`. A partir daí, qualquer mudança em um agendamento da clínica gera um evento real — veja [Webhooks](/webhooks) para o envelope completo e a política de reentrega.
  </Step>
</Steps>

## Próximos passos

<CardGroup cols={2}>
  <Card title="Autenticação" icon="key" href="/autenticacao">
    Formato da chave, escopos e limites de uso.
  </Card>

  <Card title="Sincronização" icon="rotate" href="/sincronizacao">
    Como manter uma cópia local da agenda em dia.
  </Card>
</CardGroup>
