Saltar al contenido principal

Erros e diagnóstico

Existem duas famílias de erro, em dois lugares diferentes:

  • Administração (a API que a Console usa): envelope com code estável, reason curto e message humana.
  • Tráfego (a API publicada): status HTTP do gateway ou do seu backend; o corpo pode vir do gateway, do componente de autenticação ou do seu próprio serviço.

Envelope de erro da administração​

{
"error": {
"code": "route_conflict",
"reason": "duplicate_path_and_method",
"message": "Já existe rota com o mesmo caminho normalizado e método.",
"retryable": false,
"request_id": "0192f3a4-4444-7000-8000-000000000004",
"correlation_id": "0192f3a4-4444-7000-8000-000000000004",
"details": {"conflicting_route_id": "0192f3a4-5555-7000-8000-000000000005"}
}
}
  • code é o contrato (nunca muda); message pode melhorar; reason é o detalhe curto e estável.
  • retryable: true aparece em erros 5xx, em idempotency_key_in_progress e em too_many_requests.
  • Nenhum código carrega detalhe criptográfico: falha de credencial vira unauthorized com razão curta, e o motivo técnico fica só no log.

Código, causa e ação​

codeHTTPCausaAção
not_found404recurso inexistente ou de outra organizaçãoconfira o id; se for de outra organização, o 404 é intencional
unauthorized401credencial ausente, expirada, assinatura inválida, iss/aud erradosrenove o token na Console; confira o emissor configurado
scope_required403o token não tem a permissão da operaçãopeça a permissão correspondente
validation_error400corpo, caminho ou parâmetro inválidoleia o reason e corrija o valor
backend_not_allowed400destino recusado pela política (IP literal, faixa privada, sufixo interno, timeout de DNS, mixed_destinations)use host público que resolva só para IP público
cors_insecure400origem http://, com caminho, com credencial, ou * com allow_credentialsuse https://host[:porta]
invalid_cursor400cursor de paginação adulterado ou de outra consultarefaça a listagem do começo
method_not_allowed405método HTTP não suportado no recursoconfira o método
route_conflict409já existe rota com o mesmo caminho normalizado e métodorenomeie o caminho ou remova a rota antiga
api_published409tentou excluir API publicada ou ativadesative antes de excluir
tenant_suspended409organização suspensa: escrita bloqueadaregularize a organização com o time comercial ou de suporte
operation_in_progress409já existe operação não terminal para a APIaguarde e repita depois
idempotency_key_in_progress409requisição com a mesma Idempotency-Key ainda em execuçãoaguarde e repita a mesma requisição
conflict409conflito de unicidade ou integridade (inclusive api_not_disabled)veja o reason
precondition_failed412If-Match diverge do draft_version atualreleia o recurso e refaça a alteração
idempotency_key_reused422mesma Idempotency-Key com corpo diferenteuse uma chave nova por operação
runtime_unavailable503o runtime não está disponível para aplicar mudançasrepita; se persistir, abra incidente
publish_validation_failed422a configuração não pode ser publicadaleia details.problems
revision_not_found404revisão não existe ou não é daquela APIliste as revisões da API
nothing_to_publish409o rascunho é igual à revisão publicada (ou reversão para a já ativa)nada a fazer
api_disabled409a operação exige API habilitadareative antes
api_not_published409a operação exige API publicada e ativa (hoje: a ferramenta de teste)publique antes
consumer_name_taken409já existe consumidor com esse nome na organizaçãoescolha outro nome
credential_limit_reached409limite de chaves ativas por consumidorrevogue uma antes de emitir outra
domain_taken409hostname já verificado por outra organizaçãouse outro nome ou fale com o dono atual
hostname_in_use_by_api409o hostname é o endereço padrão de uma APIuse outro nome
domain_not_allowed400FQDN inválido, com curinga ou sob zona reservadacorrija o nome
domain_verification_pending409a posse ainda não foi verificadapublique o TXT e verifique
invalid_openapi422documento que não é OpenAPI ou Swagger válidovalide o documento antes de enviar
payload_too_large413corpo acima de 1 MiBreduza o corpo
too_many_requests429validações ou imports simultâneos demais na organizaçãoaguarde e repita
internal_error500erro internorepita; se persistir, abra incidente com o request_id

