Docs/API Reference/Erros e Rate Limits
DashboardGitHub

Todas as respostas de erro da API Dyvit seguem um formato padronizado. Esta página documenta a estrutura do payload de erro, os códigos possíveis, os limites de requisição por plano e a estratégia recomendada de retry.

Formato do payload de erro

#
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "O campo 'cpf' é obrigatório.",
    "field": "cpf",
    "statusCode": 400
  }
}

O campo field é opcional e aparece apenas em erros de validação. O code é uma string constante que pode ser usada para tratamento programático.


Códigos de erro

#
StatusCódigoQuandoSolução
400VALIDATION_ERRORCampos obrigatórios ausentes ou formato inválidoVerifique o corpo da requisição e os tipos dos campos
401UNAUTHORIZEDToken JWT ausente, expirado ou inválidoRenove o token via /api/auth/login
403FORBIDDENUsuário não tem permissão para este recursoVerifique as permissões da conta ou o plano contratado
404NOT_FOUNDRecurso não encontrado (ID inexistente)Confirme o ID do recurso na requisição
409DUPLICATERecurso duplicado (ex: CPF já importado na campanha)Verifique se o registro já existe antes de criar
422BUSINESS_RULERegra de negócio violada (ex: campanha já lançada)Consulte a documentação do endpoint para pré-condições
429RATE_LIMITEDLimite de requisições excedidoAguarde o tempo indicado no header Retry-After
500INTERNAL_ERRORErro interno do servidorTente novamente. Se persistir, entre em contato com o suporte

Rate limits por plano

#
PlanoRequisições/minRegistros por importaçãoCampanhas simultâneas
Free (trial)601001
Growth3005.000Ilimitado
Scale1.00050.000Ilimitado
ℹ️

Quando o limite é atingido, a API retorna 429 RATE_LIMITED com o header Retry-After indicando quantos segundos aguardar.


Estratégia de retry

#

Para lidar com erros transitórios (429 e 500), recomendamos exponential backoff com jitter. Exemplo em Node.js:

async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const res = await fetch(url, options);

    if (res.ok) return res.json();

    if (res.status === 429 || res.status >= 500) {
      const baseDelay = Math.pow(2, attempt) * 1000;
      const jitter = Math.random() * 1000;
      const delay = baseDelay + jitter;

      console.log(
        `Tentativa ${attempt + 1} falhou (${res.status}). ` +
        `Aguardando ${Math.round(delay)}ms...`
      );

      await new Promise((r) => setTimeout(r, delay));
      continue;
    }

    // Erros 4xx (exceto 429) não devem ser retentados
    const error = await res.json();
    throw new Error(`${error.error.code}: ${error.error.message}`);
  }

  throw new Error("Número máximo de tentativas excedido.");
}
⚠️

Não retente erros 400, 401, 403, 404, 409 ou 422. Esses erros indicam problemas na requisição que precisam ser corrigidos antes de reenviar.