Skip to main content
A API expõe cinco endpoints no recurso de agendamentos: 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 traz next (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

Devolve o mesmo objeto de agendamento mostrado acima. Um id inexistente ou de outra clínica responde 404 Not Found.

Criar um agendamento

Requer o escopo appointments: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" e origin: "api";
  • no tipo informado em appointment_type_id e 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.
Os ids de paciente, profissional, tipo e sala só resolvem dentro da clínica da chave. Um id de outra clínica, inativo ou inexistente recebe a mesma resposta 400, no formato de erro por campo:
A clínica pode ter bloqueios de agenda por profissional (folgas, férias). Um 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çalho Idempotency-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 escopo appointments: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 status scheduled ou confirmed aceitam alteração. Qualquer outro caso responde 409 (veja os códigos abaixo).
  • A partir de confirmed, apenas status pode mudar. Para reagendar ou trocar o profissional de um agendamento confirmado, volte-o para scheduled primeiro ({"status": "scheduled"}) e altere em seguida.
  • Um agendamento cujo prontuário já foi preenchido pelo profissional está congelado: nada muda, nem o status (409 appointment_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 escopo appointments:write. Não há corpo.
Responde 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

O id 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.