Вопросы и ответы

Ответы на вопросы о тендерах и госзакупках

271 ответ о работе с Tenderbot и участии в закупках. Поиск понимает словоформы, сокращения вроде РНУ и ЭЦП и опечатки.

Сервисы Tenderbot

API для разработчиков

Лимиты, ключевые слова, курсор last_id и получение обновлённых лотов.

9 вопросов

Какие лимиты запросов действуют в API?

1000 запросов за 24 часа. Отсчёт идёт от первого запроса, в полночь счётчик не сбрасывается. Отдельных лимитов в минуту или в час нет. Все эндпоинты /api/external/v1/* — /lots, /lots/{id}/files, /references/sources и другие — расходуют одну общую квоту; не считаются только /about, /_health и /docs.

Лимит считается на токен или на аккаунт? Можно ли работать с нескольких компьютеров?

На аккаунт, которому принадлежит токен: если токенов несколько, у них общая квота. Запрос без токена получает 401 ещё до проверки лимита. Токен не привязан к IP или устройству, поэтому его можно использовать с нескольких компьютеров — но 1000 запросов в сутки остаются общими на все.

Что происходит при превышении лимита и как узнать остаток?

API отвечает 429, и запросы блокируются до конца 24-часового окна, после чего квота снова полная. Каждый ответ содержит заголовки X-RateLimit-Limit и X-RateLimit-Remaining. Ответ 429 дополнительно возвращает Retry-After — через сколько секунд можно повторить запрос — и X-RateLimit-Reset — время сброса в формате Unix timestamp.

Как отслеживать новые тендеры, не тратя лимит на перебор?

Запрашивайте GET /lots с курсором last_id. Лоты отдаются по возрастанию id, до 100 за запрос (limit=100), в ответе есть meta.last_id и готовая ссылка links.next. Сохраните последний last_id и при следующем опросе передайте его вместе с теми же фильтрами — придут только лоты, появившиеся после этого id.

Несколько ключевых слов передаются в одном запросе: query[]=…&query[]=… или query=слово1,слово2.

Как работают несколько ключевых слов в query[]?

Элементы query[] объединяются по ИЛИ: в выдачу попадает лот, подходящий хотя бы под один из них. Каждый элемент ищется как фраза целиком — слова подряд и в указанном порядке, с учётом словоформ русского языка; при exact_match=true словоформы отключаются.

Поиск идёт по названию и описанию лота и объявления. Слова из exclude_words исключаются из общего результата.

Можно ли узнать, по какому ключевому слову найден лот?

Нет, поле с совпавшим запросом в ответе не возвращается. Ответ содержит name и description лота — сопоставление с ключевыми словами делается на стороне вашей системы.

Можно ли использовать один last_id для разных наборов запросов?

Нет, last_id хранится отдельно для каждого набора фильтров. Это не глобальный курсор: условие id > last_id применяется поверх поискового фильтра. Если один набор вернул meta.last_id = 1000, то другой набор с last_id=1000 уже не получит подходящий ему лот с id 950. Полнота выдачи гарантируется только внутри одного и того же набора параметров.

Как получить изменения в уже полученных лотах?

Курсор их не вернёт: запрос с last_id=1000 никогда не отдаст лот 900, даже если его данные изменились. Параметр updated_after фильтрует по дате появления лота в системе, а не по дате изменения, поэтому вместе с last_id тоже не поможет.

Для обновлений периодически повторяйте запрос без last_id с узким фильтром — например, deadline.from и deadline.to по ещё открытым лотам — и сравнивайте dates.updated_at с сохранённым значением. Завершённые лоты видны по status=completed.

Сколько ключевых слов передавать в одном запросе?

Рекомендуем 20–50 элементов query[] на запрос с limit=100 и отдельным last_id на каждую группу. Несколько сотен query[] в одном запросе передавать не стоит. Учитывайте лимит: при опросе раз в 15 минут получается 96 циклов в сутки, то есть не больше 10 групп запросов за цикл.