API REST

Endpoints, autenticação, idempotência e padrões de erro.

Convenções

Autenticação

MétodoEndpointDescrição
POST/v1/auth/loginE-mail + senha (+ org_slug opcional).
POST/v1/auth/login-rfidRFID hex + org_slug.
POST/v1/auth/bootstrapCria primeira organização (uma vez por tenant).
GET/v1/auth/accessible-orgsLista orgs que o usuário pode acessar (matriz + filiais).
POST/v1/auth/switch-orgRe-emite JWT para outra org acessível.
GET/v1/mePerfil do usuário corrente + dados da org.

Rotas administrativas

EndpointDescrição
/v1/orgsGET / PATCH da org corrente; GET /stats para indicadores.
/v1/branchesGET / POST / PATCH / DELETE filiais; POST /:id/grant-access.
/v1/usersCRUD de usuários.
/v1/sectors · /v1/locations · /v1/suppliers · /v1/specialties · /v1/packagingCRUDs de cadastros mestres.
/v1/item-models · /v1/itemsCatálogo + inventário.
/v1/kit-templates · /v1/kitsTemplates e instâncias de kit.
/v1/equipmentsAutoclaves, lavadoras, ultrassônicas.
/v1/labelsGET /{kit,item,batch}/:id/zpl, /test-print, POST /render.
/v1/auditConsulta filtrável (ADMIN/SUPERVISOR).
/v1/dashboardKPIs por org.

Rotas operacionais

EndpointDescrição
POST /v1/lifecycle/scanÚnico ponto de entrada para barcode/QR no chão operacional. FSM decide aceitar ou rejeitar.
POST /v1/lifecycle/expurgo/reconcileSubmete conferência cega do expurgo.
/v1/batchesCRUD de lotes de esterilização.
/v1/quarantineLista e release (com re-auth supervisor).
/v1/recallDisparo do botão de pânico e acompanhamento.
/v1/surgeryPoint-of-care (vínculo kit ↔ paciente).
/v1/uploadsUpload de fotos / laudos para R2.

Códigos de erro padrão

HTTPcodeQuando ocorre
400invalid_bodyValidação Zod falhou.
401invalid_credentials / missing_token / unauthorizedAuth falhou ou token inválido.
403forbiddenRBAC insuficiente.
404not_foundRecurso inexistente ou fora da org.
409fsm_violation / slug_taken / cannot_delete_hqRegra de negócio violada.
423account_locked5 tentativas erradas em 15 min.
429rate_limitedExcedeu janela de rate-limit.
500internal_errorErro inesperado; inclui request_id.

Exemplo: troca de organização

POST /v1/auth/switch-org
Authorization: Bearer eyJ...
Content-Type: application/json

{ "target_org_id": "b1a2c3..." }

200 OK
{
  "token": "eyJ...",
  "expires_in": 28800,
  "org": { "id": "b1a2c3...", "slug": "filial-sp", "legal_name": "Filial SP", "org_type": "BRANCH" }
}

Exemplo: lifecycle scan

POST /v1/lifecycle/scan
Authorization: Bearer eyJ...
Idempotency-Key: scan-2026-05-28-001
Content-Type: application/json

{
  "barcode": "KIT-CARDIO-001",
  "target_phase": "PREPARO",
  "context": { "workstation": "BANCADA-3" }
}

200 OK
{
  "ok": true,
  "entity": "KIT_INSTANCE",
  "entity_id": "k1a2b3...",
  "new_status": "PREPARO",
  "event_id": "e9f8..."
}