Ошибка: TonAPI — rate limit (429)

Причина и решение ошибки HTTP 429 (rate limit) при запросах к TonAPI.

TonAPI: rate limit (429)

Сервер TonAPI (tonapi.io) ответил 429 Too Many Requests: превышен лимит запросов для твоего ключа/IP за окно времени.


Причина

  • слишком частые polling getTransaction / account в цикле без backoff;
  • SSR или serverless множит одни и те же запросы на каждый hit;
  • нет API key → жёсткий публичный лимит;
  • несколько инстансов приложения бьют один ключ параллельно.

Решение

typescript
// fetch + exponential backoff при 429
async function tonApiGet(path: string, apiKey: string, attempt = 0): Promise<unknown> {
  const res = await fetch(`https://tonapi.io${path}`, {
    headers: {
      Authorization: `Bearer ${apiKey}`,
      Accept: "application/json",
    },
  });

  if (res.status === 429) {
    if (attempt >= 5) throw new Error("TonAPI rate limit: retries exhausted");
    const retryAfter = Number(res.headers.get("Retry-After") ?? 0);
    const delayMs = Math.max(retryAfter * 1000, 500 * 2 ** attempt);
    await new Promise((r) => setTimeout(r, delayMs));
    return tonApiGet(path, apiKey, attempt + 1);
  }

  if (!res.ok) {
    throw new Error(`TonAPI ${res.status}: ${await res.text()}`);
  }

  return res.json();
}

// Вместо polling каждую секунду — интервал ≥ 3–5s или webhooks/SSE где доступны

Положи ключ в env (TONAPI_KEY), не в клиентский бандл для секретных лимитов.


Как избежать в будущем

Кэшируй ответы, дебаунсь UI-запросы, используй API key и уважай Retry-After. Для высоконагруженных индексов — свой лимитед-proxy или платный план TonAPI.

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация