Painel
Visão Geral (todos os pacientes)
Foco em Diabéticos — Acompanhamento de HbA1c
Monitoramento de Pedidos (Engajamento Clínico)
Últimos Exames Registrados
| Paciente | Data | A1C (%) | Obs. |
|---|---|---|---|
| Nenhum exame registrado | |||
Últimos Pacientes com Prontuário Aberto
| Paciente | Local | Última Consulta | Aberto em |
|---|---|---|---|
| Nenhum prontuário aberto ainda | |||
Agenda
Importe a agenda da CASSI, confira diferenças nas reimportações e acompanhe presença/consulta lançada no mês.
Importar agenda
Cole o texto copiado da outra agenda. Primeiro gere uma prévia para conferir novos horários, alterações e ausências na nova importação.
Mês
| Nome | Anterior | Última A1C | Ação Rápida (Data e Valor) | Próximo Exame | Status | Ações |
|---|---|---|---|---|---|---|
Nenhum paciente cadastrado | ||||||
| Carregando... | |||||
|---|---|---|---|---|---|
| Nenhum paciente pendente | |||||
Linhas de Cuidado
Gerencie programas de seguimento clinico sem alterar o fluxo atual do sistema. Aqui ficam os perfis, protocolos e itens de monitoramento da V2.
Nova Linha de Cuidado
Como Usar a V2
1. Crie ou ajuste as linhas de cuidado que a equipe quer seguir.
2. Monte o protocolo com exames e periodicidade para cada perfil.
3. Vincule os pacientes aos perfis no cadastro do paciente.
4. Use os filtros e as pendencias para busca ativa sem mexer no fluxo atual do sistema.
Linhas Configuradas
Carregando...
Protocolo da Linha Selecionada
| Item | Categoria | Intervalo | Obrigatorio | Sexo | Acao |
|---|---|---|---|---|---|
| Selecione uma linha de cuidado. | |||||
Catalogo de Exames e Rastreios
| Nome | Categoria | Unidade | Intervalo (meses) | Valor de Referência | Ativo |
|---|---|---|---|---|---|
| Carregando... | |||||
Adicionar Pacientes em Lote
Digite os nomes dos pacientes, um por linha. Todos serão adicionados de uma vez ao sistema.
Configurações
Personalize o funcionamento do prontuário, inteligência artificial, dicionários e impressos.
Locais de Atendimento
Cadastre os consultórios, clínicas ou postos onde você atende. Cada paciente pode ser vinculado a um local, mantendo todos organizados num único repositório.
Adicionar Local
Mesclar Locais
Escolha dois locais para unir. Os pacientes e permissões do local de origem serão transferidos para o local de destino, e o local de origem será excluído.
Tipos de Exames e Periodicidade
Configure os tipos de exames monitorados e o intervalo de retorno de cada um.
Adicionar Novo Tipo de Exame
Terapias Seriadas — Justificativas
Essas justificativas aparecem apenas no template Terapias Seriadas do prontuário. Não alteram logotipo, endereço, responsável técnico nem demais dados dos documentos médicos.
Inteligência Artificial (Magic SOAP)
Configure as chaves usadas pelos recursos de IA do prontuário. O Magic SOAP usa DeepSeek para organizar texto livre; os Insights IA usam DeepSeek para resumir consultas e OpenAI para consolidar achados e pendências.
Escolha como o campo de evolução aparece por padrão no prontuário. Você pode alternar a qualquer momento dentro da consulta.
Alterne entre a versão clássica/original (v1) e a nova versão otimizada para consultas subsequentes e áudio ambiente (v2).
Insights IA
Dicionário de Exames (Entrada Rápida)
Cadastre exames novos, seus sinônimos e a faixa de referência (mín/máx) usada para colorir os resultados (verde = normal, vermelho = alterado, laranja = sem faixa definida). Ex.: Ácido Metilmalônico · sinônimos amm, ac metilmalonico · mín 0,07 · máx 0,27 · un. µmol/L.
Ver exames já reconhecidos (referência, com faixas)
Dicionário de Medicamentos (Entrada Rápida)
A lista abaixo já vem com o dicionário base (editável). Altere os sinônimos/marcas de qualquer medicamento, edite nomes ou adicione novos. Ex.: Metformina · sinônimos glifage, glucoformin
Na entrada rápida você também pode clicar em corrigir num medicamento para ensinar uma variação na hora.
Ver dicionário base original (referência)
Documentos — Cabeçalho e Rodapé
Padrão usado em atestados, relatórios e demais documentos. O logo, o responsável técnico e os dados de contato são obrigatórios e aparecem em todos os documentos.
Guia de Referências
Gerencie sua lista de especialistas, laboratórios e informações úteis. Esses contatos ficam disponíveis em um painel rápido dentro do prontuário — basta clicar no botão Referências.
Carregando...
Gerenciar Médicos (Apenas Administrador)
Crie contas para outros profissionais. Cada usuário acessará uma carteira isolada de pacientes no próprio login.
Cadastrar Novo Médico
| Nome | Login de Acesso | Ações |
|---|---|---|
| Carregando... | ||
Gerenciar Usuários
Crie usuários com acesso restrito a locais de atendimento e funcionalidades específicas.
Tokens de Integração
Crie chaves para sistemas externos consultarem ou enviarem dados para o sistema. O token completo aparece apenas uma vez, logo após a criação.
Nova Integração
O último escopo libera raw_text e a transcrição do consultório. Conceda apenas quando o destino precisar do registro bruto para auditoria ou migração.
| Integração | Token | Escopos | Status | Último uso | Ações |
|---|---|---|---|---|---|
| Carregando... | |||||
Documentação da API
Use esta API para integrar laboratórios, sistemas externos, BI ou outras ferramentas. Todas as chamadas precisam do header Authorization: Bearer SEU_TOKEN.
Base URL
/external_api.php/v1
Autenticação
Authorization: Bearer dm2_xxxxxxxxxxxxxxxxx
Prontuário completo
GET /v1/patients/{id}/record
Retorna linhas de cuidado, anotações/consultas, exames, laboratório, medicamentos, condições, pedidos e documentos.
Endpoints disponíveis
| Método | Endpoint | Uso | Escopo |
|---|---|---|---|
| GET | /v1/health | Verificar disponibilidade | token válido |
| GET | /v1/patients?q=nome-ou-cpf | Listar/buscar pacientes por nome, CPF ou CNS | patients:read |
| GET | /v1/patients/{id} | Consultar paciente com resumo de prontuário | patients:read |
| GET | /v1/patients/{id}/record | Consultar linhas, consultas, exames, medicamentos, condições e documentos | patients:read |
| POST | /v1/patients | Criar ou vincular paciente | patients:write |
| PATCH | /v1/patients/{id} | Atualizar paciente | patients:write |
| GET | /v1/patients/{id}/exams | Exames-chave do paciente (tabela histórica) | exams:read |
| POST | /v1/patients/{id}/exams | Enviar exame para paciente | exams:write |
| POST | /v1/exams | Enviar exame localizando por CPF/external_id | exams:write |
| GET | /v1/lab-results | Todos os resultados de exame lançados | exams:read |
| GET | /v1/consultations | Consultas (SOAP, sinais e status) | patients:read |
| GET | /v1/conditions | Condições/diagnósticos com CID-10 | patients:read |
| GET | /v1/medications | Medicamentos em uso e suspensos | patients:read |
| GET | /v1/vitals | Sinais vitais por consulta | patients:read |
| GET | /v1/documents | Documentos emitidos (atestados, receitas…) | patients:read |
| GET | /v1/attachments | Metadados dos anexos | patients:read |
| GET | /v1/attachments/{id}/content | Baixar o arquivo do anexo | patients:read |
| GET | /v1/exam-requests | Pedidos de exame | exams:read |
| GET | /v1/patient-care-lines | Vínculo paciente ↔ linha de cuidado | patients:read |
| GET | /v1/care-lines | Linhas de cuidado cadastradas | patients:read |
| GET | /v1/locations | Locais/unidades | patients:read |
| GET | /v1/reference-contacts | Rede de referência | patients:read |
| GET | /v1/appointments | Agendamentos | patients:read |
Todo recurso ligado a paciente aceita ?patient_id=, ?cpf= e a forma aninhada /v1/patients/{id}/{recurso}. Consultar um registro específico: /v1/consultations/456.
Parâmetros comuns a todas as listagens
| Parâmetro | O que faz | Exemplo |
|---|---|---|
since | Só o que mudou depois do momento informado (ISO 8601 ou timestamp Unix) | since=2026-07-01T00:00:00Z |
after_id | Paginação por cursor — use esta para varredura completa | after_id=1240 |
page / per_page | Paginação por página (teto de 200 por página) | page=2&per_page=100 |
patient_id / cpf | Filtrar por paciente | cpf=52998224725 |
after_id a page numa migração: com paginação por página, um registro criado durante a varredura desloca as páginas seguintes e um registro pode nunca ser lido. O cursor por id não tem esse problema. A resposta traz pagination.next_after_id; repita até vir null.
Exemplo: buscar paciente
curl "BASE_URL/external_api.php/v1/patients?q=Adail%20Nicolau%20Linhares" \
-H "Authorization: Bearer SEU_TOKEN"
O parâmetro q busca por nome. Se tiver números, também busca em CPF e CNS.
Exemplo: consultar prontuário
curl "BASE_URL/external_api.php/v1/patients/123/record?consultations_limit=10&lab_results_limit=30" \
-H "Authorization: Bearer SEU_TOKEN"
Retorna linhas de cuidado, condições, medicamentos, exames-chave, resultados laboratoriais, pedidos, consultas/anotações SOAP, sinais vitais e documentos do paciente.
Chaves retornadas pelo record
record{
"care_lines": [],
"conditions": [],
"medications": [],
"key_exams": [],
"lab_results": [],
"exam_requests": [],
"consultations": [],
"documents": [],
"limits": {}
}
care_lines: id, care_line_id, name, description, color, icon, status, start_date, end_date, risk_level, notes, created_at, updated_at.
conditions: id, patient_id, care_line_id, name, status, started_at, ended_at, notes, created_at, updated_at, care_line_name, care_line_color.
medications: id, patient_id, name, dose, frequency, route, started_at, ended_at, status, last_reviewed_at, notes, created_at, updated_at.
key_exams: id, patient_id, exam_type_id, exam_type_name, exam_date, result_value, notes, created_at.
lab_results: id, patient_id, consultation_id, exam_date, canonical_name, raw_key, value_numeric, value_text, unit, recognized, created_at.
exam_requests: id, patient_id, requested_at, status, note.
consultations: id, patient_id, consultation_date, status, chief_complaint, subjective, objective, assessment, plan, notes, copied_from_consultation_id, created_at, updated_at, finalized_at, vitals, lab_results, documents. O campo raw_text só aparece com o escopo clinical_notes:read.
consultations[].vitals: id, consultation_id, blood_pressure_systolic, blood_pressure_diastolic, weight_kg, height_cm, bmi, capillary_glucose, heart_rate, waist_cm, notes, created_at, updated_at.
documents: id, patient_id, consultation_id, doc_type, title, body, created_at.
limits: key_exams, lab_results, consultations, documents.
Coortes na listagem de pacientes
Campos calculados automaticamente no GET /v1/patients e GET /v1/patients/{id} para montar coortes como sem consulta há 12 meses, HbA1c vencida/acima de 7 e sem exames recentes, sem buscar o /record completo de cada paciente.
Campos calculados no objeto do paciente:
last_consultation_date: data da consulta mais recente registrada em consultations.consultation_date, ou null. Não é agendamento.
consultation_count: total de consultas registradas do paciente.
last_hba1c_value: valor da HbA1c mais recente, ou null.
last_hba1c_date: data do exame referente à última HbA1c, ou null.
last_exam_date: data do exame mais recente do paciente, considerando exames-chave e laboratório.
Filtros aceitos: is_dm=1, last_consultation_before=2025-06-07, months_without_consultation=12, hba1c_min=7, hba1c_max=6, hba1c_before=2026-01-07, last_exam_before=2026-01-07.
Observação: filtros *_before incluem pacientes sem dado correspondente, para facilitar coortes de pendência.
Qualidade de dados futura: preencher lab_results.unit quando possível e validar HbA1c implausível, como 0. Faixa sugerida: 3 a 20.
Exemplo: criar paciente
curl -X POST "BASE_URL/external_api.php/v1/patients" \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 0dd9b3e6-a444-4f47-b6d5-f35d4ecb0a37" \
-d '{
"source": "sistema_externo",
"external_id": "pac-123",
"name": "Maria da Silva",
"cpf": "52998224725",
"birth_date": "1970-01-01",
"phone": "11999999999",
"is_dm": true
}'
Exemplo: enviar exame
curl -X POST "BASE_URL/external_api.php/v1/exams" \
-H "Authorization: Bearer SEU_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8da28349-40a8-4215-b98f-03f674145f3c" \
-d '{
"source": "laboratorio_x",
"external_id": "lab-987",
"patient_cpf": "52998224725",
"exam_type": "hba1c",
"exam_name": "Hemoglobina glicada",
"result_value": "7.2",
"result_unit": "%",
"collected_at": "2026-06-01"
}'
Exemplo: sincronizar só o que mudou
Guarde o horário da última carga e envie em since na próxima. Evita varrer tudo de novo.
curl "BASE_URL/external_api.php/v1/lab-results?since=2026-07-01T00:00:00Z&per_page=200" \
-H "Authorization: Bearer SEU_TOKEN"
As datas saem em ISO 8601 com fuso (2026-07-24T21:05:48+02:00). Guarde o updated_at mais recente que recebeu e use-o como próximo since.
Exemplo: exportar tudo para outro sistema
O sistema acompanha um script pronto: tools/export_all.php. Ele varre todos os recursos com cursor, grava um arquivo NDJSON por recurso (um registro por linha) e gera um manifest.json com as contagens, para você conferir que recebeu tudo. Só depende de PHP com cURL.
php tools/export_all.php \
--base=BASE_URL/external_api.php/v1 \
--token=SEU_TOKEN \
--out=./export
Saída:
locations 7 registro(s)
care-lines 8 registro(s)
patients 383 registro(s)
consultations 489 registro(s)
vitals 441 registro(s)
conditions 612 registro(s)
medications 1154 registro(s)
lab-results 2402 registro(s)
...
Concluido: 6659 registro(s) em 14 recurso(s).
Os recursos saem na ordem em que devem ser importados: locais e pacientes primeiro, porque os demais referenciam patient_id. Se a contagem exportada divergir do total informado pelo servidor, o script avisa e termina com erro — não dá migração por concluída em silêncio.
Para cargas seguintes, some --since=2026-07-01T00:00:00Z e só o que mudou é baixado. O script respeita Retry-After automaticamente se atingir o limite de requisições.
Exemplo: baixar anexos
Os metadados vêm em JSON; o arquivo sai em rota separada, com Content-Type real e nome sugerido. Um anexo digitalizado pode ter várias páginas — page_count informa quantas, e ?page=N escolhe qual.
curl -o exame.jpg \
"BASE_URL/external_api.php/v1/attachments/14/content?page=1" \
-H "Authorization: Bearer SEU_TOKEN"
Baixando todos a partir do attachments.ndjson gerado pela exportação:
while read -r LINHA; do
ID=$(php -r '$d=json_decode(fgets(STDIN),true); echo $d["id"];' <<< "$LINHA")
PAGS=$(php -r '$d=json_decode(fgets(STDIN),true); echo max(1,(int)$d["page_count"]);' <<< "$LINHA")
for P in $(seq 1 "$PAGS"); do
curl -s -o "anexo_${ID}_${P}.bin" \
"BASE_URL/external_api.php/v1/attachments/$ID/content?page=$P" \
-H "Authorization: Bearer SEU_TOKEN"
done
done < export/attachments.ndjson
Relato bruto e transcrição do áudio
Os campos raw_text, typed_raw_text, ambient_raw_text e ambient_transcript guardam o texto bruto digitado pelo médico e a transcrição do áudio ambiente do consultório. São o dado mais sensível do sistema e não saem com patients:read — nem em /v1/consultations, nem em /record.
Quando existem mas não vieram, a resposta declara isso:
{
"id": 481,
"subjective": "Paciente refere melhora da dispneia...",
"clinical_notes_available": true,
"clinical_notes_scope": "clinical_notes:read"
}
O SOAP (subjective, objective, assessment, plan) continua saindo com patients:read — é o registro clínico em si. Para liberar o relato bruto, crie um token com o escopo clinical_notes:read no formulário acima.
Limites, cache e erros
| Código | Significado | O que fazer |
|---|---|---|
200 | Sucesso | — |
304 | Nada mudou (resposta a If-None-Match) | Reaproveite o que já tem |
400 | Parâmetro inválido | Veja error.message |
401 | Token ausente ou inválido | Confira o header Authorization |
403 | Token sem o escopo necessário | Veja error.details.required_scope |
404 | Recurso não encontrado | — |
409 | Idempotency-Key reusada com outro corpo | Gere uma chave nova |
429 | Limite de requisições excedido | Aguarde os segundos de Retry-After |
Padrão de 120 requisições por minuto por token, ajustável por cliente. Toda resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset.
Toda resposta 200 de GET traz ETag. Reenviando em If-None-Match, a API responde 304 sem corpo quando nada mudou:
curl -i "BASE_URL/external_api.php/v1/patients?per_page=50" \
-H "Authorization: Bearer SEU_TOKEN" \
-H 'If-None-Match: "a1b2c3d4..."'
source e external_id em toda escrita e use Idempotency-Key em chamadas POST para evitar duplicidade. Em cargas completas, prefira after_id a page e respeite o Retry-After quando receber 429.
Relatório Analítico
Análise histórica da saúde populacional e adesão aos exames.
Configurar Relatório
Relatório Executivo de Saúde Populacional
Monitoramento de Pacientes Diabéticos (DM2)
1. Cenário e Cobertura Assistencial
2. Controle Glicêmico e Classificação de Risco
3. Evolução Temporal Populacional
4. Trajetória Individual de Curto Prazo
5. Comportamento e Taxa de Adesão
6. Cobertura de Solicitações e Absenteísmo Recorrente
Pacientes com Pedido por Categoria
Pacientes com Múltiplas Solicitações Sem Exame (Absenteísmo Recorrente)
| Paciente | Telefone | Status Atual | Qtd. Pedidos | Última A1C |
|---|