Documentação da API - Saneamento

Guia de integração para sistemas externos — consulta de débitos, emissão e baixa de guias, ordens de serviço de hidrômetro e consulta de faturas.

Versão 2.0 — Setembro/2026

1. Visão Geral

API REST para integração com o sistema de saneamento municipal (água e esgoto). Permite consultar débitos, emitir e registrar a baixa de guias de arrecadação (DAM), abrir ordens de serviço de hidrômetro e consultar as faturas de uma unidade consumidora.

Item Valor
URL base https://{host-da-api} — informada pela contratante na liberação do acesso
Formato de troca application/json, codificação UTF-8
Autenticação Token Bearer — ver Autenticação
Exceção de formato /api/debito/imprimir retorna application/pdf

1.1. Convenções gerais

1.2. Endpoints disponíveis

2. Autenticação

Todos os endpoints, exceto o de autenticação, exigem um token de acesso enviado no header Authorization:

Authorization: Bearer <token>

O token é obtido em GET /auth/login-token/{cpfcnpj}/{senha}, com as credenciais fornecidas pela contratante. A resposta informa, no campo duration, a validade do token em segundos. Após esse prazo é necessário autenticar novamente — não existe endpoint de renovação.

Recomendação de integração: reaproveite o mesmo token durante toda a sua validade e renove-o antes de expirar, ou ao receber um 401. Não solicite um token novo a cada requisição.

2.1. Permissões

Cada credencial recebe um conjunto de permissões que define quais grupos de endpoints ela pode consumir. A resposta da autenticação informa as permissões concedidas:

