⚙️ Referência — Operação

Rotas do dia a dia e da migração de histórico: agenda, orçamento, atendimento/prontuário, faturamento, financeiro, estoque e NFS-e.

ℹ️ Como ler esta referência

Esta página cobre 7 grupo(s), 86 caminhos e 94 operações (método + caminho) do Swagger oficial. Todas as rotas usam a base https://api.rabisistemas.com.br/api/v1/integrations (produção) ou https://api.hmg.rabisistemas.dev/api/v1/integrations (homologação) e o header Authorization: Bearer rbk_SEU_TOKEN. Toda rota pode responder também 401 (chave ausente/inválida/revogada/expirada), 403 (sem a permissão) e 503 (não foi possível validar a chave) — veja códigos de resposta.

Campos marcados ✅ são obrigatórios. Valores monetários são sempre em reais (não centavos), salvo onde a rota avisa o contrário.

Sumário

GrupoOperaçõesRotas
Agendamentos8GET /agendamentos/datas/disponiveis · POST /agendamentos/horarios/disponiveis · GET /agendamentos/locais/disponiveis · GET /agendamentos/motivo-cancelamento · GET /agendamentos · POST /agendamentos · GET /agendamentos/{id} · PATCH /agendamentos/{id}/cancelar
Orçamentos10GET /orcamentos · POST /orcamentos · GET /orcamentos/status · GET /orcamentos/consideracoes · PUT /orcamentos/{id} · PUT /orcamentos/status/{idOrcamento}/{idStatus} · GET /orcamentos/{id}/{isAgendamento} · GET /orcamentos/anexo/listar/{orcamentoId} · GET /orcamentos/anexo/listar-necessarios/{pacienteId} · POST /orcamentos/anexo/vincular/{anexoId}/{orcamentoId}
Atendimentos6POST /atendimentos · PUT /atendimentos/{id} · GET /atendimentos/{id} · POST /atendimentos/prontuario · POST /atendimentos/novo-prontuario · GET /atendimentos/historico
Faturamento24GET /faturamento/guias · GET /faturamento/guias/buscar-por-numero-guia · GET /faturamento/guias/pacientes · GET /faturamento/guias/info-extras/{guiaMae}/{guiaFilha} · GET /faturamento/guias/valores-atualizados/{guiaMae}/{guiaFilha} · GET /faturamento/guias/conversoes-convenio/{guiaMae}/{guiaFilha}/{convenioId} · GET /faturamento/guias/{guiaMae}/filhas · GET /faturamento/guias/servico/{guiaFilha} · GET /faturamento/guias/valores-atendimento/{atendimentoId} · PUT /faturamento/guias/{servicoAtendimentoId} · PUT /faturamento/guias/{guiaMae}/confirmar · GET /faturamento/divergencias · POST /faturamento/divergencias/{numeroGuiaMae}/faturar-diferenca · GET /faturamento/recebimento · GET /faturamento/recebimento/opcoes · POST /faturamento/recebimento/registrar · POST /faturamento/recebimento/devolver · GET /faturamento/glosas · GET /faturamento/glosas/guia/{guiaMae} · GET /faturamento/glosas/status · GET /faturamento/glosas/motivos · PUT /faturamento/glosas/produto · PUT /faturamento/glosas/taxa · PUT /faturamento/glosas/servico
Financeiro6POST /financeiro/pagamentos/confirmacao · GET /financeiro/movimentacoes · POST /financeiro/movimentacoes · POST /financeiro/movimentacoes/bulk · GET /financeiro/movimentacoes/{id} · PUT /financeiro/movimentacoes/{id}
Estoque12GET /estoque · GET /estoque/saldo-produtos · GET /estoque/{id} · GET /estoque/historico/{id} · GET /estoque/ultima-compra/{id} · GET /estoque/movimentacao/{id} · GET /estoque/buscar/{lote}/{produtoId}/{localizacaoId} · GET /estoque/lotes-produtos/{idProduto}/{idLocalizacao} · POST /estoque/entrada · POST /estoque/saida · POST /estoque/transferencia · POST /estoque/previsao
NFS-e28GET /nfse/emitentes · GET /nfse/emitentes/{id} · GET /nfse/perfis-fiscais · GET /nfse/perfis-fiscais/{id} · GET /nfse/tomadores · POST /nfse/tomadores · POST /nfse/tomadores/bulk · GET /nfse/tomadores/{id} · PUT /nfse/tomadores/{id} · POST /nfse/tomadores/{id}/completar · POST /nfse/tomadores/sincronizar-paciente/{pacienteId} · GET /nfse/notas · POST /nfse/notas · GET /nfse/notas/{id} · POST /nfse/notas/{id}/emitir · POST /nfse/notas/{id}/consultar-protocolo · POST /nfse/notas/{id}/emitir-contingencia · POST /nfse/notas/{id}/transmitir-contingencia · PUT /nfse/notas/{id}/tomador · POST /nfse/notas/{id}/desistir · POST /nfse/notas/{id}/cancelar · POST /nfse/notas/{id}/substituir · POST /nfse/notas/{id}/analise-fiscal · GET /nfse/notas/{id}/xml · GET /nfse/notas/{id}/links · GET /nfse/notas/{id}/danfse.html · GET /nfse/notas/{id}/danfse.pdf · GET /nfse/notas/{id}/tentativas

Agendamentos 8 operações

Núcleo de agenda: buscar horário, criar, cancelar, listar.

POST /agendamentos não aceita pagamento no ato e consome o limite mensal do plano (agendamentos.mes).

GET /agendamentos/datas/disponiveis

Datas disponíveis para agendamento · Permissão: agendamento:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
dataSelecionadaquerynãostring (date)
horarioInicioquerynãostring
localIdquerynãointeger
responsavelIdquerynãointegerID do colaborador ou equipamento
tipoResponsavelquerynãostringvalores: COLABORADOR, EQUIPAMENTO

Respostas

POST /agendamentos/horarios/disponiveis

Horários disponíveis numa data · Permissão: agendamento:read

Corpo (application/json) — obrigatório

Campos obrigatórios: tipo, data, localId, agendamentoId

CampoTipoObrig.Descrição / restrições
tipostring✅valores: COLABORADOR, EQUIPAMENTO
datastring (date)✅
localIdinteger✅
agendamentoIdinteger✅Obrigatório mesmo pra buscar horários de um agendamento novo — usado internamente pra saber qual horário já é "do próprio" ao editar.
colaboradorIdinteger
isEncaixebooleanfalse (padrão): só retorna slots com status "Disponível" e não bloqueados, ou o slot que já é do próprio agendamentoId. true: retorna todos os slots da grade, sem esse filtro. — padrão False

Respostas

GET /agendamentos/locais/disponiveis

Locais disponíveis para agendamento · Permissão: agendamento:read

Respostas

GET /agendamentos/motivo-cancelamento

Listar motivos de cancelamento · Permissão: agendamento:read

Necessário para escolher motivoCancelamentoId ao cancelar. Bug conhecido: em erro de banco, o use case não lança — devolve o número 401 como "resultado", e a rota responde 200 com corpo 401 (número cru) em vez de um erro HTTP de verdade. Reportado ao time.

Respostas

GET /agendamentos

Listar agendamentos · Permissão: agendamento:read

