Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.loveandpay.io/llms.txt

Use this file to discover all available pages before exploring further.

Лимиты запросов

API v2 имеет ограничения на количество запросов для защиты от перегрузки:
ПериодЛимитОписание
Минута100Максимум запросов в минуту
Час1000Максимум запросов в час
При необходимости увеличения лимитов обратитесь в поддержку: support@loveandpay.io

Заголовки ответа

Каждый ответ API содержит заголовки с информацией о лимитах:
ЗаголовокОписание
X-RateLimit-Limit-MinuteЛимит запросов в минуту
X-RateLimit-Remaining-MinuteОставшееся количество в текущую минуту
X-RateLimit-Limit-HourЛимит запросов в час
X-RateLimit-Remaining-HourОставшееся количество в текущий час
X-RateLimit-ResetВремя сброса лимита (ISO 8601)
Retry-AfterСекунды до возможности повтора (только при 429)

Превышение лимита

При превышении лимита API вернёт статус 429 Too Many Requests:
{
  "success": false,
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Превышен лимит запросов"
  }
}

Обработка

async function makeRequest(url, options) {
  const response = await fetch(url, options);

  if (response.status === 429) {
    const retryAfter = response.headers.get('Retry-After');
    console.log(`Rate limit exceeded. Retry after ${retryAfter} seconds`);

    // Exponential backoff
    await sleep(retryAfter * 1000);
    return makeRequest(url, options);
  }

  return response.json();
}

Защита от циклических запросов

API v2 автоматически обнаруживает и блокирует повторяющиеся запросы:

Правила

УсловиеПоследствие
Более 10 идентичных запросов в минутуВременная блокировка на 15 минут
3 временных блокировкиПерманентная блокировка

Что считается идентичным запросом?

  • Тот же метод (GET, POST, etc.)
  • Тот же path
  • То же тело запроса (для POST/PUT)

Ответ при блокировке

{
  "success": false,
  "error": {
    "code": "CYCLE_BLOCKED",
    "message": "Временная блокировка из-за циклических запросов",
    "details": {
      "blockedUntil": "2024-01-23T12:15:00.000Z",
      "reason": "Too many identical requests"
    }
  }
}
Перманентная блокировка требует обращения в поддержку для разблокировки.

Лучшие практики

Кэширование

Кэшируйте часто запрашиваемые данные

Batch операции

Используйте batch endpoints для массовых операций

Вебхуки

Подписывайтесь на события вместо polling’а

Exponential backoff

При 429 увеличивайте интервал между попытками

Пример с exponential backoff

async function requestWithBackoff(url, options, maxRetries = 5) {
  let retries = 0;

  while (retries < maxRetries) {
    const response = await fetch(url, options);

    if (response.status !== 429) {
      return response.json();
    }

    const retryAfter = response.headers.get('Retry-After') || Math.pow(2, retries);
    console.log(`Retry ${retries + 1}/${maxRetries} after ${retryAfter}s`);

    await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
    retries++;
  }

  throw new Error('Max retries exceeded');
}