API ILEVA · financeiro do associado

Integração Financeira ILEVA

Como consumir o módulo financeiro da API ILEVA: boletos em aberto, linha digitável, código de barras, PIX copia-e-cola, PDF do boleto e histórico de pagamentos.

Protocolo REST · JSON Autenticação app_key + Bearer Testado em produção 16/10/2026

Visão geral

Todo o financeiro do associado vive na API ILEVA. A partir do CPF do cliente, dois endpoints cobrem quase tudo; um terceiro traz o histórico de pagamento.

CPF do cliente
      │
      ├─ GET /associado/buscar?cpf_cnpj=<CPF>              → cod_associado, cadastro, veículos
      │
      └─ GET /cobranca/listar-associado-veiculo?cpf=<CPF>  → boletos + PIX + linha digitável + PDF
                                                             (endpoint principal: payload completo)
            │
            └─ GET /cobranca/listar?cod_associado=&situacao=Liquidado  → histórico de pagamento

Todos os endpoints, parâmetros e payloads desta página foram testados em produção em 16/10/2026 via Postman.

Credenciais

Três valores, fornecidos pela equipe responsável pela integração. Nenhum deles aparece nesta página.

Base URLhttps://api.ileva.com.br
app_keyHeader fixo por conta, enviado em todas as chamadas — inclusive na autenticação.
username / passwordUsuário dedicado da integração, usado só em POST /oauth/token.

Token e app_key andam juntos. O token obtido com um app_key só é válido em chamadas que enviem esse mesmo app_key.

Guarde as credenciais em variável de ambiente ou cofre de segredos. Nunca no código-fonte, no front-end ou em repositório.

Autenticação

POST /oauth/token devolve um Bearer token.

curl -X POST "https://api.ileva.com.br/oauth/token" \
  -H "app_key: $ILEVA_APP_KEY" \
  -H "Content-Type: application/json" \
  -d '{"username":"'"$ILEVA_USERNAME"'","password":"'"$ILEVA_PASSWORD"'"}'
{ "access_token": "eyJhbGciOi...", "token_type": "Bearer", "expires_in": 86400 }

Headers em toda chamada seguinte:

Authorization: Bearer <access_token>
app_key: <APP_KEY>

Comportamento do token

Declara expires_in: 86400 (24h) e no teste de 16/10/2026 aceitou 6 chamadas seguidas com o mesmo token. Porém a API invalida tokens de forma imprevisível: uma chamada voltou {"status":401,"mensagem":"Token..."} e a chamada idêntica seguinte, com token novo, funcionou. Historicamente o comportamento era de 1 token = 1 chamada.

Recomendação. Não confiar em cache de token. Gerar sob demanda e tratar 401 com retry automático: gerar token novo e repetir a requisição uma vez. Em lote, gerar um token por item em vez de compartilhar um só.

Boletos + PIX

GET /cobranca/listar-associado-veiculo — o endpoint principal. Boleto, PIX, linha digitável, PDF, dados do associado e veículos num payload só.

ParâmetroObrigatórioObservação
inicio_paginacaosimOffset. Sem ele: 400 "Por favor informe o inicio da paginação".
quantidade_por_paginasimAté 500–600.
cod_associado—funciona
cpf—funciona CPF só dígitos.
placa—funciona
situacao—ignorado Liquidado devolveu os mesmos registros abertos.

Pelo menos um filtro é obrigatório — sem nenhum, volta 400 "Pelo menos um parâmetro dever ser informado". Para filtrar por situação, filtre no cliente ou use /cobranca/listar.

curl "https://api.ileva.com.br/cobranca/listar-associado-veiculo?inicio_paginacao=0&quantidade_por_pagina=100&cpf=00000000000" \
  -H "app_key: $ILEVA_APP_KEY" -H "Authorization: Bearer $TOKEN"

Resposta

