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
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 |
yyyy-MM-dd.dd-MM-yyyy
(a barra é separador de caminho e não pode ser usada na URL).
dd/MM/yyyy.
87.45). Não use separador de milhar.
/). Ela faz parte da URL e
deve ser mantida exatamente como documentado.
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.
401. Não solicite um token novo a cada
requisição.
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.
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 |
/, #,
?, &, + 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 |
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.
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 |
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:
nomeOrRazaoSocial não é preenchido neste endpoint. Para obter o nome do
titular, use GET /api/pessoa/{cpf-cnpj}.
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 |
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 |
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:
cotaUnica = true são desconsideradas. Por isso o campo
cotaUnica deve sempre ser enviado.
parcelas ou com a lista vazia retorna
204 No Content.
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 |
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:
parcelas ou com a lista vazia retorna
204 No Content.
200.
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 |
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 |
Finalidade: registrar a baixa (pagamento) de uma guia de arrecadação.
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 |
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 |
Registro de instalação e troca de hidrômetro e consultas de apoio. Requer a permissão
acessarResourceHidrometroApi.
/.
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.
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 |
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 |
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 |
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 |
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 /.
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 |
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 |
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 |
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 |
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"
}
}
fisica ou juridica) é retornado, conforme o tipo da
pessoa. Campos sem valor cadastrado são omitidos da resposta.
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 |
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.
MesAnoReferencial × MesAnoReferencia,
CodigoDeBarras × CodigoBarras,
CopiaEColaQRCode × QrCode.
"" e números como 0.
| 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:
matricula e o documento devem pertencer à mesma unidade consumidora.
Se o documento não corresponder ao titular da matrícula informada, a resposta é
204 No Content.
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 |
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 |
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 |
| Campo | Tipo | Descrição |
|---|---|---|
| token | String | Token a enviar no header Authorization |
| duration | Integer | Validade do token, em segundos |
| user | Usuario | Dados da credencial autenticada |
| Campo | Tipo | Descrição |
|---|---|---|
| nome | String | Nome da credencial |
| acessarResourceDebitoApi | Boolean | Permissão para os endpoints de débito e de pessoa |
| acessarResourceHidrometroApi | Boolean | Permissão para os endpoints de hidrômetro, ordem de serviço e pessoa |
| acessarResourceLeituraApi | Boolean | Permissão para os endpoints de leitura |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| parcelas | Array<Parcela> | Sim | Parcelas para as quais a guia será emitida |
| Campo | Tipo | Descrição |
|---|---|---|
| idPessoa | Decimal | Identificador da pessoa |
| idCadastro | Decimal | Identificador do cadastro da unidade consumidora |
| idParcela | Decimal | Identificador da parcela |
| idDivida | Decimal | Identificador do tipo de débito |
| idCalculo | Decimal | Identificador do lançamento que originou a parcela |
| idValorDivida | Decimal | Identificador do valor do débito |
| idOpcaoPagamento | Decimal | Identificador da opção de pagamento |
| idConfiguracaoAcrescimo | Decimal | Identificador da configuração de acréscimos |
| cadastro | String | Número da unidade consumidora |
| enderecoCadastro | String | Endereço da unidade consumidora |
| tipoCadastro | String | Tipo do cadastro |
| nomeOrRazaoSocial | String | Nome ou razão social do contribuinte (preenchido apenas em /saneamento-pessoa) |
| divida | String | Descrição do débito |
| parcela | String | Identificação da parcela (ex.: 1/1) |
| referencia | String | Competência de referência (ex.: 08/2026) |
| exercicio | Decimal | Exercício |
| vencimento | String yyyy-MM-dd | Data de vencimento |
| situacao | String | Situação da parcela |
| tipoCalculo | String | Tipo do lançamento |
| ordemApresentacao | Decimal | Ordem de apresentação |
| cotaUnica | Boolean | Indica se a parcela é cota única (com desconto) |
| dividaAtiva | Boolean | Indica se o débito está inscrito em dívida ativa |
| dividaAtivaAjuizada | Boolean | Indica se a dívida ativa está ajuizada |
| bloqueiaImpressao | Boolean | Indica que a emissão da guia está bloqueada para esta parcela |
| quantidadeDamImpresso | Decimal | Quantidade de guias já emitidas para a parcela |
| sd | Decimal | Saldo devedor |
| valorOriginal | Decimal | Valor original |
| valorCorrecao | Decimal | Correção monetária |
| valorJuros | Decimal | Juros |
| valorMulta | Decimal | Multa |
| valorHonorarios | Decimal | Honorários |
| valorDesconto | Decimal | Desconto |
| valorImposto | Decimal | Imposto |
| valorTaxa | Decimal | Taxa |
| valorPago | Decimal | Valor já pago |
| total | Decimal | Valor total da parcela |
| Campo | Tipo | Descrição |
|---|---|---|
| id | Decimal | Identificador da guia; usado em /consultar-parcela-por-dam |
| numeroDAM | String | Número da guia |
| numero | Decimal | Número sequencial |
| exercicio | Decimal | Exercício |
| codigoBarras | String | Código de barras / linha digitável |
| qrCodePIX | String | PIX copia-e-cola, quando disponível |
| emissao | String yyyy-MM-dd | Data de emissão |
| vencimento | String yyyy-MM-dd | Data de vencimento |
| valorOriginal | Decimal | Valor original |
| juros | Decimal | Juros |
| multa | Decimal | Multa |
| honorarios | Decimal | Honorários |
| correcaoMonetaria | Decimal | Correção monetária |
| desconto | Decimal | Desconto |
| total | Decimal | Valor a pagar: valorOriginal + honorarios + juros + multa + correcaoMonetaria - desconto |
| situacao | String | Situação da guia |
| tipo | String | Tipo da guia |
| Campo | Tipo | Descrição |
|---|---|---|
| id | Decimal | Identificador da parcela |
| situacaoAtual | String | Situação atual da parcela (ex.: EM_ABERTO, PAGO) |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| numeroUnidadeConsumidora | Integer | Sim | Número da unidade consumidora |
| matriculaFuncionarioAbertura | String | Sim | Matrícula do responsável pela abertura |
| observacaoTexto | String | Sim | Observações gerais |
| matriculaFuncionarioExecucao | String | Sim | Matrícula do executor |
| 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 |
| 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 |
| hidrometroInstalado | Hidrometro | Sim | Dados do novo hidrômetro |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| numeroUnidadeConsumidora | Integer | Sim | Número da unidade consumidora |
| matriculaFuncionarioAbertura | String | Sim | Matrícula do responsável pela abertura |
| observacaoTexto | String | Sim | Observações gerais |
| matriculaFuncionarioExecucao | String | Sim | Matrícula do executor |
| 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 |
| hidrometroInstalado | Hidrometro | Sim | Dados do hidrômetro instalado |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| numero | String | Sim | Número de série do hidrômetro |
| diametro | String | Não | Diâmetro do hidrômetro |
| vazao | String | Não | Vazão nominal |
| codigoRadioTelemetria | Integer | Não | Código de telemetria, se houver |
| leituraPorTelemetria | Boolean | Sim | Indica se a leitura é feita por telemetria |
| Campo | Tipo | Descrição |
|---|---|---|
| result | Object | Resultado da operação; o tipo é indicado em cada endpoint |
| mensagem | String | Mensagem descritiva do resultado |
| erros | Array<String> | Mensagens dos erros ocorridos |
| errosCodigo | Array<Integer> | Códigos correspondentes aos erros (ver Códigos de erro) |
| Campo | Tipo | Descrição |
|---|---|---|
| codigo | Integer | Código da rota |
| descricao | String | Descrição da rota |
| Campo | Tipo | Descrição |
|---|---|---|
| numero | Integer | Número (matrícula) da unidade consumidora |
| enderecoCompleto | String | Endereço da unidade |
| Campo | Tipo | Descrição |
|---|---|---|
| id | Decimal | Identificador do serviço; informar como servicoId na abertura da ordem de serviço |
| descricao | String | Descrição do serviço |
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| servicoId | Long | Sim | Identificador do serviço |
| unidade | Integer | Sim | Número da unidade consumidora |
| observacao | String | Sim | Descrição/observação da solicitação |
| Campo | Tipo | Descrição |
|---|---|---|
| numeroOS | Integer | Número da ordem de serviço criada |
| Campo | Tipo | Descrição |
|---|---|---|
| MesAnoReferencial | String MM/yyyy | Competência da fatura; vazio quando não informado |
| StatusPagamento | Integer | Situação do pagamento (ver tabela) |
| ValorTotal | Decimal | Valor da fatura; 0 quando não informado |
| CodigoDeBarras | String | Código de barras, apenas dígitos; vazio quando não há |
| CopiaEColaQRCode | String | PIX copia-e-cola; vazio quando não há |
| Vencimento | String yyyy-MM-dd'T'HH:mm:ss | Data de vencimento, com hora fixa 23:59:59; vazio quando não há |
| Consumo | Integer | Consumo medido, em m³; 0 quando não informado |
| Campo | Tipo | Descrição |
|---|---|---|
| MesAnoReferencia | String MM/yyyy | Competência da fatura; vazio quando não informado |
| StatusPagamento | Integer | Situação do pagamento (ver tabela) |
| Vencimento | String yyyy-MM-dd | Data de vencimento; vazio quando não há |
| Valor | Decimal | Valor da fatura; 0 quando não informado |
| CodigoBarras | String | Código de barras, apenas dígitos; vazio quando não há |
| DataPagamento | String yyyy-MM-dd | Data do pagamento; vazio quando a fatura não foi paga |
| QrCode | String | PIX copia-e-cola; vazio quando não há |
| Campo | Tipo | Descrição |
|---|---|---|
| id | Long | Identificador da pessoa |
| fisica | DadosPessoaFisica | Presente quando a pessoa é física |
| juridica | DadosPessoaJuridica | Presente quando a pessoa é jurídica |
| Campo | Tipo | Valores permitidos / observações |
|---|---|---|
| cpf | String | CPF |
| nome | String | Nome |
| sexo | String | MASCULINO, FEMININO |
| String | ||
| homePage | String | Página web |
| nivelEsolaridade | Objeto { descricao } | Nível de escolaridade |
| profissao | Objeto { descricao } | Profissão |
| mae | String | Nome da mãe |
| pai | String | Nome do pai |
| racaCor | String | INDIGENA, BRANCA, NEGRO, AMARELA, PARDA, NAO_INFORMADA |
| tipoDeficiencia | String | Tipo de deficiência |
| tipoSanguineo | String | Tipo sanguíneo |
| doadorSanguineo | Boolean | Doador de sangue |
| estadoCivil | String | SOLTEIRO, CASADO, DIVORCIADO, VIUVO, UNIAO_ESTAVEL |
| naturalidade | Objeto { nome, uf: { nome } } | Cidade de naturalidade |
| nacionalidade | String | Nacionalidade |
| Campo | Tipo | Descrição |
|---|---|---|
| cnpj | String | CNPJ |
| razaoSocial | String | Razão social |
| nomeFantasia | String | Nome fantasia |
| inscricaoEstadual | String | Inscrição estadual |
| tipoEmpresa | String | Tipo da empresa |
| 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 |
Usado pelos módulos Autenticação, Débitos e Leitura:
{
"status": 403,
"message": "Débito não encontrado!"
}
| Campo | Tipo | Descrição |
|---|---|---|
| status | Integer | Repete o código HTTP da resposta |
| message | String | Descrição do erro, em português |
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]
}
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.
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 |
codigoBarras retornado.
id da guia.
result = true impede a troca).
numero da unidade.
id do serviço desejado.
servicoId e unidade.