Draftn.io docs · api
Fundamentos

Rate limits

A especificação OpenAPI não define limites de requisição para os endpoints públicos. Ainda assim, trate sua integração como se houvesse: cacheie, agrupe e implemente retentativas com backoff.

Proteções específicas de anúncios

Embora não seja um limite de taxa clássico, o endpoint de clique em anúncios aplica deduplicação por IP: cliques repetidos do mesmo IP no mesmo anúncio dentro de 30 minutos são aceitos com 200, mas não incrementam a métrica. Além disso, cada clickToken é de uso único (reuso retorna 409) e expira em 10 minutos. Veja Anúncios · Delivery.

Boas práticas

  • Cacheie conteúdo publicado. Posts, categorias e tags mudam pouco. Em sites estáticos/SSR, busque no build ou com revalidação por intervalo em vez de a cada visita.
  • Prefira chamadas no servidor. Evite que cada visitante dispare uma requisição direta à API — isso concentra carga e expõe a chave.
  • Implemente retentativas com backoff exponencial para erros transitórios (especialmente 5xx), com um teto de tentativas.
  • Respeite os limites de paginação (limit até 100 em posts, 50 na busca) e pagine em vez de pedir grandes volumes de uma vez.
  • Trate 429 defensivamente, caso a plataforma passe a aplicá-lo: recue e tente de novo após um intervalo.

Retentativa com backoff

Um wrapper de fetch que repete em erros transitórios, pronto para reuso:

TypeScript
async function fetchComRetry(
  url: string,
  init: RequestInit,
  tentativas = 3,
): Promise<Response> {
  let ultimoErro: unknown;

  for (let i = 0; i < tentativas; i++) {
    try {
      const res = await fetch(url, init);
      // repete em 429 e 5xx; devolve o resto (inclui 200, 401, 404…)
      if (res.status === 429 || res.status >= 500) {
        await esperar(2 ** i * 300); // 300ms, 600ms, 1200ms…
        continue;
      }
      return res;
    } catch (err) {
      ultimoErro = err;
      await esperar(2 ** i * 300);
    }
  }
  throw ultimoErro ?? new Error("Falha após retentativas");
}

const esperar = (ms: number) => new Promise((r) => setTimeout(r, ms));