data é obrigatório — a consulta interna sempre filtra por um dia (não dá pra listar vários dias de uma vez nesta rota).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
dataquery✅ simstring (date)
profissionalIdquerynãointeger
pacienteIdquerynãointeger
statusIdquerynãointeger
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 50; mín. 1; máx. 200

Respostas

POST /agendamentos

Criar agendamento · Permissão: agendamento:create

Sem pagamento no ato — o campo movimentacaoFinanceira não é suportado por esta API (dispara emissão automática de NFS-e). Consome o limite mensal do plano (agendamentos.mes).

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, paciente, paciente.id, idGrade, data, statusId, procedimentos, procedimentos[].procedimentoId, procedimentos[].convenioId

Todos os campos do corpo (23)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado.
pacienteobject✅
paciente.idstring✅
localobject
local.idinteger
idGradeinteger✅ID da grade de colaborador/equipamento
tipoAtendimentostringvalores: COLABORADOR, EQUIPAMENTO
datastring (date)✅
horastring
horaFimstringaceita null
statusIdinteger✅1=Confirmado, 3=Aguardando, 11=Pendente Autorização, etc.
procedimentosarray<object>✅mín. itens 1
procedimentos[].procedimentoIdinteger✅ID do serviço
procedimentos[].convenioIdinteger✅
procedimentos[].planoIdintegeraceita null
procedimentos[].colaboradorIdintegeraceita null
procedimentos[].horarioIniciostringaceita null
procedimentos[].horarioFimstringaceita null
contatosarray<object>
contatos[].emailstring
contatos[].celularstring
repetirbooleanpadrão False
encaixebooleanpadrão False

Respostas

GET /agendamentos/{id}

Consultar agendamento · Permissão: agendamento:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do agendamento — mín. 1

Respostas

PATCH /agendamentos/{id}/cancelar

Cancelar agendamento · Permissão: agendamento:delete

Libera reservas de medicamento vinculadas e notifica a fila de espera, se houver.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do agendamento — mín. 1

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, motivoCancelamentoId

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
motivoCancelamentoIdinteger✅
descricaostringaceita null

Respostas

Orçamentos 10 operações

Estimativa de custo pré-atendimento.

GET /orcamentos

Listar orçamentos · Permissão: orcamento:read

O shape do item muda por completo conforme pacienteId é informado ou não na query — são dois formatos de resposta atrás do mesmo endpoint, não só um filtro a mais.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pacienteIdquerynãointegerQuando informado, ignora page/pageSize/demais filtros e muda o shape do item (ver descrição).
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 10; mín. 1; máx. 200
idquerynãointeger
statusIdquerynãointegerstatusId=8 (Vencido) é ignorado no filtro — não dá pra filtrar server-side por vencidos.
pacienteNomequerynãostring
pacienteCpfquerynãostring
createdAtDequerynãostring (date)
createdAtAtequerynãostring (date)

Respostas

POST /orcamentos

Criar orçamento · Permissão: orcamento:create

Pagamento no ato (movimentacaoFinanceira) é permitido e pode disparar emissão automática de NFS-e. Bloqueado (422) se o farol de rentabilidade exigir aprovação e não houver token/pendência informada.

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, paciente, paciente.id, idGrade, gradeBaseId, responsavelBaseId, tipoAtendimentoConsulta, tipoRepeticao, data, hora, statusId, procedimentos, procedimentos[].procedimentoId, procedimentos[].convenioId, contatos

Se enviar movimentacaoFinanceira.registroFinanceiro, exige: movimentacaoFinanceira.registroFinanceiro[].quantidade, movimentacaoFinanceira.registroFinanceiro[].valorUnitario, movimentacaoFinanceira.registroFinanceiro[].contendo, movimentacaoFinanceira.registroFinanceiro[].centroDeCustoId, movimentacaoFinanceira.registroFinanceiro[].tipoConta, movimentacaoFinanceira.registroFinanceiro[].tipoConjunto

Se enviar movimentacaoFinanceira.duplicatas, exige: movimentacaoFinanceira.duplicatas[].vencimento, movimentacaoFinanceira.duplicatas[].valor, movimentacaoFinanceira.duplicatas[].aVista

Todos os campos do corpo (55)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado.
pacienteobject✅
paciente.idstring✅
localobject
local.idinteger
idGradeinteger✅
gradeBaseIdinteger✅
responsavelBaseIdinteger✅
tipoAtendimentoConsultainteger✅
tipoRepeticaointeger✅
tipoAtendimentostringvalores: COLABORADOR, EQUIPAMENTO
datastring (date)✅
horastring✅
horaFimstringaceita null
statusIdinteger✅
encaixebooleanpadrão False
documentosSelecionadosarray<object>
procedimentosarray<object>✅mín. itens 1
procedimentos[].procedimentoIdinteger✅ID do serviço
procedimentos[].convenioIdinteger✅
procedimentos[].planoIdintegeraceita null
procedimentos[].colaboradorIdintegeraceita null
procedimentos[].horarioIniciostringaceita null
procedimentos[].horarioFimstringaceita null
contatosarray<object>✅
contatos[].emailstring
contatos[].celularstring
enderecoobjectaceita null
repetirbooleanpadrão False
movimentacaoFinanceiraobjectSinal/entrada pago no ato. Presente, dispara emissão automática de NFS-e — permitido de propósito nesta API. — aceita null
movimentacaoFinanceira.registroFinanceiroarray<object>
movimentacaoFinanceira.registroFinanceiro[].quantidadeinteger✅
movimentacaoFinanceira.registroFinanceiro[].valorUnitarionumber✅
movimentacaoFinanceira.registroFinanceiro[].contendointeger✅
movimentacaoFinanceira.registroFinanceiro[].centroDeCustoIdinteger✅
movimentacaoFinanceira.registroFinanceiro[].tipoContastring✅
movimentacaoFinanceira.registroFinanceiro[].tipoConjuntostring✅
movimentacaoFinanceira.registroFinanceiro[].descricaostringaceita null
movimentacaoFinanceira.registroFinanceiro[].produtoIdintegeraceita null
movimentacaoFinanceira.registroFinanceiro[].fornecedorIdintegeraceita null
movimentacaoFinanceira.registroFinanceiro[].contasCaixasIdintegeraceita null
movimentacaoFinanceira.duplicatasarray<object>
movimentacaoFinanceira.duplicatas[].vencimentostring (date)✅
movimentacaoFinanceira.duplicatas[].observacaostringaceita null
movimentacaoFinanceira.duplicatas[].valornumber✅
movimentacaoFinanceira.duplicatas[].aVistaboolean✅
movimentacaoFinanceira.duplicatas[].valorPagonumberaceita null
movimentacaoFinanceira.duplicatas[].pagobooleanpadrão False
movimentacaoFinanceira.duplicatas[].dataPagamentostring (date)aceita null
movimentacaoFinanceira.duplicatas[].tipoDePagamentoIdintegeraceita null
movimentacaoFinanceira.duplicatas[].contaCaixaIdintegeraceita null
movimentacaoFinanceira.categoriaDePagamentoIdinteger
movimentacaoFinanceira.centroDeCustoIdinteger
aprovacaoFarolTokenstringNecessário se o farol de rentabilidade estiver amarelo/vermelho e os parâmetros exigirem aprovação. — aceita null
aprovacaoFarolPendenteIdintegeraceita null

