Nenhuma rota tem barra final. Não existem
PUT nem DELETE. Na referência da API gerada a partir do OpenAPI, o parâmetro de rota das URLs de detalhe aparece como public_id — é o mesmo valor do campo id no corpo da resposta, o identificador do agendamento (veja Identificador abaixo).
Toda escrita devolve o mesmo objeto de agendamento que GET devolve, já com o estado gravado — não é preciso consultar de novo.
Listar agendamentos
Filtros
Paginação por cursor
A paginação é por cursor, não por número de página. A resposta traznext (e previous) como URLs prontas — siga next até que ele venha null; não tente calcular offsets ou montar o cursor você mesmo.
patient, professional e room podem vir null — por exemplo, uma teleconsulta não tem sala associada.
patient.phone é o texto cadastrado pela clínica, sem normalização; não há garantia de formato E.164 — (11) 99999-8888 é tão provável quanto +5511999998888.
appointment_type é o tipo de atendimento do agendamento; a lista de tipos da clínica está em Tipos de atendimento.
origin indica como o agendamento foi criado: staff (equipe da clínica), patient_booking (agendamento online feito pelo paciente) ou api (criado por esta API).
end_at é derivado da duração de atendimento configurada para o profissional no ByDoctor; a API não recebe duração.
Buscar um agendamento
id inexistente ou de outra clínica responde 404 Not Found.
Criar um agendamento
Requer o escopoappointments:write — veja Escopos.
Responde
201 Created com o objeto do agendamento. O agendamento nasce:
- presencial (
modality: "in_person") — a API não cria teleconsultas; - com
status: "scheduled"eorigin: "api"; - no tipo informado em
appointment_type_ide com o pagador Particular do profissional, com o valor da tabela de preços da clínica para esse profissional, tipo e pagador — convênio e valor são ajustados no aplicativo, se necessário.
400, no formato de erro por campo:
start_at dentro de um bloqueio responde 409 com code: "slot_blocked". Marcar dois pacientes no mesmo horário com o mesmo profissional é permitido, como no aplicativo.
Se a clínica exige sala em atendimentos presenciais e a grade do profissional não tem uma sala padrão para o horário, a API responde 409 com code: "room_required" — envie room_id.
Idempotency-Key
Envie o cabeçalhoIdempotency-Key (até 255 caracteres, um UUID serve) para poder repetir a criação com segurança depois de um timeout ou erro de rede. Repetir a mesma requisição com a mesma chave em até 24 horas devolve o agendamento já criado — mesmo 201, mesmo corpo — com o cabeçalho de resposta Idempotent-Replayed: true, em vez de criar outro. A mesma chave com um corpo diferente, ou em outro endpoint, responde 422 com code: "idempotency_key_reused".
A chave é privada à sua chave de API: duas chaves de API da mesma clínica não compartilham histórico de idempotência.
Alterar um agendamento
Requer o escopoappointments:write. Envie apenas os campos que mudam — o corpo vazio responde 400.
Responde
200 OK com o objeto atualizado. O tipo de atendimento não muda pela API: ele define o valor, que é fixado na criação.
Regras de alteração
As mesmas do aplicativo:- Só agendamentos presenciais com
statusscheduledouconfirmedaceitam alteração. Qualquer outro caso responde409(veja os códigos abaixo). - A partir de
confirmed, apenasstatuspode mudar. Para reagendar ou trocar o profissional de um agendamento confirmado, volte-o parascheduledprimeiro ({"status": "scheduled"}) e altere em seguida. - Um agendamento cujo prontuário já foi preenchido pelo profissional está congelado: nada muda, nem o status (
409appointment_finalized). - Solicitações de agendamento online feitas por pacientes (
status: "requested") são confirmadas ou recusadas no aplicativo, não pela API.
Cancelar um agendamento
Requer o escopoappointments:write. Não há corpo.
200 OK com o objeto do agendamento, agora com status: "cancelled". A chamada é idempotente: cancelar um agendamento já cancelado responde 200 com o mesmo objeto e não gera um novo evento de webhook.
Só um agendamento presencial com status: "scheduled" pode ser cancelado — a mesma regra do aplicativo. Um agendamento confirmed precisa voltar para scheduled antes (PATCH {"status": "scheduled"}); um agendamento com prontuário preenchido não pode ser cancelado (409 appointment_finalized).
O agendamento cancelado continua aparecendo na listagem com status: "cancelled" e updated_at atualizado, como descrito em Sincronização.
Escritas e webhooks
Uma escrita pela API dispara os mesmos eventos de uma edição feita no aplicativo —appointment.created, appointment.updated ou appointment.cancelled — para todos os endpoints de webhook da clínica inscritos naquele evento, inclusive o seu. Se o seu sistema também recebe webhooks, espere receber o eco da própria escrita e trate-o de forma idempotente pelo id do agendamento.
Erros
As mensagens exatas de cada validação e as regras de formato estão em Erros.Códigos de 409
Ramifique pelo
code, não pelo texto de detail — o texto pode mudar; o código não.
Identificador
Oid de um agendamento é um UUID — é o identificador do agendamento na API e o único valor aceito nas URLs de detalhe. Armazene o UUID como chave estrangeira do agendamento no seu sistema — ele é estável entre chamadas e entre eventos de webhook.
Os objetos aninhados usam identificadores próprios: patient.id, professional.id, appointment_type.id e room.id são numéricos, os mesmos valores aceitos pelos filtros patient_id, professional_id e room_id e pelos campos de mesmo nome nas escritas. Se você pretende filtrar por eles ou criar agendamentos depois, guarde esses valores também. patient.id é o id do recurso Pacientes.