Tratamento de Erros
Formato de erros, códigos de status e soluções para a API de integração.
Quando uma requisição à API de integração falha, a resposta inclui um corpo JSON com informações sobre o erro.
Formato de erro
{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid or revoked API key"
}| Campo | Tipo | Descrição |
|---|---|---|
statusCode | number | Código de status HTTP |
error | string | Nome do erro |
message | string | Descrição detalhada do problema |
code | string | Presente apenas nos erros sobre os quais um cliente precisa ramificar. É um valor estável em UPPER_SNAKE: ramifique por code, nunca pelo texto de message, que pode mudar. Hoje o único é DEFAULT_ROOT_CONFIRMATION_REQUIRED (veja Publicar Config). Não é a coluna Código da tabela abaixo, que é o nome do erro HTTP |
Códigos de erro
| Status | Código | Descrição | Solução |
|---|---|---|---|
401 | Unauthorized | Chave de API inválida, revogada ou expirada, ou seu dono está inativo | Verifique se a chave foi copiada exatamente e continua ativa em Configurações → Chaves de API; se foi revogada ou expirou, crie uma nova |
403 | Forbidden | A chave não tem a permissão exigida, ou uma chave de projeto indica outro projeto em x-project-id | Confirme que a chave tem as permissões necessárias: activity:view para consultas, activity-result:submit para enviar resultados, commerce:batch-upsert / operator:batch-upsert / route:batch-upsert para os upserts em lote. Com uma chave de projeto, omita x-project-id ou envie o próprio projeto da chave |
400 | Bad Request | Erro de validação no corpo da requisição, header x-api-key ausente (Missing required header: x-tenant-id), um x-project-id que não é um UUID válido, ou um resultado sem activity_id enviado sem projeto | Verifique se o corpo está de acordo com o formato documentado: tipos de dados e campos obrigatórios. Se você enviar x-project-id, use o UUID de um projeto; com uma chave de tenant ou um token de usuário, um resultado sem activity_id precisa dele |
404 | Not Found | Recurso não encontrado, ou o projeto indicado em x-project-id não existe | Confirme que o activity_id ou outro identificador existe no tenant, e que o projeto de x-project-id pertence ao tenant da chave |
422 | Unprocessable Entity | O corpo é válido, mas não pode ser processado: a atividade não aceita um resultado no seu estado ou dia atual, ou o tipo de resultado não está ativo ou precisa de um dado que falta | Verifique se a atividade está em um estado que aceita resultado (READY, DISPATCHED, RETRYING ou COMPLETED) e se o seu dia não foi fechado pelo corte de fim de dia; use um código de resultado ativo e envie future_scheduled_at (hoje ou depois) quando o seu tipo o exigir |
429 | Too Many Requests | Requisições demais em pouco tempo | Aguarde antes de tentar novamente e distribua as requisições ao longo do tempo |
Erros comuns e diagnóstico
401 — Chave não reconhecida
{
"statusCode": 401,
"error": "Unauthorized",
"message": "Invalid or revoked API key"
}Causas possíveis:
- A chave foi revogada a partir do painel de administração
- A chave tem uma data de expiração vencida
- Erro de formatação (espaços, caracteres extras)
- O dono da chave está inativo — nesse caso o
messageéAPI key owner is inactive or not found - A API não conseguiu validar a chave naquele momento — nesse caso o
messageéAPI key validation failed; tente a requisição novamente
Uma requisição que não traz chave não recebe este 401. A API só lê x-api-key como chave quando o valor começa com rtn_sk_; qualquer outro valor conta como se não houvesse chave. Sem chave e sem x-tenant-id, a API responde 400 Bad Request com Missing required header: x-tenant-id; com x-tenant-id mas sem credenciais, responde 401.
Erros de projeto
Em GET /api/integration/activities/tasks e POST /api/integration/activity-results/tasks, x-project-id é opcional: os dois são endpoints project-optional. Quando o header é enviado, a API o verifica antes das permissões e do corpo. O 400 de um resultado sem activity_id não faz parte dessa verificação: chega depois da validação do corpo, então um erro no corpo é informado primeiro. Como cada chave escolhe o seu projeto é explicado em Escopo da chave.
| Status | Quando | message |
|---|---|---|
400 | Um resultado sem activity_id é enviado sem projeto: uma chave de tenant ou um token de usuário que não envia x-project-id | Falta el header obligatorio x-project-id: un resultado sin activity_id necesita proyecto. |
400 | x-project-id não é um UUID válido (chave de tenant ou token de usuário) | El header x-project-id debe ser un UUID válido. |
403 | Uma chave de projeto envia um x-project-id que não é o seu próprio projeto | La API key pertenece a un proyecto distinto del que declara el header x-project-id. |
404 | O projeto de x-project-id não existe ou pertence a outro tenant | El proyecto no existe. |
403 — Permissão insuficiente
{
"statusCode": 403,
"error": "Forbidden",
"message": "Required permissions: activity:view"
}Causas possíveis:
- A chave não inclui a permissão exigida para o endpoint
- Peça ao dono da chave que edite as permissões dela com
PUT /api/api-keys/:id/permissionsou em Configurações → Chaves de API
400 — Erro de validação
A API responde 400 quando o corpo não está de acordo com o formato documentado.
Causas possíveis:
- Campos obrigatórios ausentes:
occurred_atetask_result.resultsempre;commerce_external_idapenas quandoactivity_idnão é enviado (execuções independentes) - Formato de data inválido (deve ser ISO 8601)
activity_idnão é um UUID válido- Campos que não fazem parte do corpo documentado
422 — Estado não processável
{
"statusCode": 422,
"error": "Unprocessable Entity",
"message": "La actividad no está en un estado válido para registrar resultado."
}Causas possíveis:
- A atividade vinculada não está em um estado que aceita resultado.
READY,DISPATCHEDeRETRYINGaceitam;COMPLETEDtambém, e enviar de novo atualiza o resultado existente da atividade;CANCELEDeFAILEDnão —messageacima - A data de execução da atividade já ultrapassou o corte de fim de dia —
La actividad corresponde a un día ya cerrado y no admite registrar resultado.Depois desse corte, um fechamento automático é executado e pode registrar o resultado (comoNOT_EXECUTED). Execuções independentes (STANDALONE, semactivity_id) estão isentas desta regra e da anterior - O código de resultado de
task_result.resultnão existe ou não está ativo —El tipo de resultado seleccionado no está activo.Veja Listar Configurações para obter códigos válidos - O tipo de resultado exige
task_result.future_scheduled_ate ele não foi enviado —Este tipo de resultado requiere una fecha comprometida. task_result.future_scheduled_atcai em um dia anterior a hoje, no fuso horário do tenant —La fecha programada no puede ser en el pasado.