Respostas

GET /orcamentos/status

Listar status possíveis de orçamento · Permissão: orcamento:read

findMany() sem filtro nem ordenação — vem tudo, inclusive status com ativo:false, em ordem não garantida. Inclui os status automáticos (campo automatico: true: 8 Vencido, 10 Pago, 11 Agendado, 12 Concluído, 13 Renegociado), que só o sistema grava.

Respostas

GET /orcamentos/consideracoes

Listar considerações padrão de orçamento · Permissão: orcamento:read

Não é lista — é uma STRING crua (o texto configurado em ParametrosOrcamento.consideracoesGerais). Se nunca configurado, devolve string vazia "" (não null, não 404).

Respostas

PUT /orcamentos/{id}

Atualizar orçamento · Permissão: orcamento:update

Orçamento já aprovado não pode ter procedimentos/valores editados (precisa criar um novo) — exceção: registrar pagamento continua funcionando.

Atualização parcial: campo omitido mantém o valor atual; null limpa; lista omitida mantém; lista enviada substitui ([] apaga).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do orçamento — mín. 1

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, paciente, paciente.id, idGrade, gradeBaseId, responsavelBaseId, tipoAtendimentoConsulta, tipoRepeticao, data, hora, statusId, procedimentos, procedimentos[].procedimentoId, procedimentos[].convenioId, contatos

Se enviar movimentacaoFinanceira.registroFinanceiro, exige: movimentacaoFinanceira.registroFinanceiro[].quantidade, movimentacaoFinanceira.registroFinanceiro[].valorUnitario, movimentacaoFinanceira.registroFinanceiro[].contendo, movimentacaoFinanceira.registroFinanceiro[].centroDeCustoId, movimentacaoFinanceira.registroFinanceiro[].tipoConta, movimentacaoFinanceira.registroFinanceiro[].tipoConjunto

Se enviar movimentacaoFinanceira.duplicatas, exige: movimentacaoFinanceira.duplicatas[].vencimento, movimentacaoFinanceira.duplicatas[].valor, movimentacaoFinanceira.duplicatas[].aVista

Todos os campos do corpo (55)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado.
pacienteobject✅
paciente.idstring✅
localobject
local.idinteger
idGradeinteger✅
gradeBaseIdinteger✅
responsavelBaseIdinteger✅
tipoAtendimentoConsultainteger✅
tipoRepeticaointeger✅
tipoAtendimentostringvalores: COLABORADOR, EQUIPAMENTO
datastring (date)✅
horastring✅
horaFimstringaceita null
statusIdinteger✅
encaixebooleanpadrão False
documentosSelecionadosarray<object>
procedimentosarray<object>✅mín. itens 1
procedimentos[].procedimentoIdinteger✅ID do serviço
procedimentos[].convenioIdinteger✅
procedimentos[].planoIdintegeraceita null
procedimentos[].colaboradorIdintegeraceita null
procedimentos[].horarioIniciostringaceita null
procedimentos[].horarioFimstringaceita null
contatosarray<object>✅
contatos[].emailstring
contatos[].celularstring
enderecoobjectaceita null
repetirbooleanpadrão False
movimentacaoFinanceiraobjectSinal/entrada pago no ato. Presente, dispara emissão automática de NFS-e — permitido de propósito nesta API. — aceita null
movimentacaoFinanceira.registroFinanceiroarray<object>
movimentacaoFinanceira.registroFinanceiro[].quantidadeinteger✅
movimentacaoFinanceira.registroFinanceiro[].valorUnitarionumber✅
movimentacaoFinanceira.registroFinanceiro[].contendointeger✅
movimentacaoFinanceira.registroFinanceiro[].centroDeCustoIdinteger✅
movimentacaoFinanceira.registroFinanceiro[].tipoContastring✅
movimentacaoFinanceira.registroFinanceiro[].tipoConjuntostring✅
movimentacaoFinanceira.registroFinanceiro[].descricaostringaceita null
movimentacaoFinanceira.registroFinanceiro[].produtoIdintegeraceita null
movimentacaoFinanceira.registroFinanceiro[].fornecedorIdintegeraceita null
movimentacaoFinanceira.registroFinanceiro[].contasCaixasIdintegeraceita null
movimentacaoFinanceira.duplicatasarray<object>
movimentacaoFinanceira.duplicatas[].vencimentostring (date)✅
movimentacaoFinanceira.duplicatas[].observacaostringaceita null
movimentacaoFinanceira.duplicatas[].valornumber✅
movimentacaoFinanceira.duplicatas[].aVistaboolean✅
movimentacaoFinanceira.duplicatas[].valorPagonumberaceita null
movimentacaoFinanceira.duplicatas[].pagobooleanpadrão False
movimentacaoFinanceira.duplicatas[].dataPagamentostring (date)aceita null
movimentacaoFinanceira.duplicatas[].tipoDePagamentoIdintegeraceita null
movimentacaoFinanceira.duplicatas[].contaCaixaIdintegeraceita null
movimentacaoFinanceira.categoriaDePagamentoIdinteger
movimentacaoFinanceira.centroDeCustoIdinteger
aprovacaoFarolTokenstringNecessário se o farol de rentabilidade estiver amarelo/vermelho e os parâmetros exigirem aprovação. — aceita null
aprovacaoFarolPendenteIdintegeraceita null

Respostas

PUT /orcamentos/status/{idOrcamento}/{idStatus}

Alterar status do orçamento · Permissão: orcamento:update

Ao aprovar, promove agendamentos vinculados que estavam pendentes de orçamento e sincroniza o financeiro. Status automáticos (8 Vencido, 10 Pago, 11 Agendado, 12 Concluído, 13 Renegociado) são definidos pelo sistema e recusados aqui (422). Com o status automático ativo na clínica: só trocas permitidas (ex.: Vencido só vai para Cancelado); cancelar exige motivo no corpo e, havendo agendamento futuro ou pagamento, responde 409 ORCAMENTO_CANCELAR_CONFIRMAR até reenviar com confirmarCancelamento: true; reabrir Cancelado/Concluído exige autorizacao: { colaboradorId, senha } de nível 3 (403).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idOrcamentocaminho✅ siminteger
idStatuscaminho✅ siminteger

Respostas

GET /orcamentos/{id}/{isAgendamento}

Consultar orçamento · Permissão: orcamento:read

isAgendamento indica se o id é de orçamento ou de agendamento vinculado (1 ou 0).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do orçamento — mín. 1
isAgendamentocaminho✅ simstringvalores: 0, 1

Respostas

GET /orcamentos/anexo/listar/{orcamentoId}

Listar anexos do orçamento · Permissão: orcamento:read

Sem URL assinada (só link cru — chave do storage). Se precisar da URL pra baixar, use GET /orcamentos/anexo/listar-necessarios/{pacienteId}.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
orcamentoIdcaminho✅ siminteger

Respostas

GET /orcamentos/anexo/listar-necessarios/{pacienteId}

Listar documentos necessários para o paciente · Permissão: orcamento:read

