Skip to content
Idioma: Português

API para programadores

Formato de erro e códigos de erro da API

Atualizado a 1 de novembro de 2026 5 min de leitura

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

Exemplo: 422 validation_failed
{
  "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

HTTPerrorSignificadoO que fazer
400invalid_jsonO corpo não é JSON válidoVerificar o JSON
400bad_requestContent-Type errado ou pedido mal formadoDefinir Content-Type: application/json
401missing_bearer_tokenNenhum token no cabeçalho AuthorizationDefinir o cabeçalho Authorization: Bearer …
401invalid_tokenToken expirado ou inválido, ou chave eliminadaObter um novo token; se não resolver, verificar a chave
401invalid_api_keyID ou segredo da chave errado na troca de tokenVerificar as credenciais
402plan_limit_reachedLimite do plano atingido, por exemplo nos links curtosFazer upgrade ou eliminar entradas
403insufficient_scopeFalta o scope ou o endpoint não está disponível para chaves de APICriar uma chave com o scope certo
403forbiddenSem permissão para esta açãoFazê-la no painel
403feature_not_availableFuncionalidade não incluída no planoVerificar o plano
403block_type_requires_planTipo de bloco só disponível num plano superiorEscolher outro tipo de bloco ou fazer upgrade
403template_lockedModelo premium não disponível no plano atualEscolher um modelo de GET /v1/templates/available
403workspace_suspended, workspace_read_only, workspace_grace_expiredEspaço de trabalho bloqueado ou só de leitura por causa de um pagamento em faltaRegularizar o pagamento no painel
404not_foundO recurso não existe ou não pertence ao seu espaço de trabalhoVerificar o ID
409conflictConflito geral com o estado atualRecarregar o estado, alterar os dados
409workspace_template_in_useO modelo do espaço de trabalho ainda é usado por páginas; o número está em details.countMudar as páginas para outro modelo e depois eliminá-lo
409handle_taken, slug_takenO handle ou o slug do link curto já está ocupadoEscolher outro valor
409form_in_use, page_not_private, page_not_published, never_publishedConflito com o estado: formulário ainda numa página, página não privada ou não publicada, nunca publicadaAlterar o estado e tentar novamente
409page_limit_reached, link_limit_reached, block_limit_reached, form_limit_reached, asset_limit_reached, asset_storage_limit_reached, workspace_template_limit_reachedLimite de quantidade ou de armazenamento do plano atingidoRemover entradas ou fazer upgrade
409draft_not_publishableO rascunho tem problemas; a lista está em details.issuesCorrigir os problemas e publicar novamente
413request_too_largeCorpo maior do que o permitido para este endpoint (64 KB, 1 MB ou 2 MB); o limite está em details.max_kbEnviar menos dados por pedido, veja Rate limits
413payload_too_largeFicheiro carregado com mais de 10 MBReduzir o ficheiro
422validation_failedDados inválidos ou campo desconhecido; pormenores em detailsCorrigir os campos conforme descrito em details
422handle_reserved, target_url_invalid, target_url_scheme, target_url_hostHandle reservado, ou URL de destino inválido ou não permitidoEscolher outro valor
422workspace_template_disabledO modelo do espaço de trabalho selecionado está desativadoAtivar o modelo em «Domínios e modelos» ou escolher outro
422template_css_external, template_section_invalidModelo do espaço de trabalho: o CSS carrega de servidores externos, ou uma secção {{#if}}/{{#unless}}/{{#each}} está mal colocadaRemover os endereços externos ou fechar a secção dentro da mesma tag ou do mesmo texto
422custom_css_externalO CSS personalizado carrega algo de servidores externosRemover os endereços externos do CSS
429rate_limited, api_key_lockedDemasiados pedidos, ou chave bloqueada após tentativas falhadasEsperar o tempo indicado em Retry-After ou details.retry_after_sec
500internal_errorErro inesperadoTentar mais tarde, anotar o request_id
503service_unavailableServiço temporariamente indisponívelTentar 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

Não encontrou o que procura?

Diga-nos de que precisa e a nossa equipa de suporte ajuda-o pessoalmente.

Contactar o suporte