Campo na resposta da autenticação Quando true, dá acesso a
acessarResourceDebitoApi /api/debito/* e /api/pessoa/*
acessarResourceHidrometroApi /api/hidrometro/*, /api/ordem-servico/* e /api/pessoa/*
acessarResourceLeituraApi /api/leitura/*

Consumir um endpoint sem a permissão correspondente resulta em 403 Forbidden. Solicite à contratante a liberação das permissões necessárias à sua integração.

3. Endpoints

3.1. Autenticação

GET /auth/login-token/{cpfcnpj}/{senha} SEM AUTENTICAÇÃO

Finalidade: autenticar a credencial e obter o token de acesso usado nos demais endpoints.

Headers: nenhum obrigatório.

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
cpfcnpj String Sim CPF ou CNPJ da credencial de acesso
senha String Sim Senha da credencial de acesso
Os dois valores fazem parte da URL. Caracteres especiais (incluindo /, #, ?, &, + e espaços) devem ser codificados em percent-encoding antes do envio.

Exemplo de requisição:

GET /auth/login-token/12345678909/S3nh4%40Exemplo
Host: {host-da-api}
Accept: application/json

Resposta de sucesso (200): Autenticacao

{
  "token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "duration": 1200,
  "user": {
    "nome": "INTEGRADOR EXEMPLO",
    "acessarResourceDebitoApi": true,
    "acessarResourceHidrometroApi": false,
    "acessarResourceLeituraApi": false
  }
}

Resposta de erro (401):

{
  "status": 401,
  "message": "usuário ou senha inválidos"
}

Códigos HTTP:

Código Significado
200 Autenticado — token emitido
401 Credenciais inválidas ou autenticação indisponível no momento

3.2. Débitos e guias de arrecadação

Consulta de parcelas em aberto, emissão da guia de arrecadação (DAM) e registro da baixa de pagamento. Requer a permissão acessarResourceDebitoApi e o header Authorization em todas as requisições.

GET /api/debito/saneamento-pessoa/{cpf} DÉBITO

Finalidade: listar as parcelas em aberto de todas as unidades consumidoras vinculadas a um CPF/CNPJ.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
cpf String Sim CPF ou CNPJ do contribuinte, com ou sem formatação

Observações para integração:

Exemplo de requisição:

GET /api/debito/saneamento-pessoa/12345678909
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<Parcela>

[
  {
    "idPessoa": 45871,
    "idCadastro": 10233,
    "idParcela": 998877,
    "idDivida": 12,
    "idCalculo": 776655,
    "idValorDivida": 554433,
    "idOpcaoPagamento": 3,
    "idConfiguracaoAcrescimo": 7,
    "cadastro": "123456",
    "enderecoCadastro": "RUA DAS FLORES, 100 - CENTRO",
    "nomeOrRazaoSocial": "MARIA DA SILVA",
    "tipoCadastro": "UNIDADE_CONSUMIDORA",
    "divida": "FATURA DE SANEAMENTO",
    "parcela": "1/1",
    "referencia": "08/2026",
    "exercicio": 2026,
    "vencimento": "2026-09-10",
    "situacao": "EM_ABERTO",
    "tipoCalculo": "FATURA_SANEAMENTO",
    "ordemApresentacao": 1,
    "cotaUnica": false,
    "dividaAtiva": false,
    "dividaAtivaAjuizada": false,
    "bloqueiaImpressao": false,
    "quantidadeDamImpresso": 1,
    "sd": 0,
    "valorOriginal": 87.45,
    "valorCorrecao": 0.00,
    "valorJuros": 0.00,
    "valorMulta": 0.00,
    "valorHonorarios": 0.00,
    "valorDesconto": 0.00,
    "valorImposto": 0.00,
    "valorTaxa": 0.00,
    "valorPago": 0.00,
    "total": 87.45
  }
]

Códigos HTTP:

Código Significado
200 Lista de parcelas (pode vir vazia: [])
204 Nenhum contribuinte localizado para o CPF/CNPJ informado
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/debito/saneamento-unidade/{numeroUnidade} DÉBITO

Finalidade: listar as parcelas em aberto de uma unidade consumidora específica.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
numeroUnidade Numérico Sim Número (matrícula) da unidade consumidora

Observações para integração:

Exemplo de requisição:

GET /api/debito/saneamento-unidade/123456
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<Parcela> — mesma estrutura de /saneamento-pessoa.

Códigos HTTP:

Código Significado
200 Lista de parcelas (pode vir vazia: [])
204 Unidade consumidora não localizada
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/debito/saneamento-parcela/{idParcela} DÉBITO

Finalidade: consultar os dados atualizados de uma única parcela.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
idParcela Numérico Sim Valor do campo idParcela obtido nas consultas de débito

Exemplo de requisição:

GET /api/debito/saneamento-parcela/998877
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Parcela (objeto único). O campo nomeOrRazaoSocial vem vazio.

Códigos HTTP:

Código Significado
200 Parcela encontrada
4xx / 5xx Erro no formato padrão de erro
401 / 403 Token ausente, inválido ou sem a permissão necessária

POST /api/debito/gerar DÉBITO

Finalidade: emitir a guia de arrecadação (DAM) das parcelas informadas e retornar seus dados em JSON — código de barras, PIX copia-e-cola, valores e vencimento.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>
Content-Type Sim application/json

Body: SolicitacaoGuia

Campo Tipo Obrigatório Descrição
parcelas Array<Parcela> Sim Parcelas a emitir, no formato devolvido pelas consultas de débito

Campos da parcela considerados na emissão: idPessoa, idCadastro, idParcela, idDivida, idCalculo, vencimento, ordemApresentacao, tipoCalculo, referencia, sd, valorImposto, valorJuros, valorMulta, valorOriginal, valorPago, valorTaxa, valorCorrecao, valorHonorarios, valorDesconto, cadastro, enderecoCadastro, divida, parcela, situacao e cotaUnica.

Observações para integração:

Exemplo de requisição:

POST /api/debito/gerar
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

{
  "parcelas": [
    {
      "idPessoa": 45871,
      "idCadastro": 10233,
      "idParcela": 998877,
      "idDivida": 12,
      "idCalculo": 776655,
      "vencimento": "2026-09-10",
      "ordemApresentacao": 1,
      "tipoCalculo": "FATURA_SANEAMENTO",
      "referencia": "08/2026",
      "sd": 0,
      "valorImposto": 0.00,
      "valorJuros": 0.00,
      "valorMulta": 0.00,
      "valorOriginal": 87.45,
      "valorPago": 0.00,
      "valorTaxa": 0.00,
      "valorCorrecao": 0.00,
      "valorHonorarios": 0.00,
      "valorDesconto": 0.00,
      "cadastro": "123456",
      "enderecoCadastro": "RUA DAS FLORES, 100 - CENTRO",
      "divida": "FATURA DE SANEAMENTO",
      "parcela": "1/1",
      "situacao": "EM_ABERTO",
      "cotaUnica": false
    }
  ]
}

Resposta de sucesso (200): Array<DAM>

[
  {
    "id": 445566,
    "numeroDAM": "2026000445566",
    "numero": 445566,
    "exercicio": 2026,
    "codigoBarras": "81660000000-8 87450012026-1 09100000123-4 45600000001-2",
    "qrCodePIX": "00020126580014BR.GOV.BCB.PIX...6304ABCD",
    "emissao": "2026-09-03",
    "vencimento": "2026-09-10",
    "valorOriginal": 87.45,
    "juros": 0.00,
    "multa": 0.00,
    "honorarios": 0.00,
    "correcaoMonetaria": 0.00,
    "desconto": 0.00,
    "total": 87.45,
    "situacao": "EM_ABERTO",
    "tipo": "NORMAL"
  }
]

Resposta de erro (403):

{
  "status": 403,
  "message": "Foram encontrado(s) débito(s) com a situação Paga!"
}

Códigos HTTP:

Código Significado
200 Guia(s) emitida(s)
204 Nenhuma parcela informada no corpo
403 Alguma parcela informada já está paga
4xx / 5xx Demais erros no formato padrão de erro
401 / 403 Token ausente, inválido ou sem a permissão necessária

POST /api/debito/imprimir DÉBITO

Finalidade: emitir a guia de arrecadação (DAM) das parcelas informadas e retornar o PDF pronto para impressão.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>
Content-Type Sim application/json
Accept Não application/pdf

Body: SolicitacaoGuia — idêntico ao de /api/debito/gerar.

Observações para integração:

Exemplo de requisição:

POST /api/debito/imprimir
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

{ "parcelas": [ { ...mesma estrutura de /api/debito/gerar... } ] }

Resposta de sucesso (200):

Header Valor
Content-Type application/pdf
Content-Disposition filename=DAM.pdf

O corpo da resposta é o binário do PDF.

Códigos HTTP:

Código Significado
200 PDF da guia
204 Nenhuma parcela informada no corpo
403 Alguma parcela informada já está paga
4xx / 5xx Demais erros no formato padrão de erro (resposta em JSON)
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/debito/consultar-parcela-por-dam/{idDam} DÉBITO

Finalidade: consultar as parcelas vinculadas a uma guia e a situação atual de cada uma. Use para confirmar, após o registro da baixa, se o pagamento foi efetivado.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
idDam Numérico Sim Campo id devolvido por /api/debito/gerar

Exemplo de requisição:

GET /api/debito/consultar-parcela-por-dam/445566
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<SituacaoParcela>

[
  {
    "id": 998877,
    "situacaoAtual": "PAGO"
  }
]

Códigos HTTP:

Código Significado
200 Lista de parcelas da guia (pode vir vazia: [])
4xx / 5xx Erro no formato padrão de erro
401 / 403 Token ausente, inválido ou sem a permissão necessária

POST /api/debito/baixar-pagamento/{codigoBarras}/{dataPagamento}/{valorPago}/{cnpjArrecadador}/{tipoPagamento} DÉBITO

Finalidade: registrar a baixa (pagamento) de uma guia de arrecadação.

Este endpoint não recebe corpo. Todos os dados são enviados como parâmetros de path, na ordem documentada.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
codigoBarras String Sim Código de barras da guia paga
dataPagamento String dd-MM-yyyy Sim Data em que o pagamento foi efetuado
valorPago Decimal Sim Valor efetivamente pago (ponto como separador decimal)
cnpjArrecadador String Sim CNPJ do agente arrecadador
tipoPagamento Integer Sim Código do tipo de pagamento, fornecido pela contratante
A data usa hífen (dd-MM-yyyy), e não barra, porque é enviada dentro da URL. Enviar em outro formato retorna 403.

Exemplo de requisição:

POST /api/debito/baixar-pagamento/816600000008874500120261091000001234456000000012/03-09-2026/87.45/11222333000181/1
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...

Resposta de sucesso: 200 OK, sem corpo.

Respostas de erro (403):

{
  "status": 403,
  "message": "Débito não encontrado!"
}
{
  "status": 403,
  "message": "Padrão dataPagamento inválido, deve ser informado com padrão: dd-MM-yyyy"
}

Códigos HTTP:

Código Significado
200 Baixa registrada
204 codigoBarras ou cnpjArrecadador enviados em branco
403 Guia não localizada, ou dataPagamento fora do formato dd-MM-yyyy
4xx / 5xx Demais erros no formato padrão de erro
401 / 403 Token ausente, inválido ou sem a permissão necessária

3.3. Hidrômetro

Registro de instalação e troca de hidrômetro e consultas de apoio. Requer a permissão acessarResourceHidrometroApi.

Barra final obrigatória: as rotas deste módulo terminam com /. Mantenha-a exatamente como documentado.

Formato de resposta: todos os endpoints deste módulo respondem com o envelope RespostaHidrometro. Quando a lista erros vem preenchida, o código HTTP é 400. Os valores de errosCodigo estão descritos em Códigos de erro do módulo Hidrômetro.

POST /api/hidrometro/ordem-servico-trocahd-completa/ HIDRÔMETRO

Finalidade: registrar, em uma única chamada, a troca de hidrômetro de uma unidade consumidora: retirada do hidrômetro atual, instalação do novo e leituras de ambos.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>
Content-Type Sim application/json

Body: TrocaHidrometro

Campo Tipo Obrigatório Descrição
numeroUnidadeConsumidora Integer Sim Número (matrícula) da unidade consumidora
matriculaFuncionarioAbertura String Sim Matrícula do funcionário responsável pela abertura
observacaoTexto String Sim Observações gerais
matriculaFuncionarioExecucao String Sim Matrícula do funcionário que executou o serviço
dataRetiradaHD String dd/MM/yyyy Sim Data de retirada do hidrômetro
dataInstalacaoHD String dd/MM/yyyy Sim Data de instalação do novo hidrômetro
leituraAtualRetirada Integer Sim Leitura do hidrômetro retirado; deve ser maior que a leitura anterior registrada
leituraAtualInstalacao Integer Sim Leitura inicial do novo hidrômetro
numeroHidrometroRetirada String Sim Número de série do hidrômetro retirado
parecerTexto String Sim Parecer técnico sobre a troca
hidrometroInstalado Hidrometro Sim Dados do novo hidrômetro
hidrometroInstalado.numero String Sim Número de série do novo hidrômetro; deve ser diferente do atual
hidrometroInstalado.diametro String Não Diâmetro do hidrômetro
hidrometroInstalado.vazao String Não Vazão nominal
hidrometroInstalado.codigoRadioTelemetria Integer Não Código de telemetria, se houver
hidrometroInstalado.leituraPorTelemetria Boolean Sim Indica se a leitura é feita por telemetria

Exemplo de requisição:

POST /api/hidrometro/ordem-servico-trocahd-completa/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

{
  "numeroUnidadeConsumidora": 123456,
  "matriculaFuncionarioAbertura": "1234",
  "observacaoTexto": "Troca para telemetria",
  "matriculaFuncionarioExecucao": "311",
  "dataRetiradaHD": "05/06/2026",
  "dataInstalacaoHD": "05/06/2026",
  "leituraAtualRetirada": 1,
  "leituraAtualInstalacao": 2,
  "numeroHidrometroRetirada": "Y15L890783",
  "parecerTexto": "Substituição necessária",
  "hidrometroInstalado": {
    "numero": "Y15L8907831",
    "diametro": null,
    "vazao": null,
    "codigoRadioTelemetria": null,
    "leituraPorTelemetria": true
  }
}

Resposta de sucesso (200): RespostaHidrometro com result do tipo Integer (número da ordem de serviço gerada).

{
  "result": 1001,
  "mensagem": "Processado com sucesso",
  "erros": [],
  "errosCodigo": []
}

Resposta de erro (400) — erros possíveis neste endpoint:

{
  "result": null,
  "mensagem": "Erro ao processar a requisição",
  "erros": [
    "Já existe uma ordem de serviço com os seguintes filtros: unidade consumidora e hidrômetro instalação",
    "Não é permitida a troca de hidrômetro. A unidade consumidora está vinculada a uma remessa de leitura não concluída",
    "Funcionário não encontrado para a matrícula informada",
    "Leitura anterior não encontrada com os seguintes filtros: unidade consumidora e data de retirada",
    "Não é permitida a conclusão da troca de hidrômetro, pois a última leitura indica que o hidrômetro atual é igual ao novo",
    "Unidade consumidora não encontrada para o número informado",
    "Serviço de troca de hidrômetro não encontrado",
    "Padrão data inválido, deve ser informado com padrão: dd/MM/yyyy",
    "Já existe uma ordem de serviço aberta com os seguintes filtros: unidade consumidora e serviço",
    "JSON inválido, verifique se todos os campos obrigatórios estão informados",
    "Leitura de retirada inválida, leitura de retirada deve ser maior que a leitura anterior"
  ],
  "errosCodigo": [2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 14]
}

Resposta de erro (400) — requisição malformada:

{
  "result": null,
  "mensagem": "Erro ao processar a requisição",
  "erros": [
    "Erro inesperado ao processar a requisição, verifique se todos os campos obrigatórios estão informados"
  ],
  "errosCodigo": []
}

Códigos HTTP:

Código Significado
200 Ordem de serviço registrada — result traz o número gerado
204 Sem conteúdo a retornar
400 Erros de validação/negócio (erros e errosCodigo preenchidos) ou requisição malformada
401 / 403 Token ausente, inválido ou sem a permissão necessária

POST /api/hidrometro/ordem-servico-abertura-completa/ HIDRÔMETRO

Finalidade: registrar a instalação de hidrômetro em uma unidade consumidora que ainda não possui hidrômetro. Não há dados de retirada.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>
Content-Type Sim application/json

Body: InstalacaoHidrometro

Campo Tipo Obrigatório Descrição
numeroUnidadeConsumidora Integer Sim Número (matrícula) da unidade consumidora
matriculaFuncionarioAbertura String Sim Matrícula do funcionário responsável pela abertura
observacaoTexto String Sim Observações gerais
matriculaFuncionarioExecucao String Sim Matrícula do funcionário que executou o serviço
dataInstalacaoHD String dd/MM/yyyy Sim Data de instalação do hidrômetro
leituraAtualInstalacao Integer Sim Leitura inicial do hidrômetro
parecerTexto String Sim Parecer técnico sobre a instalação
hidrometroInstalado Hidrometro Sim Dados do hidrômetro instalado (mesmos campos e obrigatoriedades da troca)

Exemplo de requisição:

POST /api/hidrometro/ordem-servico-abertura-completa/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

{
  "numeroUnidadeConsumidora": 123456,
  "matriculaFuncionarioAbertura": "1234",
  "observacaoTexto": "Instalação de hidrômetro",
  "matriculaFuncionarioExecucao": "311",
  "dataInstalacaoHD": "05/06/2026",
  "leituraAtualInstalacao": 2,
  "parecerTexto": "Instalação concluída",
  "hidrometroInstalado": {
    "numero": "Y15L8907831",
    "diametro": null,
    "vazao": null,
    "codigoRadioTelemetria": null,
    "leituraPorTelemetria": true
  }
}

Resposta de sucesso (200): RespostaHidrometro com result do tipo Integer (número da ordem de serviço gerada).

{
  "result": 1001,
  "mensagem": "Processado com sucesso",
  "erros": [],
  "errosCodigo": []
}

Resposta de erro (400) — erros possíveis neste endpoint:

{
  "result": null,
  "mensagem": "Erro ao processar a requisição",
  "erros": [
    "Já existe uma ordem de serviço com os seguintes filtros: unidade consumidora e hidrômetro instalação",
    "Não é permitida a troca de hidrômetro. A unidade consumidora está vinculada a uma remessa de leitura não concluída",
    "Funcionário não encontrado para a matrícula informada",
    "Não é permitida a conclusão da troca de hidrômetro, pois a última leitura indica que o hidrômetro atual é igual ao novo",
    "Unidade consumidora não encontrada para o número informado",
    "Padrão data inválido, deve ser informado com padrão: dd/MM/yyyy",
    "Serviço de abertura não encontrado no sistema",
    "Já existe uma ordem de serviço aberta com os seguintes filtros: unidade consumidora e serviço",
    "JSON inválido, verifique se todos os campos obrigatórios estão informados"
  ],
  "errosCodigo": [2, 3, 4, 6, 7, 9, 10, 11, 13]
}

Códigos HTTP:

Código Significado
200 Ordem de serviço registrada — result traz o número gerado
204 Sem conteúdo a retornar
400 Erros de validação/negócio ou requisição malformada
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/hidrometro/has-remessa-leitura-andamento/{numeroUnidade}/ HIDRÔMETRO

Finalidade: verificar se a unidade consumidora está em processo de leitura em andamento. Nessa condição a troca de hidrômetro é recusada (erro 3), portanto use esta consulta como verificação prévia.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
numeroUnidade Integer Sim Número (matrícula) da unidade consumidora

Exemplo de requisição:

GET /api/hidrometro/has-remessa-leitura-andamento/123456/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): RespostaHidrometro com result do tipo Boolean. true indica que há leitura em andamento e a troca não pode ser realizada.

{
  "result": true,
  "mensagem": "Processado com sucesso",
  "erros": [],
  "errosCodigo": []
}

Resposta de erro (400):

{
  "result": null,
  "mensagem": "Erro ao processar a requisição",
  "erros": [
    "Unidade consumidora não encontrada para o número informado"
  ],
  "errosCodigo": [7]
}

Códigos HTTP:

Código Significado
200 Consulta realizada — result é true ou false
204 Sem conteúdo a retornar
400 Unidade consumidora não localizada ou requisição malformada
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/hidrometro/rotas-em-remessa-nao-concluida/ HIDRÔMETRO

Finalidade: listar as rotas de leitura que estão em andamento (não concluídas).

Headers: Authorization: Bearer <token>

Parâmetros: nenhum.

Exemplo de requisição:

GET /api/hidrometro/rotas-em-remessa-nao-concluida/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): RespostaHidrometro com result do tipo Array<Rota>.

{
  "result": [
    {
      "codigo": 10,
      "descricao": "ROTA 10"
    },
    {
      "codigo": 90,
      "descricao": "ROTA 90"
    }
  ],
  "mensagem": "Processado com sucesso",
  "erros": [],
  "errosCodigo": []
}

Códigos HTTP:

Código Significado
200 Lista de rotas
204 Sem conteúdo a retornar
400 Falha ao processar a consulta — resposta sem corpo
401 / 403 Token ausente, inválido ou sem a permissão necessária

3.4. Ordem de serviço

Abertura de ordens de serviço por tipo de serviço e consultas de apoio. Requer a permissão acessarResourceHidrometroApi. As rotas deste módulo também terminam com /.

Erros deste módulo não trazem corpo: qualquer falha resulta em 400 Bad Request sem JSON de detalhe. Valide os dados antes de enviar.

GET /api/ordem-servico/unidades-por-cpf/{cpfCnpj}/ HIDRÔMETRO

Finalidade: listar as unidades consumidoras vinculadas a um CPF/CNPJ, com o endereço de cada uma.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
cpfCnpj String Sim CPF ou CNPJ do titular

Exemplo de requisição:

GET /api/ordem-servico/unidades-por-cpf/12345678909/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<UnidadeConsumidora>

[
  {
    "numero": 123456,
    "enderecoCompleto": "RUA DAS FLORES, 100 - CENTRO"
  },
  {
    "numero": 123457,
    "enderecoCompleto": "AVENIDA PRINCIPAL, 2500 - JARDIM ALVORADA"
  }
]

Códigos HTTP:

Código Significado
200 Lista de unidades (pode vir vazia: [])
400 Falha ao processar a consulta — resposta sem corpo
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/ordem-servico/servicos-disponivel/ HIDRÔMETRO

Finalidade: listar os serviços disponíveis para abertura de ordem de serviço. O campo id retornado é o valor a informar em servicoId na abertura da ordem de serviço.

Headers: Authorization: Bearer <token>

Parâmetros: nenhum.

Exemplo de requisição:

GET /api/ordem-servico/servicos-disponivel/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<Servico>

[
  {
    "id": 5,
    "descricao": "RELIGAÇÃO DE ÁGUA"
  },
  {
    "id": 8,
    "descricao": "VERIFICAÇÃO DE VAZAMENTO"
  }
]

Códigos HTTP:

Código Significado
200 Lista de serviços (pode vir vazia: [])
400 Falha ao processar a consulta — resposta sem corpo
401 / 403 Token ausente, inválido ou sem a permissão necessária

POST /api/ordem-servico/ordem-servico-por-servico/ HIDRÔMETRO

Finalidade: abrir uma ordem de serviço para a unidade consumidora e o serviço informados.

Headers:

Nome Obrigatório Valor
Authorization Sim Bearer <token>
Content-Type Sim application/json

Body: SolicitacaoOrdemServico

Campo Tipo Obrigatório Descrição
servicoId Long Sim Identificador do serviço, obtido em /servicos-disponivel/
unidade Integer Sim Número (matrícula) da unidade consumidora
observacao String Sim Descrição/observação da solicitação

Exemplo de requisição:

POST /api/ordem-servico/ordem-servico-por-servico/
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Content-Type: application/json

{
  "servicoId": 5,
  "unidade": 123456,
  "observacao": "Solicitação de religação feita pelo titular"
}

Resposta de sucesso (200): RespostaOrdemServico

{
  "numeroOS": 1042
}

Códigos HTTP:

Código Significado
200 Ordem de serviço aberta — numeroOS traz o número gerado
400 Falha na abertura (inclusive erros de validação) — resposta sem corpo
401 / 403 Token ausente, inválido ou sem a permissão necessária

3.5. Pessoa

GET /api/pessoa/{cpf-cnpj} DÉBITOHIDRÔMETRO

Finalidade: consultar os dados cadastrais de uma pessoa física ou jurídica pelo CPF/CNPJ. Disponível para credenciais com a permissão de débito ou de hidrômetro.

Headers: Authorization: Bearer <token>

Parâmetros de path:

Parâmetro Tipo Obrigatório Descrição
cpf-cnpj String Sim CPF ou CNPJ, com ou sem formatação
Ao enviar o documento formatado (com pontos, barra e hífen), aplique percent-encoding, já que o valor faz parte da URL.

Exemplo de requisição:

GET /api/pessoa/12345678909
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200) — pessoa física: Pessoa

{
  "id": 45871,
  "fisica": {
    "cpf": "12345678909",
    "nome": "MARIA DA SILVA",
    "sexo": "FEMININO",
    "email": "maria@exemplo.com.br",
    "estadoCivil": "CASADO",
    "racaCor": "BRANCA",
    "doadorSanguineo": false,
    "mae": "JOANA DA SILVA",
    "pai": "JOSE DA SILVA",
    "nacionalidade": "BRASILEIRA",
    "nivelEsolaridade": {
      "descricao": "ENSINO MÉDIO COMPLETO"
    },
    "profissao": {
      "descricao": "COMERCIANTE"
    },
    "naturalidade": {
      "nome": "NOME DA CIDADE",
      "uf": {
        "nome": "NOME DO ESTADO"
      }
    }
  }
}

Resposta de sucesso (200) — pessoa jurídica:

{
  "id": 45872,
  "juridica": {
    "cnpj": "11222333000181",
    "razaoSocial": "EMPRESA EXEMPLO LTDA",
    "nomeFantasia": "EXEMPLO",
    "inscricaoEstadual": "1234567890",
    "tipoEmpresa": "LTDA"
  }
}
Somente um dos blocos (fisica ou juridica) é retornado, conforme o tipo da pessoa. Campos sem valor cadastrado são omitidos da resposta.

Atenção à grafia do campo nivelEsolaridade: é essa a chave utilizada no contrato atual.

Códigos HTTP:

Código Significado
200 Pessoa encontrada
204 Nenhuma pessoa localizada para o documento informado
401 / 403 Token ausente, inválido ou sem uma das permissões necessárias

3.6. Leitura e faturas

Consulta da fatura corrente e do histórico de faturas de uma unidade consumidora. Requer a permissão acessarResourceLeituraApi. Os parâmetros são enviados por query string.

Nomes de campo em PascalCase. As respostas deste módulo usam iniciais maiúsculas, e os nomes diferem entre os dois endpoints: MesAnoReferencial × MesAnoReferencia, CodigoDeBarras × CodigoBarras, CopiaEColaQRCode × QrCode.

Nenhum campo vem nulo: sem informação, textos e datas voltam como "" e números como 0.

Parâmetros de query (comuns aos dois endpoints)

Parâmetro Tipo Obrigatório Descrição
matricula String (apenas dígitos) Sim Número (matrícula) da unidade consumidora
documento String Sim CPF ou CNPJ do titular da unidade, com ou sem formatação

Validações (iguais nos dois endpoints):

Situação Código HTTP Mensagem retornada
matricula ausente ou em branco 400 matricula é obrigatória
documento ausente ou em branco 400 documento é obrigatório
matricula sem nenhum dígito 400 matricula deve conter apenas números

Observações para integração:

Valores de StatusPagamento

Código Significado
1 Em aberto — fatura não paga e ainda dentro do prazo
2 Vencida — fatura não paga com vencimento anterior à data atual
3 Paga
4 Parcelada — débito renegociado
5 Dívida ativa
99 Indefinido — situação sem equivalente nesta lista

GET /api/leitura/ultima-leitura LEITURA

Finalidade: obter o resumo da última fatura da unidade consumidora.

Headers: Authorization: Bearer <token>

Parâmetros de query: matricula e documento — ver Parâmetros de query.

Exemplo de requisição:

GET /api/leitura/ultima-leitura?matricula=123456&documento=12345678909
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): UltimaLeitura (objeto único)

{
  "MesAnoReferencial": "08/2026",
  "StatusPagamento": 1,
  "ValorTotal": 87.45,
  "CodigoDeBarras": "816600000008874500120261091000001234456000000012",
  "CopiaEColaQRCode": "00020126580014BR.GOV.BCB.PIX...6304ABCD",
  "Vencimento": "2026-09-10T23:59:59",
  "Consumo": 14
}

Resposta de erro (400):

{
  "status": 400,
  "message": "matricula é obrigatória"
}

Códigos HTTP:

Código Significado
200 Fatura encontrada
204 Nenhuma fatura para a matrícula e documento informados
400 Parâmetro inválido, ou Erro ao consultar a última leitura se a consulta falhar
401 / 403 Token ausente, inválido ou sem a permissão necessária

GET /api/leitura/historico-ultimas-faturas LEITURA

Finalidade: obter as até 8 últimas faturas da unidade consumidora (incluindo a corrente), da mais recente para a mais antiga.

Headers: Authorization: Bearer <token>

Parâmetros de query: matricula e documento — ver Parâmetros de query.

Exemplo de requisição:

GET /api/leitura/historico-ultimas-faturas?matricula=123456&documento=12345678909
Host: {host-da-api}
Authorization: Bearer eyJhbGciOiJSUzI1NiIs...
Accept: application/json

Resposta de sucesso (200): Array<FaturaHistorico>

[
  {
    "MesAnoReferencia": "08/2026",
    "StatusPagamento": 1,
    "Vencimento": "2026-09-10",
    "Valor": 87.45,
    "CodigoBarras": "816600000008874500120261091000001234456000000012",
    "DataPagamento": "",
    "QrCode": "00020126580014BR.GOV.BCB.PIX...6304ABCD"
  },
  {
    "MesAnoReferencia": "07/2026",
    "StatusPagamento": 3,
    "Vencimento": "2026-08-10",
    "Valor": 79.90,
    "CodigoBarras": "816600000007990000120261081000001234456000000012",
    "DataPagamento": "2026-08-08",
    "QrCode": ""
  }
]

Resposta de erro (400):

{
  "status": 400,
  "message": "documento é obrigatório"
}

Códigos HTTP:

Código Significado
200 Histórico encontrado (até 8 faturas)
204 Nenhuma fatura para a matrícula e documento informados
400 Parâmetro inválido, ou Erro ao consultar o histórico das últimas faturas se a consulta falhar
401 / 403 Token ausente, inválido ou sem a permissão necessária

4. Modelos de dados

Autenticacao

Campo Tipo Descrição
tokenStringToken a enviar no header Authorization
durationIntegerValidade do token, em segundos
userUsuarioDados da credencial autenticada

Usuario

Campo Tipo Descrição
nomeStringNome da credencial
acessarResourceDebitoApiBooleanPermissão para os endpoints de débito e de pessoa
acessarResourceHidrometroApiBooleanPermissão para os endpoints de hidrômetro, ordem de serviço e pessoa
acessarResourceLeituraApiBooleanPermissão para os endpoints de leitura

SolicitacaoGuia

Campo Tipo Obrigatório Descrição
parcelasArray<Parcela>SimParcelas para as quais a guia será emitida

Parcela

Campo Tipo Descrição
idPessoaDecimalIdentificador da pessoa
idCadastroDecimalIdentificador do cadastro da unidade consumidora
idParcelaDecimalIdentificador da parcela
idDividaDecimalIdentificador do tipo de débito
idCalculoDecimalIdentificador do lançamento que originou a parcela
idValorDividaDecimalIdentificador do valor do débito
idOpcaoPagamentoDecimalIdentificador da opção de pagamento
idConfiguracaoAcrescimoDecimalIdentificador da configuração de acréscimos
cadastroStringNúmero da unidade consumidora
enderecoCadastroStringEndereço da unidade consumidora
tipoCadastroStringTipo do cadastro
nomeOrRazaoSocialStringNome ou razão social do contribuinte (preenchido apenas em /saneamento-pessoa)
dividaStringDescrição do débito
parcelaStringIdentificação da parcela (ex.: 1/1)
referenciaStringCompetência de referência (ex.: 08/2026)
exercicioDecimalExercício
vencimentoString yyyy-MM-ddData de vencimento
situacaoStringSituação da parcela
tipoCalculoStringTipo do lançamento
ordemApresentacaoDecimalOrdem de apresentação
cotaUnicaBooleanIndica se a parcela é cota única (com desconto)
dividaAtivaBooleanIndica se o débito está inscrito em dívida ativa
dividaAtivaAjuizadaBooleanIndica se a dívida ativa está ajuizada
bloqueiaImpressaoBooleanIndica que a emissão da guia está bloqueada para esta parcela
quantidadeDamImpressoDecimalQuantidade de guias já emitidas para a parcela
sdDecimalSaldo devedor
valorOriginalDecimalValor original
valorCorrecaoDecimalCorreção monetária
valorJurosDecimalJuros
valorMultaDecimalMulta
valorHonorariosDecimalHonorários
valorDescontoDecimalDesconto
valorImpostoDecimalImposto
valorTaxaDecimalTaxa
valorPagoDecimalValor já pago
totalDecimalValor total da parcela

DAM (guia de arrecadação)

Campo Tipo Descrição
idDecimalIdentificador da guia; usado em /consultar-parcela-por-dam
numeroDAMStringNúmero da guia
numeroDecimalNúmero sequencial
exercicioDecimalExercício
codigoBarrasStringCódigo de barras / linha digitável
qrCodePIXStringPIX copia-e-cola, quando disponível
emissaoString yyyy-MM-ddData de emissão
vencimentoString yyyy-MM-ddData de vencimento
valorOriginalDecimalValor original
jurosDecimalJuros
multaDecimalMulta
honorariosDecimalHonorários
correcaoMonetariaDecimalCorreção monetária
descontoDecimalDesconto
totalDecimalValor a pagar: valorOriginal + honorarios + juros + multa + correcaoMonetaria - desconto
situacaoStringSituação da guia
tipoStringTipo da guia

SituacaoParcela

Campo Tipo Descrição
idDecimalIdentificador da parcela
situacaoAtualStringSituação atual da parcela (ex.: EM_ABERTO, PAGO)

TrocaHidrometro

Campo Tipo Obrigatório Descrição
numeroUnidadeConsumidoraIntegerSimNúmero da unidade consumidora
matriculaFuncionarioAberturaStringSimMatrícula do responsável pela abertura
observacaoTextoStringSimObservações gerais
matriculaFuncionarioExecucaoStringSimMatrícula do executor
dataRetiradaHDString dd/MM/yyyySimData de retirada do hidrômetro
dataInstalacaoHDString dd/MM/yyyySimData de instalação do novo hidrômetro
leituraAtualRetiradaIntegerSimLeitura do hidrômetro retirado
leituraAtualInstalacaoIntegerSimLeitura inicial do novo hidrômetro
numeroHidrometroRetiradaStringSimNúmero de série do hidrômetro retirado
parecerTextoStringSimParecer técnico
hidrometroInstaladoHidrometroSimDados do novo hidrômetro

InstalacaoHidrometro

Campo Tipo Obrigatório Descrição
numeroUnidadeConsumidoraIntegerSimNúmero da unidade consumidora
matriculaFuncionarioAberturaStringSimMatrícula do responsável pela abertura
observacaoTextoStringSimObservações gerais
matriculaFuncionarioExecucaoStringSimMatrícula do executor
dataInstalacaoHDString dd/MM/yyyySimData de instalação do hidrômetro
leituraAtualInstalacaoIntegerSimLeitura inicial do hidrômetro
parecerTextoStringSimParecer técnico
hidrometroInstaladoHidrometroSimDados do hidrômetro instalado

Hidrometro

Campo Tipo Obrigatório Descrição
numeroStringSimNúmero de série do hidrômetro
diametroStringNãoDiâmetro do hidrômetro
vazaoStringNãoVazão nominal
codigoRadioTelemetriaIntegerNãoCódigo de telemetria, se houver
leituraPorTelemetriaBooleanSimIndica se a leitura é feita por telemetria

RespostaHidrometro

Campo Tipo Descrição
resultObjectResultado da operação; o tipo é indicado em cada endpoint
mensagemStringMensagem descritiva do resultado
errosArray<String>Mensagens dos erros ocorridos
errosCodigoArray<Integer>Códigos correspondentes aos erros (ver Códigos de erro)

Rota

Campo Tipo Descrição
codigoIntegerCódigo da rota
descricaoStringDescrição da rota

UnidadeConsumidora

Campo Tipo Descrição
numeroIntegerNúmero (matrícula) da unidade consumidora
enderecoCompletoStringEndereço da unidade

Servico

Campo Tipo Descrição
idDecimalIdentificador do serviço; informar como servicoId na abertura da ordem de serviço
descricaoStringDescrição do serviço

SolicitacaoOrdemServico

Campo Tipo Obrigatório Descrição
servicoIdLongSimIdentificador do serviço
unidadeIntegerSimNúmero da unidade consumidora
observacaoStringSimDescrição/observação da solicitação

RespostaOrdemServico

Campo Tipo Descrição
numeroOSIntegerNúmero da ordem de serviço criada

UltimaLeitura

Campo Tipo Descrição
MesAnoReferencialString MM/yyyyCompetência da fatura; vazio quando não informado
StatusPagamentoIntegerSituação do pagamento (ver tabela)
ValorTotalDecimalValor da fatura; 0 quando não informado
CodigoDeBarrasStringCódigo de barras, apenas dígitos; vazio quando não há
CopiaEColaQRCodeStringPIX copia-e-cola; vazio quando não há
VencimentoString yyyy-MM-dd'T'HH:mm:ssData de vencimento, com hora fixa 23:59:59; vazio quando não há
ConsumoIntegerConsumo medido, em m³; 0 quando não informado

FaturaHistorico

Campo Tipo Descrição
MesAnoReferenciaString MM/yyyyCompetência da fatura; vazio quando não informado
StatusPagamentoIntegerSituação do pagamento (ver tabela)
VencimentoString yyyy-MM-ddData de vencimento; vazio quando não há
ValorDecimalValor da fatura; 0 quando não informado
CodigoBarrasStringCódigo de barras, apenas dígitos; vazio quando não há
DataPagamentoString yyyy-MM-ddData do pagamento; vazio quando a fatura não foi paga
QrCodeStringPIX copia-e-cola; vazio quando não há

Pessoa

Campo Tipo Descrição
idLongIdentificador da pessoa
fisicaDadosPessoaFisicaPresente quando a pessoa é física
juridicaDadosPessoaJuridicaPresente quando a pessoa é jurídica

DadosPessoaFisica

Campo Tipo Valores permitidos / observações
cpfStringCPF
nomeStringNome
sexoStringMASCULINO, FEMININO
emailStringE-mail
homePageStringPágina web
nivelEsolaridadeObjeto { descricao }Nível de escolaridade
profissaoObjeto { descricao }Profissão
maeStringNome da mãe
paiStringNome do pai
racaCorStringINDIGENA, BRANCA, NEGRO, AMARELA, PARDA, NAO_INFORMADA
tipoDeficienciaStringTipo de deficiência
tipoSanguineoStringTipo sanguíneo
doadorSanguineoBooleanDoador de sangue
estadoCivilStringSOLTEIRO, CASADO, DIVORCIADO, VIUVO, UNIAO_ESTAVEL
naturalidadeObjeto { nome, uf: { nome } }Cidade de naturalidade
nacionalidadeStringNacionalidade

DadosPessoaJuridica

Campo Tipo Descrição
cnpjStringCNPJ
razaoSocialStringRazão social
nomeFantasiaStringNome fantasia
inscricaoEstadualStringInscrição estadual
tipoEmpresaStringTipo da empresa

5. Códigos HTTP e erros

5.1. Códigos HTTP utilizados

Código Significado
200 OK Requisição processada com sucesso; o corpo traz o resultado
204 No Content Requisição válida, sem dados a retornar. O corpo é vazio — trate como "não encontrado"
400 Bad Request Dados inválidos ou erro de validação/negócio
401 Unauthorized Credenciais inválidas, ou token ausente, malformado ou expirado
403 Forbidden Sem permissão para o endpoint, ou operação não permitida para os dados informados
5xx Falha temporária no processamento. Recomenda-se nova tentativa com intervalo

5.2. Formato padrão de erro

Usado pelos módulos Autenticação, Débitos e Leitura:

{
  "status": 403,
  "message": "Débito não encontrado!"
}
Campo Tipo Descrição
statusIntegerRepete o código HTTP da resposta
messageStringDescrição do erro, em português

5.3. Formato de erro do módulo Hidrômetro

Os endpoints de Hidrômetro usam o envelope RespostaHidrometro, com as mensagens em erros e os códigos correspondentes em errosCodigo:

{
  "result": null,
  "mensagem": "Erro ao processar a requisição",
  "erros": [
    "Unidade consumidora não encontrada para o número informado"
  ],
  "errosCodigo": [7]
}

5.4. Erros do módulo Ordem de serviço

Os endpoints de Ordem de serviço retornam 400 Bad Request sem corpo. Não há detalhamento do erro na resposta; valide os dados antes do envio e confira os identificadores obtidos nas consultas de apoio.

5.5. Códigos de erro do módulo Hidrômetro

Valores possíveis no campo errosCodigo:

Código Descrição
1 Usuário ou senha inválidos
2 Já existe uma ordem de serviço com os seguintes filtros: unidade consumidora e hidrômetro instalação
3 Não é permitida a troca de hidrômetro. A unidade consumidora está vinculada a uma remessa de leitura não concluída
4 Funcionário não encontrado para a matrícula informada
5 Leitura anterior não encontrada com os seguintes filtros: unidade consumidora e data de retirada
6 Não é permitida a conclusão da troca de hidrômetro, pois a última leitura indica que o hidrômetro atual é igual ao novo
7 Unidade consumidora não encontrada para o número informado
8 Serviço de troca de hidrômetro não encontrado
9 Padrão data inválido, deve ser informado com padrão: dd/MM/yyyy
10 Serviço de abertura não encontrado no sistema
11 Já existe uma ordem de serviço aberta com os seguintes filtros: unidade consumidora e serviço
13 JSON inválido, verifique se todos os campos obrigatórios estão informados
14 Leitura de retirada inválida, leitura de retirada deve ser maior que a leitura anterior

6. Exemplos de integração

6.1. Consulta e pagamento de débito

  1. GET /auth/login-token/{cpfcnpj}/{senha} — obtenha o token.
  2. GET /api/debito/saneamento-pessoa/{cpf} ou GET /api/debito/saneamento-unidade/{numeroUnidade} — liste as parcelas em aberto.
  3. Envie as parcelas escolhidas, sem alterá-las, em POST /api/debito/gerar (dados da guia em JSON) ou POST /api/debito/imprimir (PDF).
  4. Após a arrecadação, registre a baixa em POST /api/debito/baixar-pagamento/..., usando o codigoBarras retornado.
  5. Confirme o resultado em GET /api/debito/consultar-parcela-por-dam/{idDam}, usando o id da guia.

6.2. Troca de hidrômetro

  1. GET /auth/login-token/{cpfcnpj}/{senha} — obtenha o token.
  2. GET /api/ordem-servico/unidades-por-cpf/{cpfCnpj}/ — localize a unidade consumidora do titular.
  3. GET /api/hidrometro/has-remessa-leitura-andamento/{numeroUnidade}/ — confirme que não há leitura em andamento (result = true impede a troca).
  4. POST /api/hidrometro/ordem-servico-trocahd-completa/ — registre a troca. Para uma primeira instalação, use /ordem-servico-abertura-completa/.

6.3. Abertura de ordem de serviço

  1. GET /auth/login-token/{cpfcnpj}/{senha} — obtenha o token.
  2. GET /api/ordem-servico/unidades-por-cpf/{cpfCnpj}/ — obtenha o numero da unidade.
  3. GET /api/ordem-servico/servicos-disponivel/ — obtenha o id do serviço desejado.
  4. POST /api/ordem-servico/ordem-servico-por-servico/ — abra a ordem de serviço informando servicoId e unidade.

6.4. Consulta de faturas

  1. GET /auth/login-token/{cpfcnpj}/{senha} — obtenha o token.
  2. GET /api/leitura/ultima-leitura — resumo da fatura mais recente, com código de barras e PIX copia-e-cola.
  3. GET /api/leitura/historico-ultimas-faturas — histórico das últimas faturas, com a data de pagamento das já quitadas.