Skip to main content

Rate limiting

Cada API key está sujeita a um limite de 100 requisições por minuto. O limite é contado por janela deslizante de 60 segundos, por chave.

Headers de controle

Toda resposta inclui headers que informam o estado atual do seu limite:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 87
X-RateLimit-Reset: 1745078400
HeaderDescrição
X-RateLimit-LimitLimite total da janela atual
X-RateLimit-RemainingRequisições restantes na janela
X-RateLimit-ResetTimestamp Unix em que o contador zera

Quando o limite é atingido

A API retorna 429 Too Many Requests com o header Retry-After informando quantos segundos aguardar:
HTTP/1.1 429 Too Many Requests
Retry-After: 12
Content-Type: application/json

{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Limite de 100 requisições por minuto atingido. Aguarde 12 segundos.",
    "status": 429
  }
}

Implementando retry com backoff

async function requestWithRetry(url, options, maxAttempts = 3) {
  for (let attempt = 1; attempt <= maxAttempts; attempt++) {
    const res = await fetch(url, options);

    if (res.status !== 429) return res;

    const retryAfter = parseInt(res.headers.get("Retry-After") ?? "5", 10);
    console.log(`Rate limited. Aguardando ${retryAfter}s (tentativa ${attempt}/${maxAttempts})`);
    await new Promise(r => setTimeout(r, retryAfter * 1000));
  }
  throw new Error("Número máximo de tentativas atingido");
}
Se você opera com volumes altos e atingir o limite com frequência, considere distribuir a carga por múltiplos workspaces ou entre em contato pelo contato@timelyai.com.br para discutir limites customizados no plano Enterprise.

Paginação

Todas as rotas de listagem suportam paginação via query params:
GET /v1/conversations?page=3&per_page=50
ParâmetroPadrãoMáximoDescrição
page1Número da página
per_page20100Itens por página
A resposta inclui o envelope meta com total de registros:
{
  "data": [ ... ],
  "meta": {
    "page": 3,
    "per_page": 50,
    "total": 347,
    "total_pages": 7
  }
}
Use total_pages para saber quando parar de paginar. Quando page > total_pages, o campo data retorna array vazio.

Códigos de erro

A API usa status HTTP semânticos. Todos os erros seguem o mesmo formato de envelope:
{
  "error": {
    "code": "CODIGO_DO_ERRO",
    "message": "Descrição legível do problema.",
    "status": 400
  }
}

Tabela de erros

StatusQuando ocorreO que fazer
400 Bad RequestPayload inválido, campo obrigatório ausente, formato incorretoLeia error.message — ele especifica o campo problemático
401 UnauthorizedHeader x-api-key ausente, chave inválida ou revogadaVerifique a chave em Configurações → API Keys
403 ForbiddenChave válida, mas sem o escopo necessário para a operaçãoAdicione o escopo faltante à chave ou crie uma nova
404 Not FoundRecurso não existe ou não pertence ao seu workspaceConfirme o ID e o workspace ativo
409 ConflictRecurso já existe (ex: canal com o mesmo nome, webhook duplicado)Ajuste o payload ou atualize o recurso existente
429 Too Many RequestsLimite de 100 req/min atingidoUse o header Retry-After para aguardar
500 Internal Server ErrorErro inesperado no servidor da Timely.aiTente novamente. Se persistir, abra um ticket em contato@timelyai.com.br

Códigos de erro internos (error.code)

Além do status HTTP, o campo code identifica a causa exata:
CódigoDescrição
MISSING_API_KEYHeader x-api-key não foi enviado
INVALID_API_KEYChave não existe ou foi revogada
INSUFFICIENT_SCOPEEscopo necessário não está na chave
WORKSPACE_ACCESS_DENIEDChave não tem acesso ao workspace informado
CódigoDescrição
AGENT_NOT_FOUNDAgente não existe neste workspace
CONVERSATION_NOT_FOUNDConversa não encontrada
CONTACT_NOT_FOUNDContato não encontrado
CHANNEL_NOT_FOUNDCanal não existe ou não está ativo
WEBHOOK_NOT_FOUNDEndpoint de webhook não encontrado
CódigoDescrição
VALIDATION_ERRORUm ou mais campos com formato inválido
MISSING_REQUIRED_FIELDCampo obrigatório ausente no payload
INVALID_PHONE_FORMATNúmero de telefone fora do formato E.164
PAYLOAD_TOO_LARGECorpo da requisição excede o limite de 5 MB
CódigoDescrição
RATE_LIMIT_EXCEEDED100 req/min atingido
DUPLICATE_WEBHOOK_URLURL de webhook já cadastrada neste workspace
CHANNEL_ALREADY_CONNECTEDCanal já conectado a outro agente
PLAN_LIMIT_REACHEDLimite de agentes ou canais do plano atingido

Próximos passos

Checklist de produção

Verifique tudo antes de ir ao ar com clientes reais.

Webhooks

Receba eventos em tempo real sem fazer polling.