{
  "total_encontrados": 13,
  "boletos": [{
    "cod_cobranca": 100001,
    "linha_digitavel": "75691.23453 00000.123455 67890.000176 1 16210000012359",
    "apresentar_boleto": 1,
    "valor_boleto": "123.59",
    "valor_pagamento": "0.00",
    "referencia": "2026-10",
    "dt_vencimento": "2026-11-05",
    "dt_pagamento": null,
    "dt_criacao": "2026-10-15",
    "situacao_boleto": "Aberto",
    "nosso_numero": "000001",
    "dt_vencimento_original": null,
    "url_boleto": "https://<conta>.ileva.com.br/api/associado/boleto/<hash>",
    "url_boleto_web": "https://<conta>.ileva.com.br/associado/cobranca/<hash>",
    "nome_associado": "NOME DO ASSOCIADO",
    "cpf": "00000000000",
    "telefone": "85900000000",
    "cod_associado": 1001,
    "situacao_associado": "ATIVO",
    "tipo_boleto": "Fechamento",
    "pix": "00020101021226950014br.gov.bcb.pix2573pix.sicoob.com.br/qr/payload/v2/cobv/<uuid>5204000053039865802BR5909PIXSICOOB6006CIDADE62070503***6304<CRC16>",
    "veiculos": [{
      "cod_veiculo": 2001,
      "placa": "ABC1D23",
      "chassi": "<chassi>",
      "ano_fabricacao": 2015,
      "ano_modelo": "2015-5",
      "dt_contrato": "2026-10-15",
      "modelo": "CG 150 START FLEXONE",
      "situacao_veiculo": "ATIVO",
      "marca": "Honda",
      "valor": "123.59"
    }]
  }]
}

Histórico

GET /cobranca/listar — listagem por situação. É o único que respeita situacao, por isso é o caminho do histórico de pagamento.

ParâmetroObrigatórioStatus
inicio_paginacaosim—
quantidade_por_paginasimAté 500.
cod_associado—funciona
cod_veiculo—funciona
situacao—funciona Aberto, Liquidado, Cancelado
placa—ignorado devolve a base completa
referencia, dt_vencimento, dt_vencimento_de/_ate, dt_vencimento_inicio/_fim, dt_inicio/dt_fim—ignorados

Não há filtro de data em nenhum endpoint de cobrança. Recorte por período (ex.: "boletos de outubro") é feito no consumidor, depois de filtrar por cod_associado ou cod_veiculo.

Alguns campos mudam de nome em relação ao endpoint principal: aqui é valor (não valor_boleto), situacao (não situacao_boleto) e associado (não nome_associado). placa, cod_veiculo e cod_boleto_veiculo vêm na raiz, sem o array veiculos. Normalize os dois formatos numa camada de modelo só.

Não existe a situação "Vencido". Boleto vencido é situacao = "Aberto" com dt_vencimento anterior a hoje — o cálculo do atraso é do consumidor. Valores fora da lista (Vencido, Baixado) devolvem total_encontrados: 0.

Cadastro

GET /associado/buscar aceita cod_associado ou cpf_cnpj (ambos validados).

curl "https://api.ileva.com.br/associado/buscar?cpf_cnpj=00000000000" \
  -H "app_key: $ILEVA_APP_KEY" -H "Authorization: Bearer $TOKEN"
{ "associado": {
  "nome": "NOME DO ASSOCIADO", "cpf": "00000000000", "tel_whatsapp": "85900000000",
  "tel_celular": null, "tel_comercial": null, "dt_nascimento": "1990-01-01",
  "email": "cliente@exemplo.com", "rg": "0000000", "orgao_expedidor_rg": "SSP CE",
  "cnh": "00000000000", "categoria_cnh": "AB", "dt_vencimento_cnh": null,
  "logradouro": "Rua Exemplo", "bairro": "Centro", "numero": "100", "complemento": ".",
  "cep": "60000-000", "sexo": "M", "cod_regional": 1, "regional": "Regional Exemplo",
  "cod_associado": 1001, "cidade": "Fortaleza", "estado": "Ceará", "uf": "CE",
  "dt_cadastro": "2026-10-15", "situacao": "ATIVO", "situacao_tipo": "ATIVO", "cod_situacao": 1,
  "cod_conta": null, "conta_descricao": null, "conta_beneficiario_ndoc": null,
  "veiculos": [{ "placa": "ABC1D23", "modelo": "CG 150 START FLEXONE", "cod_veiculo": 2001,
                 "situacao": "ATIVO", "situacao_tipo": "ATIVO", "cod_situacao": 1 }]
} }

