Erros Comuns
Diagnóstico e resolução dos erros mais frequentes
Visão geral
Este guia ajuda a diagnosticar e resolver os erros mais comuns ao integrar com a API Conta Simples. Os erros são organizados por categoria de código HTTP.
Antes de contatar o suporte, use o Checklist de diagnóstico no final desta página.
Erros da API por endpoint
GET /statements/v1/credit-card
O endpoint de extrato de transações pode retornar:
| Código | Descrição | Causa comum |
|---|---|---|
200 | OK | Sucesso |
400 | Bad Request | Parâmetros inválidos |
500 | Internal Server Error | Erro interno |
GET /attachments/v1/content/{attachmentId}
O endpoint de download de anexos pode retornar:
| Código | Descrição | Causa comum |
|---|---|---|
200 | OK | Sucesso (retorna binário) |
404 | Not Found | Anexo não existe |
Erros de validação (400)
Sintomas
400 Bad Request- Parâmetros inválidos no body da requisição
Causas específicas para GET /statements/v1/credit-card
Causa: startDate ou endDate não estão no formato YYYY-MM-DD.
Incorreto:
{
"startDate": "01/01/2025",
"endDate": "31/01/2025"
}
Correto:
{
"startDate": "2025-01-01",
"endDate": "2025-01-31"
}
Causa: A diferença entre startDate e endDate excede 62 dias.
Solução: Divida a consulta em períodos menores:
// Exemplo: consultar 90 dias em duas requisições
// Requisição 1: 01/01 a 28/02 (59 dias)
// Requisição 2: 01/03 a 31/03 (31 dias)
Causa: limit menor que 5 ou maior que 100.
Incorreto:
{
"limit": 200
}
Correto:
{
"limit": 100
}
Causa: startDate, endDate ou limit não informados.
Solução: Inclua todos os campos obrigatórios:
{
"startDate": "2025-01-01",
"endDate": "2025-01-31",
"limit": 50
}
Causa: Sintaxe JSON inválida.
Verifique:
- Aspas duplas em todas as strings
- Vírgulas entre campos
- Chaves de abertura/fechamento
Dica: Use um validador JSON online antes de enviar.
Erros de autenticação (401)
Sintomas
401 Unauthorized- Mensagens como "Token inválido", "Token expirado", "Não autorizado"
Causas e soluções
Causa: O access token excedeu seu tempo de vida (normalmente 30 minutos).
Solução:
- Obtenha um novo token via
/oauth/v1/access-token - Implemente renovação automática antes da expiração
// Exemplo: renovar quando faltar 10% do tempo
if (tokenAge > expiresIn * 0.9) {
const token = await refreshToken();
}
Causa: Header Authorization não enviado.
Solução: Verifique se está incluindo o header em todas as requisições:
curl -X GET https://api-sandbox.contasimples.com/statements/v1/credit-card \
-H "Authorization: Bearer {TOKEN}" \
-H "Content-Type: application/json" \
-H "User-Agent: {nome-do-seu-app}/{versao}"
Causa: Token malformado ou prefixo errado.
Incorreto:
Authorization: {TOKEN}
Authorization: bearer {TOKEN}
Authorization:Bearer {TOKEN}
Correto:
Authorization: Bearer {TOKEN}
(Note o espaço após "Bearer" e o "B" maiúsculo)
Causa: API Key ou API Secret incorretos ao obter token.
Solução:
- Verifique as credenciais no seu cofre de segredos
- Confirme que está usando credenciais do ambiente correto (Sandbox vs Produção)
- Se necessário, acesse o painel de credenciais no Internet Banking para verificar ou gerar novas credenciais
Padrão de retry para 401
async function requestWithAuthRetry(
method: string,
url: string,
options: RequestInit & { headers: Record<string, string> },
): Promise<Response> {
let response = await fetch(url, { method, ...options });
if (response.status === 401) {
// Invalida cache do token
invalidateTokenCache();
// Obtém novo token
const newToken = await getFreshToken();
// Repete a requisição
options.headers["Authorization"] = `Bearer ${newToken}`;
response = await fetch(url, { method, ...options });
}
return response;
}
Erros de permissão (403)
Sintomas
403 Forbidden- Mensagens como "Sem permissão", "Acesso negado"
Causas e soluções
Causa: Suas credenciais não têm permissão para o recurso solicitado.
Solução:
- Verifique quais escopos suas credenciais possuem
- Se precisar de escopos adicionais, solicite via suporte
Causa: Usando credenciais de Sandbox para acessar Produção (ou vice-versa).
Solução: Confirme que URL base e credenciais são do mesmo ambiente.
Causa: A requisição foi enviada sem o header User-Agent. Sem um agente de usuário reconhecível, o tráfego pode ser tratado de forma diferente pela camada de proteção e resultar nesse desafio.
Solução: Inclua um header User-Agent válido e descritivo em todas as requisições (o mesmo valor que um navegador ou cliente HTTP comum enviaria).
Erros de recurso (404)
Sintomas
404 Not Found- Recurso não encontrado
Causas específicas para GET /attachments/v1/content/{attachmentId}
Causa: O attachmentId não existe ou foi removido.
Solução:
- Verifique se o ID está correto (obtido da transação)
- Confirme que a transação ainda existe
- O anexo pode ter sido excluído
Causa: Path montado incorretamente.
Incorreto:
GET /attachments/v1/content/
GET /attachment/att_abc123
Correto:
GET /attachments/v1/content/att_abc123
Erros de servidor (500)
Sintomas
500 Internal Server Error- Erro inesperado no servidor
Solução
Aguarde e tente novamente
Erros 500 podem ser transitórios. Aguarde alguns segundos e repita.
Implemente retry com backoff
Use backoff exponencial para evitar sobrecarregar o servidor.
Registre o timestamp e dados
Anote quando ocorreu e quais parâmetros enviou.
Contate o suporte se persistir
Se o erro persistir após 3-5 tentativas, abra um chamado.
Padrão de retry para 500
const RETRYABLE_STATUS = new Set([500, 502, 503, 504]);
async function requestWithRetry(
method: string,
url: string,
maxRetries = 3,
options?: RequestInit,
): Promise<Response> {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30_000);
const response = await fetch(url, {
method,
...options,
signal: controller.signal,
});
clearTimeout(timeout);
if (!RETRYABLE_STATUS.has(response.status)) {
return response;
}
} catch (err) {
if (!(err instanceof DOMException && err.name === "AbortError"))
throw err;
}
if (attempt < maxRetries - 1) {
const waitTime = 2 ** attempt + Math.random();
await new Promise((resolve) => setTimeout(resolve, waitTime * 1000));
}
}
throw new Error("Max retries exceeded");
}
Checklist de diagnóstico
Antes de contatar o suporte, verifique:
- URL base está correta para o ambiente (Sandbox/Produção)
- Token não expirou (válido por 30 minutos)
- Header Authorization está no formato
Bearer {TOKEN} - Header Content-Type é
application/json - Body JSON está bem formado
- Datas estão no formato
YYYY-MM-DD - Período não excede 62 dias
- Limit está entre 5 e 100
- Tentou novamente após alguns segundos (para erros 5xx)
Informações para o suporte
Ao contatar o suporte, sempre inclua:
| Informação | Descrição | Exemplo |
|---|---|---|
| Timestamp | Data/hora exata (UTC) | 2025-01-15T14:30:00Z |
| Ambiente | Sandbox ou Produção | Sandbox |
| Endpoint | URL e método | GET /statements/v1/credit-card |
| Status code | Código HTTP retornado | 400 |
| Request body | Payload enviado (mascarado) | Ver abaixo |
| Response body | Resposta da API | Ver abaixo |
Exemplo de payload mascarado para suporte
{
"startDate": "2025-01-01",
"endDate": "2025-01-31",
"limit": 50
}
{
"error": "Bad Request",
"message": "startDate format is invalid"
}
Nunca inclua tokens, credenciais ou dados pessoais ao reportar problemas.
Links úteis
Last updated today
Built with Documentation.AI