Agrupado por tipo de anexo. Anexos do paciente sem tipoAnexoId são excluídos silenciosamente do resultado inteiro.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pacienteIdcaminho✅ siminteger
orcamentoIdquerynãointegerSe informado, marca quais anexos já estão vinculados a ESTE orçamento (anexado). Sem isso, todos vêm anexado:false.

Respostas

POST /orcamentos/anexo/vincular/{anexoId}/{orcamentoId}

Vincular/desvincular anexo do orçamento (toggle) · Permissão: orcamento:update

Não é idempotente — é um toggle. Se o vínculo não existe, cria; se já existe, remove. Chamar duas vezes seguidas vincula e depois desvincula. Não é seguro re-tentar cegamente em caso de timeout/retry automático, já que a resposta vazia não informa qual dos dois estados resultou.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
anexoIdcaminho✅ siminteger
orcamentoIdcaminho✅ siminteger

Respostas

Atendimentos 6 operações

Atendimento e prontuário — voltado a migração de histórico.

Módulo voltado a migração de histórico, não à operação clínica ao vivo. GET /atendimentos/historico exige pacienteId.

POST /atendimentos

Criar atendimento · Permissão: atendimento:create

Voltado a migração de histórico — cria por trás um Agendamento sintético e um prontuário vazio. horarioInicioAtendimento sempre grava "agora"; use PUT /{id} com horarioInicio para corrigir com a data real.

Corpo (application/json) — obrigatório

Campos obrigatórios: pacienteId, colaboradorId, empresaId, servicoId, convenioId

CampoTipoObrig.Descrição / restrições
pacienteIdinteger✅
colaboradorIdinteger✅
empresaIdinteger✅
servicoIdinteger✅
convenioIdinteger✅
dataAtendimentostring (date-time)Usada só no Agendamento sintético criado por trás. O Atendimento em si sempre grava a data/hora de agora — use PUT /{id} com horarioInicio para corrigir com a data real (migração). — aceita null

Respostas

PUT /atendimentos/{id}

Atualizar atendimento · Permissão: atendimento:update

Principal uso: corrigir horarioInicio com a data real de um atendimento migrado.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do atendimento — mín. 1

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado.
pacienteIdintegeraceita null
empresaIdintegeraceita null
tempoDoAtendimentointegerEm minutos — aceita null
horarioIniciostring (date-time)Corrige a data/hora real do atendimento — usado em migração. — aceita null
DocumentosAtendimentosarray<object>Conteúdo de DocumentoAtendimento (documento administrativo, diferente do prontuário).
versionintegerTrava otimista — envie a versão atual do registro. — aceita null

Respostas

GET /atendimentos/{id}

Consultar atendimento · Permissão: atendimento:read

Todos os segmentos são opcionais: /atendimentos/{id}, /atendimentos/{id}/{pacienteId} ou filtre só por paciente/agendamento. Se id não existir, devolve 200 com corpo [] (array vazio), não 404.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminhonãointegerID do atendimento — mín. 1

Respostas

POST /atendimentos/prontuario

Editar prontuário · Permissão: atendimento:update

Sobrescreve o texto no lugar — não guarda a versão anterior.

Corpo (application/json) — obrigatório

Campos obrigatórios: prontuarioId, conteudo

CampoTipoObrig.Descrição / restrições
prontuarioIdinteger✅
conteudostring✅Texto clínico livre. Sobrescreve o valor atual, sem guardar a versão anterior.

Respostas

POST /atendimentos/novo-prontuario

Criar um novo prontuário no atendimento · Permissão: atendimento:create

Cria uma linha nova (o atendimento pode ter mais de um prontuário) — não edita o existente.

Corpo (application/json) — obrigatório

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
AgendamentoIdintegerInforme este ou atendimentoId — aceita null
atendimentoIdintegeraceita null

Respostas

GET /atendimentos/historico

Histórico do paciente (linha do tempo) · Permissão: atendimento:read

Leitura ao vivo — reflete qualquer edição de prontuário na hora. pacienteId é obrigatório nesta API (a rota interna aceita omitir, mas sem filtro ela varre o histórico inteiro do tenant e pode travar/estourar tempo). Sem paginação real — sempre devolve o histórico completo que casar com os filtros, um item por atendimento encontrado.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pacienteIdquery✅ siminteger
medicoquerynãointegerID do colaborador
servicoquerynãointeger
dataAtendimentoquerynãostring (date)Filtra por createdAt do atendimento, não pela data do agendamento vinculado

Respostas

Faturamento 24 operações

Pré-faturamento (guia de convênio/TISS), divergência, recebimento e glosa.

GET /faturamento/guias

Listar todas as guias em pré-faturamento · Permissão: faturamento:read

Respostas

GET /faturamento/guias/buscar-por-numero-guia

Buscar guia pelo número · Permissão: faturamento:read

O parâmetro de query é numero, não numeroGuia — e é obrigatório.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
numeroquery✅ simstring

Respostas

GET /faturamento/guias/pacientes

Listar pacientes com pré-faturamento pendente · Permissão: faturamento:read

Limitado a 50 por padrão.

Respostas

GET /faturamento/guias/info-extras/{guiaMae}/{guiaFilha}

Informações extras da guia · Permissão: faturamento:read

Payload grande — dados cadastrais completos de paciente/convênio, autorização, e a composição de serviço/produtos/taxas (originais e convertidos pelo convênio). Valores monetários aqui já em reais.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring
guiaFilhacaminho✅ simstring

Respostas

GET /faturamento/guias/valores-atualizados/{guiaMae}/{guiaFilha}

Valores atualizados da guia · Permissão: faturamento:read

valorTotal é só o valor resolvido do serviço, apesar do nome — não é a soma de produtos+taxas.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring
guiaFilhacaminho✅ simstring

Respostas

GET /faturamento/guias/conversoes-convenio/{guiaMae}/{guiaFilha}/{convenioId}

Conversões de convênio disponíveis para a guia · Permissão: faturamento:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring
guiaFilhacaminho✅ simstring
convenioIdcaminho✅ siminteger

Respostas

GET /faturamento/guias/{guiaMae}/filhas

Listar guias filhas de uma guia mãe · Permissão: faturamento:read

A guia mãe (guiaFilha === guiaMae) vem primeiro na lista.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring

Respostas

GET /faturamento/guias/servico/{guiaFilha}

Serviço vinculado a uma guia filha · Permissão: faturamento:read

Payload grande: devolve as linhas cruas de ServicoAtendimento (toda coluna do modelo) com relações completas de colaborador, conversão de convênio, produtos/taxas/equipamentos usados — não um resumo. Valores (valorServico, valorServicoConvertido) vêm em centavos, sem conversão.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaFilhacaminho✅ simstring

Respostas

GET /faturamento/guias/valores-atendimento/{atendimentoId}

Valores faturados de um atendimento · Permissão: faturamento:read

Um item por serviço prestado no atendimento.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
atendimentoIdcaminho✅ siminteger

Respostas

PUT /faturamento/guias/{servicoAtendimentoId}

Editar a guia por completo · Permissão: faturamento:update

Edição da guia: número da guia, conversão de convênio/colaborador, valores de produto/taxa/serviço. Não sensibiliza estoque (já foi baixado no consumo real do atendimento).

