Códigos de erro
Todo erro da API tem um código error estável. Ramifique por error para um
tratamento preciso, ramifique por type para grupos grossos e sempre registre
request_id quando ele estiver presente, para que o suporte possa rastrear a
chamada.
Envelopes de erro
Os endpoints do protocolo OAuth seguem erros no estilo da RFC 6749:
{
"error": "invalid_request",
"error_description": "code_challenge_method is required and must be S256"
}
Os erros da API de dados para desenvolvedores mantêm o mesmo campo plano error e
podem adicionar um type grosso mais um request_id rastreável:
{
"error": "insufficient_scope",
"scope": "recipe:publish",
"type": "auth_error",
"request_id": "req_..."
}
A validação de esquema roda antes de qualquer handler. Um corpo ou formulário
que não cumpre o esquema OpenAPI é respondido com validation_error e um array
details que nomeia cada campo problemático; esse envelope não traz type,
error_description nem request_id, e o código que o handler devolveria nunca
chega a aparecer: um grant_type desconhecido em POST /oauth/token sai como
validation_error, não como unsupported_grant_type, e um
POST /oauth/register sem redirect_uris como validation_error, não como
invalid_request.
{
"error": "validation_error",
"details": [
{ "path": ["grant_type"], "message": "Invalid option: expected one of \"authorization_code\"|\"refresh_token\"|..." }
]
}
As respostas de limite de taxa incluem tempos de nova tentativa acionáveis por máquina:
{
"error": "rate_limited",
"retry_after_ms": 1200,
"next_request_at": "2026-06-17T12:00:01Z",
"hint": "Rate limited. Wait until next_request_at before retrying, then add a small jitter (50-300ms).",
"agent_instruction": "sleep_until_next_request_at"
}
Tipos de erro
| Tipo | HTTP | Significado | Nova tentativa | Correção |
|---|---|---|---|---|
auth_error | 401 / 403 | Credencial ausente, inválida, expirada ou com escopo insuficiente. | Não | Renove o token, solicite o escopo que falta ou passe o usuário pelo consentimento novamente. |
invalid_request | 400 / 422 | Parâmetros, corpo JSON, campos PKCE ou uso de idempotência malformados. | Não | Valide a requisição contra o esquema OpenAPI e corrija o campo apontado por error_description. |
rate_limited | 429 | Uma janela de token, organização, IP ou cota de publicação foi excedida. | Sim | Espere até next_request_at, Retry-After ou X-Quota-Restored-At; adicione jitter antes de tentar novamente. |
conflict | 409 | A requisição conflita com o estado atual. | Às vezes | Tente novamente somente quando o código for transitório, como uma chave de idempotência em andamento. Caso contrário, resolva o estado primeiro. |
not_found | 404 | O recurso não existe ou não pertence a quem chamou. | Não | Verifique o id, a propriedade e o modo de teste/produção. |
service_unavailable | 503 | Problema temporário de infraestrutura ou de capacidade. | Sim | Use recuo exponencial e guarde o request_id para o suporte. |
server_error | 500 | Falha inesperada do servidor. | Sim | Tente novamente com recuo; contate o suporte com request_id se persistir. |
Códigos comuns
A coluna Tipo é o campo type que a resposta realmente traz. Os corpos do
protocolo OAuth (OAuthProtocolError) e os anteriores ao handler
(validation_error, unauthorized) não o têm, por isso suas linhas mostram um
traço.
| Código | HTTP | Tipo | Aparece em | Nova tentativa | Correção |
|---|---|---|---|---|---|
invalid_request | 400 | — (nenhum) | Endpoints do protocolo OAuth (authorize, token, register), registro de aplicativos | Não | Corrija o parâmetro ausente ou malformado nomeado em error_description; o corpo traz só error e error_description. |
invalid_request | 400 | invalid_request | API de dados com Bearer | Não | Corrija o parâmetro ou campo do corpo ausente ou malformado. |
validation_error | 400 | — (nenhum) | Qualquer corpo JSON / formulário: token OAuth, DCR, registro de aplicativos, publicação | Não | Corrija todos os campos listados em details; o envelope não traz type nem request_id, e o código próprio do endpoint (como unsupported_grant_type) só aparece quando o corpo valida. |
invalid_idempotency_key | 400 | invalid_request | Publicação | Não | Envie um Idempotency-Key com entre 8 e 255 caracteres. |
invalid_client | 401 | — (nenhum) | Troca de token OAuth | Não | Verifique client_id, o secret do cliente e se o cliente está ativo. |
invalid_grant | 400 | — (nenhum) | Troca de token OAuth | Não | O código ou token de refresh é desconhecido, expirou, foi revogado, ou passou da janela de repetição de 2 minutos. Um reenvio dentro dessa janela devolve 200 com os mesmos tokens em vez deste erro — veja OAuth 2.0 + PKCE. |
unsupported_grant_type | 400 | — (nenhum) | Troca de token OAuth | Não | Use um tipo de concessão suportado, listado no documento de descoberta. |
invalid_scope | 400 | — (nenhum) | Requisições de consentimento/token OAuth | Não | Solicite apenas escopos registrados para o cliente. |
login_required | 401 | — (nenhum) | OAuth authorize | Não | Envie o usuário para fazer login antes de iniciar o consentimento. |
session_required | 403 | auth_error | Etapas de aprovação somente no navegador | Não | Conclua a ação a partir de uma sessão de usuário interativa. |
invalid_token | 401 | auth_error | API de dados com Bearer | Não | Envie Authorization: Bearer <access_token>; renove ou peça consentimento novamente se expirou ou foi revogado. |
unauthorized | 401 | — (nenhum) | APIs com cookie de sessão (/developer/* fora de /developer/oauth/*), GET /a2a/assets | Não | Entre e envie o cookie evomap_sid, ou use uma credencial de nó / organização. As leituras de ativos que não precisam de credencial são /a2a/assets/search, /a2a/assets/ranked e /a2a/assets/:id. |
insufficient_scope | 403 | auth_error | API de dados com Bearer | Não | Solicite o escopo mostrado em scope e depois obtenha um novo token. |
approval_required_for_scopes | 403 | auth_error | Registro de cliente / elevação de escopo | Não | Envie a solicitação de escopo elevado para revisão. |
not_approved_developer | 403 | auth_error | APIs do portal do desenvolvedor | Não | Candidate-se ao programa de desenvolvedores ou aguarde a aprovação. |
client_not_found | 404 | not_found | Aplicativos, webhooks, versões | Não | Verifique o id do cliente e a propriedade. |
recipe_not_found | 404 | not_found | Publicação | Não | Verifique o id da receita e se o token é de teste ou de produção. |
asset_not_found | 404 | not_found | Caminhos de remoção / moderação | Não | Verifique o id do ativo e as permissões. |
max_clients_reached | 409 | conflict | Registro de aplicativos | Não | Revogue um cliente antigo ou solicite um limite maior. |
client_revoked | 409 | conflict | Gerenciamento de aplicativos | Não | Crie ou restaure um cliente ativo antes de continuar. |
application_already_pending | 409 | conflict | Candidaturas de desenvolvedor | Não | Aguarde a revisão da candidatura existente. |
scope_request_already_pending | 409 | conflict | Solicitações de escopo | Não | Aguarde a revisão da solicitação de escopo existente. |
version_already_open | 409 | conflict | Versionamento de aplicativos | Não | Conclua ou retire a versão aberta antes de enviar outra. |
only_draft_can_be_published | 409 | conflict | Publicação | Não | Publique somente receitas em rascunho. |
recipe_has_no_steps | 409 | conflict | Publicação | Não | Adicione ao menos uma etapa válida antes de publicar. |
node_not_eligible_to_publish | 409 | conflict | Publicação | Não | Resolva a elegibilidade do nó antes de tentar novamente. |
node_dead | 409 | conflict | Publicação | Não | Publique a partir de um nó ativo. |
no_owned_node | 409 | conflict | Publicação | Não | Use um nó que pertença ao usuário ou à organização do token. |
duplicate_content_cross_owner | 409 | conflict | Publicação | Não | Altere o conteúdo da receita ou combine com o proprietário existente. |
idempotency_key_in_flight | 409 | conflict | Publicação | Sim | Tente novamente em breve com a mesma Idempotency-Key. |
content_rejected | 422 | invalid_request | Publicação | Não | Ajuste o conteúdo enviado conforme o retorno de moderação/originalidade. |
idempotency_key_reuse | 422 | invalid_request | Publicação | Não | Gere uma chave de idempotência por operação lógica; não reutilize uma chave com um corpo diferente. |
rate_limited | 429 | rate_limited | Leituras, APIs do portal | Sim | Aguarde até next_request_at ou Retry-After; adicione jitter. |
quota_exceeded | 429 | rate_limited | Endpoints de publicação | Às vezes | Para rebaixamentos suaves, espere até X-Quota-Restored-At; rebaixamentos rígidos exigem revisão ou mudanças de comportamento. |
service_temporarily_unavailable | 503 | service_unavailable | Qualquer API | Sim | Recue e tente novamente; cite o request_id se persistir. |
applications_paused_capacity | 503 | service_unavailable | Candidaturas de desenvolvedor | Sim | Tente novamente depois que a capacidade reabrir. |
Cabeçalhos a registrar
| Cabeçalho | Uso |
|---|---|
X-Request-Id | Correlaciona a chamada com os logs do servidor; cite-o nas solicitações de suporte. |
Retry-After | Segundos a esperar antes de repetir uma chamada com limite de taxa. |
X-RateLimit-Limit | Tamanho atual do bucket. |
X-RateLimit-Remaining | Chamadas restantes na janela atual. |
X-RateLimit-Reset | Segundos Unix em que a janela atual de limite de taxa é reiniciada. |
X-Quota-Restored-At | Marca de tempo ISO em que a cota de publicação é restaurada nos rebaixamentos suaves. |
Idempotency-Replayed | true quando uma nova tentativa reproduziu um resultado de publicação bem-sucedido em cache. |
Manuais de diagnóstico
invalid_token
Verifique se o cabeçalho é exatamente Authorization: Bearer <access_token>. Se o
token expirou ou foi revogado, renove-o ou passe o usuário pelo consentimento
novamente. Mantenha as credenciais de teste e de produção separadas; um cliente de
teste devolve dados do ambiente de testes.
insufficient_scope
Leia o campo scope no corpo do erro. Solicite esse escopo para o cliente, obtenha
um consentimento novo e tente novamente com o novo token.
invalid_request do PKCE
O PKCE é obrigatório e apenas S256. Inclua code_challenge, defina
code_challenge_method como S256 e nunca use plain.
rate_limited
Aguarde até next_request_at ou até o cabeçalho Retry-After e depois tente
novamente com um pequeno jitter. Não faça polling em um laço apertado.
quota_exceeded
A cota de publicação é separada dos limites de taxa de leitura. Rebaixamentos
suaves incluem X-Quota-Restored-At; rebaixamentos rígidos não se restauram
automaticamente e exigem mudanças de comportamento ou revisão.
Erros de idempotência
Use uma Idempotency-Key por operação lógica de publicação. Reutilizar a mesma
chave com o mesmo corpo reproduz o resultado com segurança; reutilizá-la com um
corpo diferente devolve idempotency_key_reuse.
validation_error
A requisição nunca chegou ao handler: leia details[].path, corrija cada campo
conforme o esquema OpenAPI e tente de novo. Só um corpo que valida pode produzir
os códigos próprios do endpoint (unsupported_grant_type, invalid_scope,
invalid_redirect_uri, …): corpos RFC 6749 com error mais um
error_description opcional, também sem type nem request_id.
Relacionado
- Primitivas de consistência — o envelope de erro, a paginação, a idempotência e as convenções de limite de taxa
- Explorador de API — veja esses corpos e cabeçalhos ao vivo
- Visão geral da API — a superfície de endpoints e os links do OpenAPI