Pular para o conteúdo

Erros

Toda resposta de erro da Ligga API segue a RFC 7807, Problem Details for HTTP APIs: Content-Type: application/problem+json e um corpo com os mesmos campos, qualquer que seja o endpoint. Esta página descreve esse corpo e lista o catálogo inteiro de erros.

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json
X-Request-Id: req_9f2c1a7b4d8e4f0a91c3b5d7e2f40a68
{
"type": "https://api.ligga.app/errors/validation",
"title": "Validation failed",
"status": 422,
"detail": "Request body failed schema validation",
"instance": "/v1/customers",
"request_id": "req_9f2c1a7b4d8e4f0a91c3b5d7e2f40a68",
"errors": [
{ "field": "email", "code": "invalid_email", "message": "Formato de e-mail inválido" },
{ "field": "phone", "code": "required_when_email_null", "message": "Telefone obrigatório quando o e-mail não é informado" }
]
}
CampoPresençaDescrição
typesempreURL que identifica o erro. É por ela que você decide o que fazer
titlesempreRótulo curto em inglês, para leitura humana
statussempreO mesmo código HTTP da resposta
request_idsempreIdentificador da requisição nos registros da Ligga
detailquando aplicávelFrase que explica o caso concreto
instancequando aplicávelCaminho que produziu o erro
errorsem validationLista de campos recusados, um item por campo

O valor de type é a URL https://api.ligga.app/errors/ seguida do código da tabela abaixo. São identificadores estáveis: mudam de significado nunca, e não precisam abrir uma página no navegador. Decida por type, nunca por title, que é texto e pode ser reescrito.

request_id repete o valor do cabeçalho X-Request-Id, que acompanha toda resposta da API, com erro ou sem. É esse valor que o suporte da Ligga pede para investigar um caso. Registre-o junto com as suas próprias falhas; sem ele, a única forma de localizar a requisição é adivinhar por horário.

Se você já tem um identificador de correlação, pode enviá-lo em X-Request-Id na requisição: até 128 caracteres entre letras, números, _ e - são reaproveitados na resposta e nos registros.

Estes são todos os erros que a API produz. O código na coluna type é o sufixo da URL: insufficient_scope corresponde a https://api.ligga.app/errors/insufficient_scope.

HTTPtypeQuando aconteceO que fazer
401invalid_tokenO cabeçalho Authorization está ausente ou malformado, ou a chave não existeEnvie Authorization: Bearer $LIGGA_API_KEY e confira o valor da chave
401token_revokedA chave foi revogadaPeça uma chave nova ao time da Ligga e substitua a antiga
401token_expiredA chave passou da data de expiraçãoPeça uma chave nova ao time da Ligga
403insufficient_scopeA chave não carrega o escopo da operação, ou o plano libera apenas leituraConfira scopes em GET /v1/me e peça o escopo que falta
403api_disabledA conta ainda não teve a API habilitadaFale com o time da Ligga para habilitar a API na conta
403module_not_enabledO recurso depende de um módulo que não está no contratoConfira modules em GET /v1/me e contrate o módulo
403ip_not_allowedA chave restringe IPs e a requisição veio de fora da listaChame de um IP da lista, ou peça o ajuste da lista
404not_foundO registro não existe ou pertence a outra contaConfira o {id} do caminho; não repita a chamada
409idempotency_conflictA mesma Idempotency-Key já foi usada com outra requisiçãoGere uma chave nova. Ver Idempotência
422validationCorpo, filtro, ordenação ou cursor fora do contratoLeia errors e detail, corrija a requisição; repetir sem mudar dá o mesmo erro
429rate-limit-exceededUma das janelas de limite estourouAguarde o Retry-After. Ver Limites de requisições
500internal_errorFalha inesperada do lado da LiggaTente de novo com espera crescente; se persistir, envie o request_id ao suporte
503service_unavailableUma dependência da API está indisponívelTente de novo com espera crescente

O 422 é o único que traz errors. Cada item aponta um campo e o motivo da recusa:

Campo do itemDescrição
fieldNome do campo recusado, como aparece no corpo da requisição
codeMotivo em forma de identificador, estável para o seu código
messageFrase em português, pronta para mostrar a quem preencheu o formulário

Quando o 422 vem de um parâmetro de query, como um cursor corrompido, um campo de ordenação desconhecido ou um operador de filtro inexistente, não há errors: o parâmetro recusado aparece em detail.

Erros internos passam por sanitização antes de virar resposta. A API não expõe:

  • mensagens brutas do banco, código de estado SQL ou nome de restrição;
  • pilha de chamadas;
  • identificadores de registros que pertencem a outra conta.

Quando detail vem genérico, o detalhe real ficou nos registros da Ligga, indexado pelo request_id.

  • Decida por type. title e detail são texto e podem mudar sem aviso.
  • Não repita 4xx sem mudar a requisição: o resultado será o mesmo. As exceções são 429, que pede espera, e 409, que pede uma chave nova.
  • Repita 5xx com espera crescente entre as tentativas, e um teto de tentativas.
  • Em 429, respeite Retry-After em vez de escolher o próprio intervalo.
  • Em validation, mostre errors[*].message a quem preencheu o formulário; o texto já vem em português.
  • Registre request_id em toda falha. É o que torna um chamado de suporte respondível.