Atualização parcial: campo omitido mantém o valor atual; null limpa; lista omitida mantém; lista enviada substitui ([] apaga).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
servicoAtendimentoIdcaminho✅ siminteger

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, preFaturamento

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
preFaturamentoobject✅Campos da guia a atualizar

Respostas

PUT /faturamento/guias/{guiaMae}/confirmar

Confirmar pré-faturamento da guia · Permissão: faturamento:update

Valida campos TISS obrigatórios (ex.: número da guia da operadora) e marca a guia como pré-faturada.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring

Respostas

GET /faturamento/divergencias

Listar divergências atendido x faturado · Permissão: faturamento:read

Cache Redis de 60s (quando disponível) — dado pode estar até 60s desatualizado.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 20; mín. 1; máx. 200

Respostas

POST /faturamento/divergencias/{numeroGuiaMae}/faturar-diferenca

Faturar a diferença de uma divergência · Permissão: faturamento:update

Para itens sub-faturados, inclui a diferença num lote. Bloqueado (409) se houver item sobre-faturado — esse caso exige correção manual.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
numeroGuiaMaecaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅

Respostas

GET /faturamento/recebimento

Listar recebimento físico de guias · Permissão: faturamento:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pagequerynãointeger
pageSizequerynãointeger
numeroGuiaquerynãostring

Respostas

GET /faturamento/recebimento/opcoes

Opções de filtro do recebimento de guia · Permissão: faturamento:read

Respostas

POST /faturamento/recebimento/registrar

Registrar recebimento físico de guias · Permissão: faturamento:create

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, guias

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
guiasarray<object>✅
guias[].codigoLidostring
guias[].servicoAtendimentoIdintegeraceita null

Respostas

POST /faturamento/recebimento/devolver

Registrar devolução de guias · Permissão: faturamento:update

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, guias

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
guiasarray<object>✅
guias[].codigoLidostring
guias[].servicoAtendimentoIdintegeraceita null

Respostas

GET /faturamento/glosas

Listar itens em conta a receber (elegíveis a glosa) · Permissão: faturamento:read

Respostas

GET /faturamento/glosas/guia/{guiaMae}

Listar serviços/produtos/taxas de uma guia mãe · Permissão: faturamento:read

Não é uma lista apesar do nome — é um único objeto agregado com três arrays internos. valor/valorPagoGlosa aqui vêm como string, em centavos brutos (diferente de valorTotal de /glosas, que é string em reais).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
guiaMaecaminho✅ simstring

Respostas

GET /faturamento/glosas/status

Listar status de glosa possíveis · Permissão: faturamento:read

id não é numérico — é o próprio valor do enum como texto (ex.: "GLOSADO").

Respostas

GET /faturamento/glosas/motivos

Listar motivos de glosa · Permissão: faturamento:read

Respostas

PUT /faturamento/glosas/produto

Registrar glosa de produto · Permissão: faturamento:update

Só grava o resultado da glosa no item (não gera lançamento financeiro). Nomes de campo reais do body (confirmados no código, diferentes do que o nome sugere): ProdutoAtendimentoId — apesar do nome, é o id de produtoConvercao (a linha de conversão pelo convênio), não o id de ProdutoAtendimento. valorPagoGlosa precisa ser enviado em centavos (padrão diferente de outras rotas de faturamento, que usam reais). Erro de motivoGlosado (id) não encontrado em term_mensagens devolve 401, não 400/422 — comportamento observado, não é sobre autenticação.

Corpo (application/json) — obrigatório

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
ProdutoAtendimentoIdintegerId de produtoConvercao, apesar do nome
motivoGlosadointegerId em term_mensagens
statusGlosadostring
valorPagoGlosaintegerCentavos, não reais

Respostas

PUT /faturamento/glosas/taxa

Registrar glosa de taxa · Permissão: faturamento:update

Mesmas ressalvas de PUT /faturamento/glosas/produto (id é de taxaConvercao, valorPagoGlosa em centavos, erro de motivo devolve 401).

Corpo (application/json) — obrigatório

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
TaxaDocumentoIdintegerId de taxaConvercao, apesar do nome
motivoGlosadointeger
statusGlosadostring
valorPagoGlosaintegerCentavos, não reais

Respostas

PUT /faturamento/glosas/servico

Registrar glosa de serviço · Permissão: faturamento:update

Mesmas ressalvas de PUT /faturamento/glosas/produto (id é de servicoConversao, valorPagoGlosa em centavos, erro de motivo devolve 401).

Corpo (application/json) — obrigatório

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
ServicoAtendimentoIdintegerId de servicoConversao, apesar do nome
motivoGlosadointeger
statusGlosadostring
valorPagoGlosaintegerCentavos, não reais

Respostas

Financeiro 6 operações

Movimentações financeiras.

POST /financeiro/pagamentos/confirmacao

Confirma pagamento (Pix ou link) e dá baixa automática na parcela · Permissão: financeiro:update

