Como estão estruturadas as respostas de erro da API do LinkHarbor, o que significam os códigos de erro principais e como o seu código deve reagir.
Todas as respostas de erro da API têm o mesmo formato. O seu código deve basear-se no código de erro do campo error e não no texto de message – o código mantém-se estável, enquanto o texto pode mudar e é traduzido para o idioma da conta.
Estrutura de uma resposta de erro
{
"error": "validation_failed",
"message": "Some of the information provided is invalid. Please check and try again.",
"details": [
{ "field": "title", "reason": "minLength", "message": "…" }
],
"request_id": "6b1f0c2e-…"
} - error
- Código legível por máquina, por exemplo not_found. Na maioria dos erros está também no cabeçalho X-Error-Code – mas baseie-se no campo do corpo.
- message
- Descrição legível por pessoas no idioma da conta: com uma chave de API, o do proprietário do espaço de trabalho; com uma app ligada, o da pessoa que a ligou. Sem um token válido – por exemplo, no 401 da verificação do token –, o idioma segue Accept-Language; caso contrário, é inglês. O cabeçalho Content-Language indica o idioma.
- details
- Só existe quando há mais a dizer. Em 422 da validação de dados, é uma lista com field, reason e message para cada problema; em 422 da lógica de negócio e em todos os outros erros, é um objeto, por exemplo com reason, retry_after_sec ou uma lista de issues. Quando um tamanho é excedido, contém field, reason e limit, e em 413 request_too_large contém max_bytes e max_kb. Por isso, verifique se details é uma lista.
- request_id
- O ID do pedido. Está também no cabeçalho X-Request-Id. Indique-o quando contactar o suporte.
Exceções: a resposta 429 rate_limited tem o campo retry_after_sec em vez de details; em 429 e em 403 insufficient_scope, request_id não aparece no corpo. O 401 da verificação do token e o 422 da verificação do esquema não têm cabeçalho X-Error-Code; na verificação do esquema, só o message de nível superior é traduzido, os textos em details ficam em inglês. O cabeçalho X-Request-Id está sempre definido.
Os códigos mais importantes
| HTTP | error | Significado | O que fazer |
|---|---|---|---|
| 400 | invalid_json | O corpo não é JSON válido | Verificar o JSON |
| 400 | bad_request | Content-Type errado ou pedido mal formado | Definir Content-Type: application/json |
| 401 | missing_bearer_token | Nenhum token no cabeçalho Authorization | Definir o cabeçalho Authorization: Bearer … |
| 401 | invalid_token | Token expirado ou inválido, ou chave eliminada | Obter um novo token; se não resolver, verificar a chave |
| 401 | invalid_api_key | ID ou segredo da chave errado na troca de token | Verificar as credenciais |
| 402 | plan_limit_reached | Limite do plano atingido, por exemplo nos links curtos | Fazer upgrade ou eliminar entradas |
| 403 | insufficient_scope | Falta o scope ou o endpoint não está disponível para chaves de API | Criar uma chave com o scope certo |
| 403 | forbidden | Sem permissão para esta ação | Fazê-la no painel |
| 403 | feature_not_available | Funcionalidade não incluída no plano | Verificar o plano |
| 403 | block_type_requires_plan | Tipo de bloco só disponível num plano superior | Escolher outro tipo de bloco ou fazer upgrade |
| 403 | template_locked | Modelo premium não disponível no plano atual | Escolher um modelo de GET /v1/templates/available |
| 403 | workspace_suspended, workspace_read_only, workspace_grace_expired | Espaço de trabalho bloqueado ou só de leitura por causa de um pagamento em falta | Regularizar o pagamento no painel |
| 404 | not_found | O recurso não existe ou não pertence ao seu espaço de trabalho | Verificar o ID |
| 409 | conflict | Conflito geral com o estado atual | Recarregar o estado, alterar os dados |
| 409 | workspace_template_in_use | O modelo do espaço de trabalho ainda é usado por páginas; o número está em details.count | Mudar as páginas para outro modelo e depois eliminá-lo |
| 409 | handle_taken, slug_taken | O handle ou o slug do link curto já está ocupado | Escolher outro valor |
| 409 | form_in_use, page_not_private, page_not_published, never_published | Conflito com o estado: formulário ainda numa página, página não privada ou não publicada, nunca publicada | Alterar o estado e tentar novamente |
| 409 | page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reached | Limite de quantidade ou de armazenamento do plano atingido | Remover entradas ou fazer upgrade |
| 409 | draft_not_publishable | O rascunho tem problemas; a lista está em details.issues | Corrigir os problemas e publicar novamente |
| 413 | request_too_large | Corpo maior do que o permitido para este endpoint (64 KB, 1 MB ou 2 MB); o limite está em details.max_kb | Enviar menos dados por pedido, veja Rate limits |
| 413 | payload_too_large | Ficheiro carregado com mais de 10 MB | Reduzir o ficheiro |
| 422 | validation_failed | Dados inválidos ou campo desconhecido; pormenores em details | Corrigir os campos conforme descrito em details |
| 422 | handle_reserved, target_url_invalid, target_url_scheme, target_url_host | Handle reservado, ou URL de destino inválido ou não permitido | Escolher outro valor |
| 422 | workspace_template_disabled | O modelo do espaço de trabalho selecionado está desativado | Ativar o modelo em «Domínios e modelos» ou escolher outro |
| 422 | template_css_external, template_section_invalid | Modelo do espaço de trabalho: o CSS carrega de servidores externos, ou uma secção {{#if}}/{{#unless}}/{{#each}} está mal colocada | Remover os endereços externos ou fechar a secção dentro da mesma tag ou do mesmo texto |
| 422 | custom_css_external | O CSS personalizado carrega algo de servidores externos | Remover os endereços externos do CSS |
| 429 | rate_limited, api_key_locked | Demasiados pedidos, ou chave bloqueada após tentativas falhadas | Esperar o tempo indicado em Retry-After ou details.retry_after_sec |
| 500 | internal_error | Erro inesperado | Tentar mais tarde, anotar o request_id |
| 503 | service_unavailable | Serviço temporariamente indisponível | Tentar novamente após uma pausa |
Ler erros de dados
Com 422 validation_failed, details lista cada problema em separado: field é o caminho do campo (com barras para objetos aninhados, por exemplo theme_config/button_style), reason é a regra violada, como required, minLength, maxLength, enum ou additionalProperties. Com additionalProperties, message indica quais os campos desconhecidos – muitas vezes trata-se de um erro de escrita no nome do campo.
Tratamento recomendado no seu código
- 400, 413 e 422: não repetir, corrigir antes o pedido
- 401 invalid_token: obter um novo token uma vez e repetir
- 403: não repetir; verificar o scope, o plano ou quem tem permissão para isto
- 404: verificar o ID; depois de uma eliminação, isto é normal
- 409: recarregar o estado e decidir se a ação ainda é necessária
- 429: esperar o tempo indicado em Retry-After e depois repetir – veja Rate limits
- 500 e 503: repetir algumas vezes com pausas crescentes
Também lhe pode ser útil
Não encontrou o que procura?
Diga-nos de que precisa e a nossa equipa de suporte ajuda-o pessoalmente.