Pular para conteúdo

Payloads e respostas — catálogo completo

Esta página lista todos os payloads de request e response observados nos dois projetos, prontos para copiar em testes unitários ou mocks.

1. Horários — request

# agendamento.py:451-473 (CLINFETO)
payload = {
    "filter": {
        "agendas": [{"id": id_agenda, "tipo": "cs"}],
        "convenio_id": id_convenio,
        "data": data_inicio,     # YYYY-MM-DD
        "endDate": data_fim,     # YYYY-MM-DD  (+90 dias)
        "suceder": 0,
        "especialidade_id": proc_info["id_especialidade"],
        "limit": 100,
        "ordenacao": "asc",
        "procedimentos": [proc_info["id_procedimento"]],
    }
}
# scheduling.py:201-212 (MEDCENTER)
payload = {
    "filter": {
        "agendas": [{"id": proc["id_agenda"], "tipo": "cs"}],
        "convenio_id": conv["id"],
        "data": hoje,            # YYYY-MM-DD
        "endDate": end_date,     # YYYY-MM-DD
        "suceder": 0,
        "especialidade_id": proc["id_especialidade"],
        "limit": 100,
        "ordenacao": "desc",
        "procedimentos": [proc["id_procedimento"]],
    }
}

1. Horários — response

Sucesso

{
  "data": [
    {
      "data": "15-04-2026",
      "agendas": [
        {
          "agendaNome": "JOANA SILVA",
          "horarios": [
            {"hora": "08:00", "dataconsulta": "2026-04-15 08:00:00"},
            {"hora": "08:30", "dataconsulta": "2026-04-15 08:30:00"},
            {"hora": "09:00", "dataconsulta": "2026-04-15 09:00:00"},
            {"hora": "14:00", "dataconsulta": "2026-04-15 14:00:00"},
            {"hora": "14:30", "dataconsulta": "2026-04-15 14:30:00"}
          ]
        }
      ]
    },
    {
      "data": "16-04-2026",
      "agendas": [ ... ]
    }
  ]
}

Vazio

{"data": []}

Erro de autenticação

  • HTTP 401 — token inválido ou header sistema ausente.

2. Buscar paciente — response

Encontrado

{
  "data": {
    "id": 42,
    "paciente_id": 42,
    "nome": "MARIA DA SILVA",
    "cpf": "12345678900",
    "dataNascimento": "10-05-1985",
    "celular": "5599999999999",
    "email": "maria@example.com"
  }
}

Campos extras

A API pode devolver campos adicionais (email, endereco, convenio, etc.) dependendo da versão/instância. O cliente só consome paciente_id (ou id) e nome. Mantenha o resto como passthrough.

Não encontrado

{"data": "O CPF informado não foi encontrado."}

Parser defensivo

def parse_paciente(result: dict) -> dict | None:
    data = result.get("data")
    if isinstance(data, dict) and data.get("cpf"):
        return data
    if data == "O CPF informado não foi encontrado.":
        return None
    return None

3. Cadastrar paciente — request

{
  "pacientes": [
    {
      "id": 123,
      "nome": "MARIA DA SILVA",
      "dataNascimento": "1985-05-10",
      "cpf": "12345678900",
      "celular": "5599999999999"
    }
  ]
}

Formato dataNascimento muda por endpoint

  • No request de cadastro (endpoint 3): YYYY-MM-DD (ISO)
  • No response de busca (endpoint 2): DD-MM-YYYY

4. Confirmar agendamento — request

{
  "paciente_id": 42,
  "cpf": "12345678900",
  "convenio_id": 212,
  "data": "15-04-2026",
  "hora": "14:00",
  "agenda_id": 58,
  "agenda_tipo": "cs",
  "status": "ativo",
  "servicos": [
    {"id": 170}
  ]
}

4. Confirmar agendamento — response

Sucesso

{
  "description": "Consulta agendada com sucesso para 15/04/2026 às 14:00 com JOANA SILVA",
  "preparo": "Comparecer 15 minutos antes. Trazer documento com foto, cartão do convênio, e pedido médico quando aplicável."
}

Erro (ex.: slot ocupado)

  • HTTP 4xx com body varável.
  • Estratégia: antes de confirmar, sempre re-validar disponibilidade via endpoint 1. Ver agendamento completo.

Resumo de formatos de data

Contexto Formato
Endpoint 1 request (filter.data, endDate) YYYY-MM-DD
Endpoint 1 response (data[].data) DD-MM-YYYY
Endpoint 2 response (dataNascimento) DD-MM-YYYY
Endpoint 3 request (dataNascimento) YYYY-MM-DD
Endpoint 4 request (data) DD-MM-YYYY

Isso é confuso. Mantenha helpers:

def _yyyymmdd_to_ddmmyyyy(s: str) -> str:
    y, m, d = s.split("-")
    return f"{d}-{m}-{y}"

def _ddmmyyyy_to_yyyymmdd(s: str) -> str:
    d, m, y = s.split("-")
    return f"{y}-{m}-{d}"