Para o provedor de pagamento (#409) avisar que a cobrança foi paga. Identifique a parcela por duplicataId ou por identificadorCobranca (o txid/id da cobrança gravado no campo transacao da parcela). A parcela fica paga com identificadorPagamento (endToEndId do Pix ou id da transação do link), o que já a comprova. Idempotente: repetir a mesma confirmação devolve jaConfirmado: true (200) sem pagar de novo. Valor menor que o da parcela → 409.

Corpo (application/json) — obrigatório

Campos obrigatórios: valor, identificadorPagamento, meio

CampoTipoObrig.Descrição / restrições
duplicataIdinteger
identificadorCobrancastring
valornumber✅Em reais
dataPagamentostring (date-time)
identificadorPagamentostring✅
meiostring✅valores: PIX, LINK

Respostas

GET /financeiro/movimentacoes

Listar movimentações financeiras · Permissão: financeiro:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 50; mín. 1; máx. 200
searchquerynãostring

Respostas

POST /financeiro/movimentacoes

Cadastrar movimentação financeira · Permissão: financeiro:create

Pode disparar emissão automática de NFS-e dependendo da configuração do emitente.

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, tipoMovimentacaoFinanceira, tipoFinanceiro, categoriaDePagamentoId, contasCaixaId, data, parcelas, registroFinanceiro, registroFinanceiro[].quantidade, registroFinanceiro[].valorUnitario, registroFinanceiro[].contendo, registroFinanceiro[].centroDeCustoId, registroFinanceiro[].tipoConta, registroFinanceiro[].tipoConjunto

Se enviar duplicatas, exige: duplicatas[].vencimento, duplicatas[].valor, duplicatas[].aVista

Todos os campos do corpo (36)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado, responsável por esta movimentação.
tipoMovimentacaoFinanceirastring✅valores: PACIENTE, COLABORADOR, FORNECEDOR, CONVENIO, EMPRESA
tipoFinanceirostring✅valores: PAGAMENTO, RECEBIMENTO
categoriaDePagamentoIdinteger✅
contasCaixaIdinteger✅
datastring (date)✅
fornecedorIdintegeraceita null
pacienteIdintegeraceita null
colaboradorIdintegeraceita null
convenioIdintegeraceita null
centroDeCustoIdintegeraceita null
observacoesstringaceita null
notaFiscalstringaceita null
parcelasinteger✅
descontoGeralnumberaceita null
registroFinanceiroarray<object>✅mín. itens 1
registroFinanceiro[].quantidadeinteger✅
registroFinanceiro[].valorUnitarionumber✅
registroFinanceiro[].contendointeger✅
registroFinanceiro[].centroDeCustoIdinteger✅
registroFinanceiro[].tipoContastring✅
registroFinanceiro[].tipoConjuntostring✅
registroFinanceiro[].descricaostringaceita null
registroFinanceiro[].produtoIdintegeraceita null
registroFinanceiro[].fornecedorIdintegeraceita null
registroFinanceiro[].contasCaixasIdintegeraceita null
duplicatasarray<object>
duplicatas[].vencimentostring (date)✅
duplicatas[].observacaostringaceita null
duplicatas[].valornumber✅
duplicatas[].aVistaboolean✅
duplicatas[].valorPagonumberaceita null
duplicatas[].pagobooleanpadrão False
duplicatas[].dataPagamentostring (date)aceita null
duplicatas[].tipoDePagamentoIdintegeraceita null
duplicatas[].contaCaixaIdintegeraceita null

Respostas

POST /financeiro/movimentacoes/bulk

Cadastrar várias movimentações financeiras de uma vez · Permissão: financeiro:create

Até 50 itens por requisição (chave movimentacoes), todos com o mesmo responsavelId. 207 = falha parcial.

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, movimentacoes, movimentacoes[].responsavelId, movimentacoes[].tipoMovimentacaoFinanceira, movimentacoes[].tipoFinanceiro, movimentacoes[].categoriaDePagamentoId, movimentacoes[].contasCaixaId, movimentacoes[].data, movimentacoes[].parcelas, movimentacoes[].registroFinanceiro, movimentacoes[].registroFinanceiro[].quantidade, movimentacoes[].registroFinanceiro[].valorUnitario, movimentacoes[].registroFinanceiro[].contendo, movimentacoes[].registroFinanceiro[].centroDeCustoId, movimentacoes[].registroFinanceiro[].tipoConta, movimentacoes[].registroFinanceiro[].tipoConjunto

Se enviar movimentacoes[].duplicatas, exige: movimentacoes[].duplicatas[].vencimento, movimentacoes[].duplicatas[].valor, movimentacoes[].duplicatas[].aVista

Cada item de movimentacoes[] tem os mesmos campos de POST /financeiro/movimentacoes (máx. 50 itens).

CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
movimentacoesarray<object>✅máx. itens 50

Respostas

GET /financeiro/movimentacoes/{id}

Consultar movimentação financeira · Permissão: financeiro:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do registro desta rota (o Swagger publicado rotula como "ID do convênio" por engano de rótulo) — mín. 1

Respostas

PUT /financeiro/movimentacoes/{id}

Atualizar movimentação financeira · Permissão: financeiro:update

Pode disparar emissão automática de NFS-e dependendo da configuração do emitente (fire-and-forget — falha só é logada, não afeta a resposta). A resposta é bem mais rica que o schema MovimentacaoFinanceira documentado nas rotas de leitura — o repository busca com include: {RegistroFinanceiro: true, duplicatas: true} e devolve tudo.

Atualização parcial: campo omitido mantém o valor atual; null limpa; lista omitida mantém; lista enviada substitui ([] apaga). Nenhum campo é obrigatório.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do registro desta rota (o Swagger publicado rotula como "ID do convênio" por engano de rótulo) — mín. 1

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, tipoMovimentacaoFinanceira, tipoFinanceiro, categoriaDePagamentoId, contasCaixaId, data, parcelas, registroFinanceiro, registroFinanceiro[].quantidade, registroFinanceiro[].valorUnitario, registroFinanceiro[].contendo, registroFinanceiro[].centroDeCustoId, registroFinanceiro[].tipoConta, registroFinanceiro[].tipoConjunto

Se enviar duplicatas, exige: duplicatas[].vencimento, duplicatas[].valor, duplicatas[].aVista

Todos os campos do corpo (36)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado, responsável por esta movimentação.
tipoMovimentacaoFinanceirastring✅valores: PACIENTE, COLABORADOR, FORNECEDOR, CONVENIO, EMPRESA
tipoFinanceirostring✅valores: PAGAMENTO, RECEBIMENTO
categoriaDePagamentoIdinteger✅
contasCaixaIdinteger✅
datastring (date)✅
fornecedorIdintegeraceita null
pacienteIdintegeraceita null
colaboradorIdintegeraceita null
convenioIdintegeraceita null
centroDeCustoIdintegeraceita null
observacoesstringaceita null
notaFiscalstringaceita null
parcelasinteger✅
descontoGeralnumberaceita null
registroFinanceiroarray<object>✅mín. itens 1
registroFinanceiro[].quantidadeinteger✅
registroFinanceiro[].valorUnitarionumber✅
registroFinanceiro[].contendointeger✅
registroFinanceiro[].centroDeCustoIdinteger✅
registroFinanceiro[].tipoContastring✅
registroFinanceiro[].tipoConjuntostring✅
registroFinanceiro[].descricaostringaceita null
registroFinanceiro[].produtoIdintegeraceita null
registroFinanceiro[].fornecedorIdintegeraceita null
registroFinanceiro[].contasCaixasIdintegeraceita null
duplicatasarray<object>
duplicatas[].vencimentostring (date)✅
duplicatas[].observacaostringaceita null
duplicatas[].valornumber✅
duplicatas[].aVistaboolean✅
duplicatas[].valorPagonumberaceita null
duplicatas[].pagobooleanpadrão False
duplicatas[].dataPagamentostring (date)aceita null
duplicatas[].tipoDePagamentoIdintegeraceita null
duplicatas[].contaCaixaIdintegeraceita null

Respostas

Estoque 12 operações

Movimentação de estoque de produtos (entrada, saída, transferência).

GET /estoque

Listar posições de estoque · Permissão: estoque:read

Só linhas de entrada (movimentações de saída/transferência não aparecem aqui — use /estoque/historico/{id} pra ver todo o histórico de um produto).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 50; mín. 1; máx. 200
produtoIdquerynãointeger
localizacaoIdquerynãointeger

Respostas

GET /estoque/saldo-produtos

Saldo atual em estoque por produto · Permissão: estoque:read

Quantidade calculada (soma de entradas menos saídas), não um campo fixo.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 50; mín. 1; máx. 200
searchquerynãostring

Respostas

GET /estoque/{id}

Consultar posição de estoque · Permissão: estoque:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do registro desta rota (o Swagger publicado rotula como "ID do convênio" por engano de rótulo) — mín. 1

Respostas

GET /estoque/historico/{id}

Histórico de movimentações de um produto · Permissão: estoque:read

Sem paginação real apesar do nome do parâmetro id — devolve o histórico completo do produto sempre (o use case aceita skip/take, mas o controller nunca os lê da query, então nunca são usados). Linhas de entrada com valorUnitarioEntrada <= 0 são removidas; saída e outros tipos são sempre mantidos.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do produto (não é o id da posição de estoque) — mín. 1

Respostas

GET /estoque/ultima-compra/{id}

Última compra de um produto · Permissão: estoque:read

Nunca lança erro de "não encontrado" — se não houver dados, os valores vêm 0.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do produto — mín. 1

Respostas

GET /estoque/movimentacao/{id}

Consultar movimentação por id · Permissão: estoque:read

id aqui é o id da própria posição de estoque (diferente de /estoque/historico/{id}, onde é o id do produto). Sem conversão de centavos (diferente de todas as outras rotas de estoque) e sem nenhum include de nome — só os campos crus do Prisma, com FKs como id.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simintegerID do registro desta rota (o Swagger publicado rotula como "ID do convênio" por engano de rótulo) — mín. 1

Respostas

GET /estoque/buscar/{lote}/{produtoId}/{localizacaoId}

Buscar posição por lote/produto/depósito · Permissão: estoque:read

Só considera entradas com saldo positivo (quantidade > 0, TipoDeMovimentacaoId=1). Mesmo formato cru do GET /estoque/movimentacao/{id} — sem conversão de centavos, sem includes de nome.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
lotecaminho✅ simstring
produtoIdcaminho✅ siminteger
localizacaoIdcaminho✅ siminteger

Respostas

GET /estoque/lotes-produtos/{idProduto}/{idLocalizacao}

Listar lotes disponíveis de um produto em um depósito · Permissão: estoque:read

Mesmo controller e mesmo shape de GET /estoque — só entradas (TipoDeMovimentacaoId=1), com valores já convertidos para reais.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idProdutocaminho✅ siminteger
idLocalizacaocaminho✅ siminteger
pagequerynãointegerpadrão 1; mín. 1
pageSizequerynãointegerpadrão 50; mín. 1; máx. 200

Respostas

POST /estoque/entrada

Registrar entrada de estoque · Permissão: estoque:create

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, produtoId, localizacaoId, motivoId, quantidade

Todos os campos do corpo (14)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅ID de um colaborador já cadastrado.
produtoIdinteger✅
localizacaoIdinteger✅ID do depósito
fornecedorIdintegeraceita null
motivoIdinteger✅ID de um motivo de movimentação do tipo ENTRADA
lotestringaceita null
observacoesstringaceita null
produtoEmCaixaQuantidadestringvalores: UNIDADES, CAIXAS; padrão CAIXAS
notaFiscalstringaceita null
validadestring (date)aceita null
codIndividualstringaceita null
valorCompranumberEm reais — aceita null
quantidadeinteger✅
datastring (date)aceita null

Respostas

POST /estoque/saida

Registrar saída de estoque · Permissão: estoque:create

Recusada se não houver saldo suficiente, a não ser que permitirNegativo: true.

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, produtoId, localizacaoId, motivoId, quantidade, lote

Todos os campos do corpo (11)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
produtoIdinteger✅
localizacaoIdinteger✅
motivoIdinteger✅ID de um motivo de movimentação do tipo SAIDA
quantidadeinteger✅
permitirNegativobooleanpadrão False
valorVendanumberaceita null
lotestring✅Lote de onde sai o estoque. Envie null para produto sem lote. — aceita null
validadestring (date)aceita null
datastring (date)aceita null
produtoEmCaixaQuantidadestringvalores: UNIDADES, CAIXAS; padrão CAIXAS

Respostas

POST /estoque/transferencia

Transferir estoque entre depósitos · Permissão: estoque:create

Corpo (application/json) — obrigatório

Campos obrigatórios: responsavelId, produtoId, localizacaoId, localizacaoParaId, motivoId, quantidade, lote

Todos os campos do corpo (9)
CampoTipoObrig.Descrição / restrições
responsavelIdinteger✅
produtoIdinteger✅
localizacaoIdinteger✅Depósito de origem
localizacaoParaIdinteger✅Depósito de destino
motivoIdinteger✅
quantidadeinteger✅
lotestring✅Lote de origem. Envie null para produto sem lote. — aceita null
validadestring (date)aceita null
produtoEmCaixaQuantidadestringvalores: UNIDADES, CAIXAS; padrão CAIXAS

Respostas

POST /estoque/previsao

Previsão de consumo de estoque · Permissão: estoque:read

Não envolve valores monetários, só quantidades.

Corpo (application/json) — obrigatório

Campos obrigatórios: localId, produtos, produtos[].produtoId

CampoTipoObrig.Descrição / restrições
localIdinteger✅
dataAgendamentostring (date-time)Se informado, considera compromissos concorrentes no período (comprometido/previsto passam a ser calculados de verdade). — aceita null
agendamentoIdinteger
produtosarray<object>✅
produtos[].produtoIdinteger✅
produtos[].quantidadenumberaceita null

Respostas

NFS-e 28 operações

Emissão de nota fiscal de serviço e cadastro de tomadores.

Certificado digital, numeração e sincronização com a prefeitura não são expostos por esta API (configuração de infraestrutura da clínica).

GET /nfse/emitentes

Listar emitentes · Permissão: nfse:read

Necessário para escolher emitenteId ao calcular uma nota. Sem certificado digital nem configuração de infraestrutura — isso não é exposto por esta API.

Respostas

GET /nfse/emitentes/{id}

Consultar emitente · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

GET /nfse/perfis-fiscais

Listar perfis fiscais · Permissão: nfse:read

Necessário para escolher perfilId ao calcular uma nota.

Respostas

GET /nfse/perfis-fiscais/{id}

Consultar perfil fiscal · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

GET /nfse/tomadores

Listar tomadores · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
qquerynãostringBusca por nome/documento
tipoPessoaquerynãostringvalores: PF, PJ
ativosquerynãostringvalores: 1

Respostas

POST /nfse/tomadores

Cadastrar tomador · Permissão: nfse:create

Corpo (application/json) — obrigatório

Campos obrigatórios: nome, tipo

Todos os campos do corpo (15)
CampoTipoObrig.Descrição / restrições
nomestring✅
tipostring✅valores: operadora, empresa, particular
cnpjstring14 dígitos — obrigatório se não informar cpf — aceita null
cpfstring11 dígitos — obrigatório se não informar cnpj — aceita null
razaoSocialstringaceita null
nomeFantasiastringaceita null
imstringaceita null
logradourostringaceita null
numerostringaceita null
complementostringaceita null
bairrostringaceita null
cidadestringaceita null
ufstringaceita null
cepstringaceita null
codigoMunicipiostringaceita null

Respostas

POST /nfse/tomadores/bulk

Cadastrar vários tomadores de uma vez · Permissão: nfse:create

Até 100 itens por requisição (chave tomadores). 207 = falha parcial.

Corpo (application/json) — obrigatório

Campos obrigatórios: tomadores, tomadores[].nome, tomadores[].tipo

Cada item de tomadores[] tem os mesmos campos de POST /nfse/tomadores (máx. 100 itens).

CampoTipoObrig.Descrição / restrições
tomadoresarray<object>✅máx. itens 100

Respostas

GET /nfse/tomadores/{id}

Consultar tomador · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

PUT /nfse/tomadores/{id}

Atualizar tomador · Permissão: nfse:update

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: nome, tipo

Todos os campos do corpo (15)
CampoTipoObrig.Descrição / restrições
nomestring✅
tipostring✅valores: operadora, empresa, particular
cnpjstring14 dígitos — obrigatório se não informar cpf — aceita null
cpfstring11 dígitos — obrigatório se não informar cnpj — aceita null
razaoSocialstringaceita null
nomeFantasiastringaceita null
imstringaceita null
logradourostringaceita null
numerostringaceita null
complementostringaceita null
bairrostringaceita null
cidadestringaceita null
ufstringaceita null
cepstringaceita null
codigoMunicipiostringaceita null

Respostas

POST /nfse/tomadores/{id}/completar

Completar cadastro do tomador · Permissão: nfse:update

Preenche campos vazios a partir do histórico de notas e/ou consulta à Receita Federal (PJ). Só preenche o que já não estiver preenchido.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json)

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
consultarReceitabooleanpadrão True