Endpoints complementares

EndpointUso
GET /associado/listarPaginado, até 600/página. Total em total_encontrados.
GET /veiculo/listarPaginado, até 600/página.
GET /veiculo/buscar?cod_veiculo=Veículo individual.
GET /lead/buscar?cod_lead=Lead.

Código de barras

A API não devolve o código de barras (44 dígitos) — só a linha_digitavel (47). A conversão é determinística e foi validada contra um boleto real.

Layout da linha digitável

47 dígitos, depois de remover pontos e espaços:

PosiçãoConteúdo
1–3Banco (756 = Sicoob)
4Moeda (9)
5–9Campo livre (posições 20–24 do barcode)
10DV campo 1
11–20Campo livre (25–34)
21DV campo 2
22–31Campo livre (35–44)
32DV campo 3
33DV geral do código de barras
34–37Fator de vencimento
38–47Valor (centavos)

Montagem do barcode

barcode = d[0:4] + d[32] + d[33:47] + d[4:9] + d[10:20] + d[21:31]
          └banco+moeda  └DV  └fator+valor  └─── campo livre (25 díg.) ───┘
def linha_para_barcode(linha_digitavel: str) -> str:
    d = "".join(c for c in linha_digitavel if c.isdigit())   # 47 digitos
    return d[0:4] + d[32] + d[33:47] + d[4:9] + d[10:20] + d[21:31]

def dv_geral(barcode44: str) -> int:
    base = barcode44[:4] + barcode44[5:]        # tira o DV da posicao 5
    pesos, soma = [2,3,4,5,6,7,8,9], 0
    for i, c in enumerate(reversed(base)):
        soma += int(c) * pesos[i % 8]
    r = 11 - (soma % 11)
    return 1 if r in (0, 1, 10, 11) else r      # modulo 11, resto 0/1/10 -> DV 1

Exemplo verificado

linha  : 75691.23453 00000.123455 67890.000259 5 19250000012359
47 dig : 75691234530000012345567890000259519250000012359
barcode: 75695192500000123591234500000123456789000025   (44 digitos)
DV calculado = 5   |  DV na linha = 5                      ✓
valor no barcode = 123.59                                  ✓
fator 1925 -> 2027-09-05                                   ✓

Boleto fictício com dígitos verificadores válidos — mesmo algoritmo do teste contra o boleto real.

Fator de vencimento: vencimento = 29/05/2022 + fator dias. O fator reiniciou em 1000 em 22/02/2025. Com a base antiga (07/10/1997), o fator 1925 daria 2003 — errado.

PIX

O campo pix já vem pronto como payload EMV copia-e-cola (BR Code, Sicoob).

00020101021226950014br.gov.bcb.pix2573pix.sicoob.com.br/qr/payload/v2/cobv/<uuid>5204000053039865802BR5909PIXSICOOB6006CIDADE62070503***6304<CRC16>
cobvCobrança com vencimento: a string não carrega o valor — o PSP busca pela URL. Mostre o valor na tela a partir de valor_boleto.
QR CodeGerar no cliente, a partir da string. Não há endpoint de imagem.
nullVem null em boletos antigos, liquidados ou cancelados. Sempre tratar.

PDF e página do boleto

CampoResposta (validada via HEAD)
url_boleto200 · application/pdf · inline; filename=<hash>.pdf · ~600 KB · Access-Control-Allow-Origin: *
url_boleto_web200 · text/html; charset=utf-8 (portal do associado)

As duas são públicas, sem autenticação (hash na URL). url_boleto tem CORS liberado — dá para embutir ou baixar direto do app. Vêm null em boletos antigos.