Motivos (reason) que valem conhecer​

O code é estável e agrupa; o reason diz qual validação falhou.

codereasonSignificado
validation_errorwindow_too_largejanela de uso acima do teto da granularidade (3, 90 ou 400 dias)
invalid_windowfrom não é anterior a to
invalid_timestamp, invalid_sincetimestamp fora do ISO-8601
since_in_futuresince de logs no futuro
granularity_invalidnão é minute, hour ou day
priority_out_of_rangepriority fora de 0..1000
timeout_override_out_of_rangetimeout_override_ms fora de 1000..300000
rate_limit_override_incompleterate_limit_override sem limit ou sem window_seconds
timeout_override_conflict, rate_limit_override_conflictmandou o valor e o clear_* correspondente
invalid_openapiyaml_aliases_exceeded, yaml_depth_exceeded, yaml_expansion_exceeded, yaml_recursive_aliasdocumento YAML hostil
parse_timeouto parse passou do prazo
too_many_requestsopenapi_parser_busyimports simultâneos demais
backend_validation_busyvalidações de destino com DNS simultâneas demais
api_test_rate_limitedferramenta de teste: 30 chamadas por minuto por organização
conflictcertificate_in_usecertificado vivo do mesmo hostname pertence a outro sujeito
api_not_disabledreativação numa API que não está desativada
not_foundcredential_not_foundcredential_id da ferramenta de teste não existe, não está ativo ou expirou

Tráfego: erros do gateway​

StatusCorpo típicoCausaAção
401corpo do componente de chave ou {"error":"invalid_token"}chave ausente, inválida ou revogada; chave no cabeçalho que a política não escolheu; token inválidoconfira x-api-key ou Ocp-Apim-Subscription-Key; no modo JWT, confira iss, aud, exp e nbf
403vazioconsumidor não autorizado naquela APIautorize o consumidor na API
403{"error":"insufficient_scope"}token sem os escopos exigidosemita um token com o escopo
403{"error":"api_suspended"}organização suspensacontate o suporte
404{"error":"not_found"}host desconhecido ou rota inexistente no gatewayconfira o endereço e o caminho publicados
429mensagem rate_limitedlimite de taxa excedidoreduza a taxa ou peça revisão do limite
413—corpo maior que o limite da APIajuste o limite ou reduza o corpo
502, 503, 504—o backend não respondeu, respondeu inválido ou estourou o tempoverifique o backend e os timeouts
408—o cliente demorou a enviar a requisiçãoajuste o cliente
falha de TLS—SNI desconhecido (não há certificado padrão)use um endereço cadastrado e ativo

Diagnóstico rápido por sintoma​

SintomaPrimeiro suspeitoComo confirmar
"a API não responde"não foi publicada, ou o endereço não aponta para o gatewaystatus da API; GET /__nn/ping
"responde 404 em tudo"o Host ou SNI não é um endereço da APIconfira default_hostname e os domínios ACTIVE
"responde 401 e minha chave está certa"consumidor suspenso, chave revogada, ou chave na URLliste as credenciais e confira o cabeçalho
"responde 403"falta autorização na API (não é erro de chave)liste os consumidores autorizados na API
"publiquei e nada mudou"has_unpublished_changes = false (nada a publicar) ou operação FAILEDoperações da API
"meu domínio está em ERROR"TXT ausente por 7 dias, ou certificado a menos de 7 dias de expirarstate, last_error e o roteamento
"erro 409 domain_taken com um domínio que é meu"outro cadastro (talvez antigo, seu) ainda não removidoverifique domínios antigos e remova
"a latência subiu e o limite parou de valer"armazenamento de contadores foraver Políticas de tráfego e limites

Como pedir ajuda com dados úteis​

Envie: o X-Request-Id da resposta (ou o correlation_id), o horário com fuso, o endpoint, o code e o reason e — se for tráfego — o endereço da API, o método, o caminho e o status. Sem isso, a investigação começa do zero.

Próximos passos​