Respostas

POST /nfse/tomadores/sincronizar-paciente/{pacienteId}

Sincronizar tomador a partir de um paciente · Permissão: nfse:read

Cria/garante um tomador clonando o perfil fiscal padrão de pessoa física, sem precisar configurar fiscal por paciente. Idempotente (find-or-create por paciente).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
pacienteIdcaminho✅ siminteger

Respostas

GET /nfse/notas

Listar notas · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
emitenteIdquerynãostring
tomadorIdquerynãostring
statusquerynãostring
referenciaExternaquerynãostring
dataInicialquerynãostring (date)
dataFinalquerynãostring (date)
limitequerynãointegerpadrão 100; máx. 500
pularquerynãointegerpadrão 0

Respostas

POST /nfse/notas

Calcular nota (não emite) · Permissão: nfse:create

Calcula e confere os valores, sem enviar nada à prefeitura ainda — use POST /nfse/notas/{id}/emitir para efetivar. Idempotente via header Idempotency-Key ou campo chaveIdempotencia.

Corpo (application/json) — obrigatório

Campos obrigatórios: emitenteId, tomadorId, perfilId, valorServicos, dataCompetencia

Todos os campos do corpo (14)
CampoTipoObrig.Descrição / restrições
emitenteIdstring✅
tomadorIdstring✅
perfilIdstring✅
valorServicosnumber✅
dataCompetenciastring (date)✅
referenciastringaceita null
referenciaExternastringID livre para correlacionar com o sistema de origem — aceita null
dataPagamentostring (date)aceita null
detalhamentoAdicionalstringaceita null
descontoCondicionadonumberaceita null
descontoIncondicionadonumberaceita null
deducoesBaseISSQNnumberaceita null
notaSubstituidaIdstringPreencher para calcular uma nota que substitui uma já emitida — aceita null
tomadorDocConfirmadostringaceita null