Quem tem a URL abre o boleto. Trate como dado sensível: não logar, não indexar.

Dicionário de campos

Campo/listar/listar-associado-veiculoSignificado
cod_cobranca✓✓ID do boleto (chave)
cod_boleto_veiculo✓—ID do vínculo boleto↔veículo
valor / valor_boletovalorvalor_boletoValor do boleto (string decimal)
valor_pagamento✓✓Valor pago ("0.00" se em aberto)
situacao / situacao_boletosituacaosituacao_boletoAberto / Liquidado / Cancelado
referencia✓✓Competência AAAA-MM (pode ser null)
dt_vencimento✓✓Vencimento vigente
dt_vencimento_original✓✓Vencimento antes de prorrogação (null se não houve)
dt_pagamento✓✓null enquanto em aberto
dt_criacao—✓Emissão
linha_digitavel✓✓47 díg. formatados (null em boleto antigo)
pix✓✓BR Code copia-e-cola (null em boleto antigo)
nosso_numero✓✓Identificação bancária
tipo_boleto✓✓Fechamento, Adesão, Carência Plano Bateria, …
apresentar_boleto✓✓Flag 1/0 — exibir só quando 1
url_boleto / url_boleto_web✓✓PDF / página
associado / nome_associadoassociadonome_associadoNome
cpf, telefone, situacao_associado—✓Dados do cliente
placa, cod_veiculoraizem veiculos[]Veículo

Fluxos recomendados

Boletos em aberto

1. CPF do cliente (cadastro/login do app)
2. GET /cobranca/listar-associado-veiculo?inicio_paginacao=0&quantidade_por_pagina=100&cpf=<CPF>
3. filtrar no cliente: situacao_boleto == "Aberto" && apresentar_boleto == 1
4. ordenar por dt_vencimento asc; marcar vencido = dt_vencimento < hoje
5. por boleto exibir: valor_boleto, dt_vencimento, linha_digitavel (copiar),
   barcode44 (para o widget de código de barras), pix (copiar / QR), url_boleto (PDF)

Histórico de pagamentos

1. GET /associado/buscar?cpf_cnpj=<CPF>  ->  cod_associado
2. GET /cobranca/listar?inicio_paginacao=0&quantidade_por_pagina=500&cod_associado=<ID>&situacao=Liquidado
3. ordenar por dt_pagamento desc; exibir valor, valor_pagamento, dt_vencimento, dt_pagamento, referencia
   (desconto/acréscimo = valor_pagamento - valor)

Financeiro por veículo

1. GET /associado/buscar?cpf_cnpj=<CPF>  ->  veiculos[].cod_veiculo / placa
2. GET /cobranca/listar-associado-veiculo?inicio_paginacao=0&quantidade_por_pagina=100&placa=<PLACA>
   (ou GET /cobranca/listar?inicio_paginacao=0&quantidade_por_pagina=500&cod_veiculo=<ID>)

Limitações e pontos de atenção

Sem filtro de dataNenhum endpoint de cobrança filtra por data — paginar e cortar no consumidor.
placaIgnorado em /cobranca/listar; funciona em /listar-associado-veiculo.
situacaoIgnorado em /listar-associado-veiculo; funciona em /cobranca/listar.
Nomes de campoMudam entre os dois endpoints (valor↔valor_boleto, situacao↔situacao_boleto, associado↔nome_associado) — normalizar numa camada só.
TokenPode invalidar a qualquer momento — retry em 401 com token novo.
Código de barrasNão vem na API — derivar da linha digitável.
nullEm pix, linha_digitavel e url_boleto para boletos antigos ou cancelados.
"Vencido"Não existe — calcular por dt_vencimento.
total_encontradosTotal após filtros; usar para paginar.
URLs de boletoPúblicas por hash — dado sensível, não logar nem indexar.
PaginaçãoLimite varia: 500 em cobrança, 600 em associado/listar e veiculo/listar, 300 em alteracoes-situacao.