CDS Hooks
Integre a SauBit ao fluxo de prescrição do EHR via CDS Hooks: ao prescrever, o EHR chama o serviço e exibe cards de alerta (interações, contraindicações, alertas clínicos) no ponto de decisão.
Descoberta (discovery)
GET /api/v1/cds-services (sem autenticação, conforme a especificação). Retorna os
serviços disponíveis:
{
"services": [
{
"hook": "medication-prescribe",
"title": "SauBit — análise de segurança da prescrição",
"description": "Verifica interações, contraindicações e alertas clínicos da prescrição.",
"id": "saubit-medication-safety"
},
{
"hook": "order-select",
"title": "SauBit — análise de segurança ao selecionar o pedido",
"id": "saubit-order-select"
}
]
}
Configure no EHR a base URL
https://api.saubit.com.br/api/v1.
Invocação
POST /api/v1/cds-services/{service_id} (autenticação por API key, escopo
interactions:check).
O corpo é um request CDS Hooks. Os medicamentos vêm de context.medications (um Bundle
FHIR de MedicationRequest) ou context.draftOrders; condições, alergias, observações e o
Patient chegam pelo prefetch.
curl -X POST https://api.saubit.com.br/api/v1/cds-services/saubit-medication-safety \
-H "X-API-Key: sm_live_..." \
-H "Content-Type: application/json" \
-d '{
"hookInstance": "d1577c69-...",
"hook": "medication-prescribe",
"context": {
"patientId": "Patient/123",
"medications": {
"resourceType": "Bundle",
"entry": [
{ "resource": { "resourceType": "MedicationRequest", "status": "active",
"medicationCodeableConcept": { "text": "Ibuprofeno" } } },
{ "resource": { "resourceType": "MedicationRequest", "status": "active",
"medicationCodeableConcept": { "text": "Naproxeno" } } }
]
}
},
"prefetch": {
"conditions": { "resourceType": "Bundle", "entry": [
{ "resource": { "resourceType": "Condition", "code": { "text": "Insuficiência renal" } } }
] }
}
}'
Resposta (cards)
{
"cards": [
{
"summary": "Interação GRAVE: Ibuprofeno + Naproxeno",
"indicator": "critical",
"detail": "Revisar a necessidade de dois AINEs; risco de efeitos aditivos.",
"source": { "label": "SauBit", "url": "https://saubit.com.br" }
}
]
}
Mapeamento de gravidade → indicator: CONTRAINDICADO/GRAVE → critical, MODERADO →
warning, LEVE → info. Quando não há achados, retorna um único card info
tranquilizador. Sem medicamento analisável no contexto, retorna {"cards": []} (resposta
válida do CDS Hooks).
Cada card traz um uuid (analysis_id|alert_id) para o feedback referenciar o alerta.
Feedback (fechando o ciclo)
POST /api/v1/cds-services/{service_id}/feedback (API key) — registre se o profissional
aceitou ou sobrepôs o alerta. Alimenta a métrica "alertas que mudaram a conduta". O
papel do ator vem da identidade (papel vinculado à API key), não de um header.
{
"feedback": [
{
"card": "a1b2c3|drug_disease-1a2b3c4d5e",
"outcome": "overridden",
"overrideReasons": [ { "reason": { "code": "benefit", "display": "Benefício supera o risco" } } ]
}
]
}
outcome: accepted (→ acknowledged) ou overridden. Resposta: { "recorded": n }.
A análise é a mesma do
/interactions/checke da integração FHIR — mesmas regras clínicas e política fail-safe.