API & MCP

Erros

Erros têm sempre o mesmo formato: ok: false, um error estável (para o seu código), uma message humana, o docs e o requestId. Trate pelo error, nunca pela mensagem.

Um cliente acima do raio de atendimento de uma conta que pede contato fora dele (o exemplo de Cotação):

{
  "ok": false,
  "error": "fora-da-area",
  "message": "O cliente está acima do raio de atendimento do perfil, e a conta pede contato em vez de preço fora do raio. A resposta traz distanciaKm, raioKm e destino.",
  "docs": "https://app.ionluz.com.br/docs/api",
  "requestId": "req_9f2c1a7b3d4e5f6a90",
  "kwp": 5.91,
  "fase": "bi",
  "distanciaKm": 103,
  "raioKm": 50,
  "destino": "Campinas"
}
errorHTTPO que fazer
chave-invalida401Confira o cabeçalho Authorization: Bearer ilz_...; a chave pode ter sido revogada ou trocada, ou a conta está suspensa.
plano-sem-api403Chave válida, mas o plano da conta não inclui API. A API pública é do plano Máquina, R$ 97 por mês. Assine em /plano.
chave-de-teste403Recurso que a chave de teste não alcança, como /v1/proposals e a ferramenta get_proposal. Use a chave viva do plano Máquina.
teto-teste429A chave de teste usou a cota do dia: 50 por dia na conta, somando as requisições REST e as chamadas de ferramenta do MCP; conectar e listar as ferramentas não gasta. A cota volta à meia-noite de Brasília. Sem Retry-After, porque a janela não é de segundos.
metodo-nao-permitido405Método HTTP errado (ex.: GET em /v1/quote, POST em /v1/coverage). A resposta traz dica com o método certo.
json400Corpo não é JSON válido. Verifique o Content-Type: application/json.
payload-grande413Corpo passou de 4 KB.
consumo400Sem consumoKwhMes e sem valorContaBrl, ou consumoKwhMes zero ou negativo sem o valor da conta junto.
consumo-fora-de-faixa400consumoKwhMes acima do plausível. Confira a unidade: o campo é kWh por mês.
valor-conta400valorContaBrl que não é um número maior que zero. É o valor total de uma conta de luz, em reais. Veja Pelo valor da conta de luz.
valor-conta-fora-de-faixa400O consumo estimado pelo valorContaBrl passa do plausível. Confira a unidade: o campo é o valor de uma conta, em reais.
valor-conta-na-taxa-minima422A conta não passa da taxa mínima da distribuidora para a ligação: não há consumo para a energia solar compensar. A resposta traz taxaMinimaKwh, taxaMinimaBrl, tarifaBrlKwh e fase. Diga isso ao cliente e confira a ligação.
fase-invalida422fases não reconhecida. Envie mono, bi ou tri (ou monofasico, bifasico e trifasico, com ou sem acento).
consentimento-obrigatorio400Gravação (não-preview) sem consent: true. Colete o consentimento do titular e reenvie.
contato-obrigatorio400O lead da entrada de leads veio sem telefone (com DDD) e sem e-mail. Confira o mapeamento dos campos na integração.
consentimento-invalido400Na entrada de leads, faltou o texto, a data ou a fonte do consentimento, ou a data não deu para ler. A resposta traz campos com o que faltou.
origem-invalida400origem fora de meta-formulario, make, zapier e outro. A resposta traz parametro e aceito; sem o campo, vale outro.
opcao-invalida400opcao fora de economica, recomendada e bateria, numa conta com o motor novo (vale mesmo com as opções desligadas). A resposta traz parametro e aceito. Nas contas sem o motor novo o campo é ignorado.
faixa-nao-atendida422A faixa foi marcada como "não atendo" na sua cobertura (a resposta traz motivo: "nao-atendo"), ou nenhum kit, nem o do catálogo padrão, atende esse porte e essa fase. Trate como pedido de contato; consulte /v1/coverage.
fora-da-area422O cliente está acima do raio de atendimento do seu perfil, e fora do raio a sua conta pede contato em vez de preço. A resposta traz distanciaKm, raioKm e destino. Grave o contato e responda você, ou, no perfil, escolha cotar e cobrar o deslocamento acima do raio.
sem-preco-configurado422A formação de preço da conta não gerou valor para esse sistema e a referência de mercado não pôde substituir. Revise em Formação de preço. A resposta traz kwp e fase.
teto-leads429A conta chegou ao limite de 50.000 propostas desta origem (a API e a página de captação contam separado). Vem sem Retry-After: não adianta repetir; fale com o suporte.
rate429Muitas requisições. Espere o Retry-After.
idempotencia422Idempotency-Key reutilizada com corpo diferente. Use uma chave nova por operação.
em-processamento409Outra requisição com a mesma Idempotency-Key ainda está processando. Repita em instantes.
proposta-nao-encontrada404Nenhuma proposta com este id nesta conta. Confira o id, ou liste em /v1/proposals.
parametro-invalido400Parâmetro de query fora do aceito (limit, origem). A resposta traz parametro e aceito com os valores válidos.
interno500Erro nosso. Repita; se persistir, escreva para suporte@ionluz.com.br com o requestId.

Campos que vêm junto do erro

CampoEm quais erros
kwp, fasefaixa-nao-atendida, fora-da-area, sem-preco-configurado
motivo: "nao-atendo"faixa-nao-atendida, quando a faixa foi marcada "não atendo"
distanciaKm, raioKm, destinofora-da-area
parametro, aceitoparametro-invalido, opcao-invalida, origem-invalida
camposconsentimento-invalido: o que faltou do consentimento (texto, data, fonte)
taxaMinimaKwh, taxaMinimaBrl, tarifaBrlKwh, fasevalor-conta-na-taxa-minima
dicametodo-nao-permitido

Os links são públicos e não pedem chave. O navegador recebe uma página explicando o problema; os outros clientes recebem { "ok": false, "error": "<código>" }.

SituaçãoResposta do pdfUrl
Token do link alterado403 token
Proposta que não existe404 nao-encontrada
Conta suspensa403 conta-suspensa
Muitas aberturas seguidas do mesmo PDF429 rate, com Retry-After
Fila de geração de PDF cheia503 pdf-ocupado, com Retry-After
Falha ao gerar o PDF500 pdf: tente de novo em instantes
Motor novo: "eu aprovo antes" pendente409 em-confirmacao (o propostaUrl abre e mostra que o valor está em confirmação)
Motor novo: publicação só com o pedido409 preco-nao-publicado
Motor novo: proposta recusada pela empresa409 proposta-encerrada

Erros do MCP (códigos JSON-RPC e o resultado com isError): veja MCP, para agentes de IA. A documentação de cada erro também está em https://app.ionluz.com.br/api/v1/openapi.json, com um exemplo por código.

API v1 · ionluz, propostas solares honestas. Dúvidas? Cite o requestId ao escrever para suporte@ionluz.com.br.
Erros · API ionluz