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.
https://api.ileva.com.brPOST /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âmetro | Obrigatório | Observação |
|---|---|---|
inicio_paginacao | sim | Offset. Sem ele: 400 "Por favor informe o inicio da paginação". |
quantidade_por_pagina | sim | Até 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âmetro | Obrigatório | Status |
|---|---|---|
inicio_paginacao | sim | — |
quantidade_por_pagina | sim | Até 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
| Endpoint | Uso |
|---|---|
GET /associado/listar | Paginado, até 600/página. Total em total_encontrados. |
GET /veiculo/listar | Paginado, 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ção | Conteúdo |
|---|---|
| 1–3 | Banco (756 = Sicoob) |
| 4 | Moeda (9) |
| 5–9 | Campo livre (posições 20–24 do barcode) |
| 10 | DV campo 1 |
| 11–20 | Campo livre (25–34) |
| 21 | DV campo 2 |
| 22–31 | Campo livre (35–44) |
| 32 | DV campo 3 |
| 33 | DV geral do código de barras |
| 34–37 | Fator de vencimento |
| 38–47 | Valor (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>
valor_boleto.null em boletos antigos, liquidados ou cancelados. Sempre tratar.PDF e página do boleto
| Campo | Resposta (validada via HEAD) |
|---|---|
url_boleto | 200 · application/pdf · inline; filename=<hash>.pdf · ~600 KB · Access-Control-Allow-Origin: * |
url_boleto_web | 200 · 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-veiculo | Significado |
|---|---|---|---|
cod_cobranca | ✓ | ✓ | ID do boleto (chave) |
cod_boleto_veiculo | ✓ | — | ID do vínculo boleto↔veículo |
valor / valor_boleto | valor | valor_boleto | Valor do boleto (string decimal) |
valor_pagamento | ✓ | ✓ | Valor pago ("0.00" se em aberto) |
situacao / situacao_boleto | situacao | situacao_boleto | Aberto / 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_associado | associado | nome_associado | Nome |
cpf, telefone, situacao_associado | — | ✓ | Dados do cliente |
placa, cod_veiculo | raiz | em 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
/cobranca/listar; funciona em /listar-associado-veiculo./listar-associado-veiculo; funciona em /cobranca/listar.valor↔valor_boleto, situacao↔situacao_boleto, associado↔nome_associado) — normalizar numa camada só.401 com token novo.pix, linha_digitavel e url_boleto para boletos antigos ou cancelados.dt_vencimento.associado/listar e veiculo/listar, 300 em alteracoes-situacao.