Respostas

GET /nfse/notas/{id}

Consultar nota · Permissão: nfse:read

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

POST /nfse/notas/{id}/emitir

Emitir nota — EFEITO FISCAL · Permissão: nfse:create

Envia a nota de verdade à prefeitura. Consome o limite mensal do plano (nfse.notas.mes). Campo forcar: true no corpo emite mesmo se a conferência automática não estiver apta (assume o risco). modo: "assincrono" só vale para o padrão nacional.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json)

Nenhum campo obrigatório no nível principal.

CampoTipoObrig.Descrição / restrições
forcarbooleanpadrão False
modostringvalores: sincrono, assincrono; padrão sincrono

Respostas

POST /nfse/notas/{id}/consultar-protocolo

Consultar protocolo de emissão assíncrona · Permissão: nfse:create

Só para notas emitidas no modo: "assincrono" — verifica se a prefeitura já processou e, se sim, grava o resultado (mesmo desfecho de emitir síncrono).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

POST /nfse/notas/{id}/emitir-contingencia

Emitir em contingência — EFEITO FISCAL · Permissão: nfse:create

Gera a nota localmente, sem contato com a prefeitura (para quando o webservice está fora do ar). Precisa ser transmitida depois via transmitir-contingencia, dentro do prazo municipal.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: justificativa

CampoTipoObrig.Descrição / restrições
justificativastring✅mín. caracteres 15

Respostas

POST /nfse/notas/{id}/transmitir-contingencia

Transmitir nota emitida em contingência — EFEITO FISCAL · Permissão: nfse:create

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

PUT /nfse/notas/{id}/tomador

Trocar tomador da nota · Permissão: nfse:update

Só antes de enviar à prefeitura (status calculada/conferida/erro). Usado para um pagador avulso (CPF/nome informados na hora).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: cpf, nome

CampoTipoObrig.Descrição / restrições
cpfstring✅
nomestring✅
emailstringaceita null
fonestringaceita null

Respostas

POST /nfse/notas/{id}/desistir

Desistir da nota (antes de emitir) · Permissão: nfse:delete

Só para nota ainda não emitida — nota já emitida se cancela, não se desiste.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: motivo

CampoTipoObrig.Descrição / restrições
motivostring✅

Respostas

POST /nfse/notas/{id}/cancelar

Cancelar nota emitida — EFEITO FISCAL · Permissão: nfse:delete

Cancelamento de verdade na prefeitura (padrão nacional com fallback ABRASF).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: motivo

CampoTipoObrig.Descrição / restrições
motivostring✅mín. caracteres 15
codigostringvalores: 1, 2, 9; padrão 1

Respostas

POST /nfse/notas/{id}/substituir

Calcular nota substituindo uma já emitida · Permissão: nfse:create

Calcula uma nota nova reaproveitando os dados da antiga (só sobrescreve o que for enviado no corpo). A antiga só é cancelada de verdade quando a nova emitir com sucesso.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstringID da nota a ser substituída

Corpo (application/json) — obrigatório

Campos obrigatórios: motivo

CampoTipoObrig.Descrição / restrições
motivostring✅Motivo da substituição — mín. caracteres 15

Respostas

POST /nfse/notas/{id}/analise-fiscal

Solicitar análise fiscal de cancelamento fora do prazo · Permissão: nfse:delete

Só padrão nacional. O desfecho é assíncrono — a nota fica em analise_fiscal_pendente até a prefeitura decidir.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Corpo (application/json) — obrigatório

Campos obrigatórios: motivo

CampoTipoObrig.Descrição / restrições
motivostring✅mín. caracteres 15
codigostringvalores: 1, 2, 9; padrão 1

Respostas

GET /nfse/notas/{id}/xml

Baixar XML da NFS-e · Permissão: nfse:read

Não é JSON — Content-Type: application/xml, com Content-Disposition: attachment; filename="NFSe_00001234.xml". Corpo é o XML já assinado, cru.

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

GET /nfse/notas/{id}/danfse.html

Visualizar DANFSe (HTML) · Permissão: nfse:read

Não é JSON — Content-Type: text/html, sem Content-Disposition (renderizável inline, não é anexo).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

GET /nfse/notas/{id}/danfse.pdf

Baixar DANFSe (PDF) · Permissão: nfse:read

Não é JSON, é binário — Content-Type: application/pdf, Content-Disposition: attachment; filename="NFSe_00001234.pdf".

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring

Respostas

GET /nfse/notas/{id}/tentativas

Histórico de tentativas de comunicação com a prefeitura · Permissão: nfse:read

?xml=1 inclui requisição/resposta bruta trocada com a prefeitura (pode ser grande e sensível).

Parâmetros

NomeOndeObrig.TipoDescrição / restrições
idcaminho✅ simstring
xmlquerynãostring1 para incluir requisição/resposta bruta — valores: 1

Respostas

Continue por aqui: Visão geral e autenticação · Implantação pela API · Erros e boas práticas