Tenderland API v1 · редакция от 23 июня 2026 года

Tenderland API

Практическая инструкция по подключению, получению тендеров, работе с поиском, файлами, вебхуками и лимитами.

Базовый адрес
https://tenderland.ru/Api/v1
Авторизация
Tenderland-Api-Key
Форматы
JSON и XML

Начало работы

Ключ хранится только на сервере в переменной TENDERLAND_API_KEY. Не добавляйте его в HTML, клиентский JavaScript, URL интерфейса, логи или репозиторий.

API принимает ключ и в параметре apiKey, но для Kortex используем HTTP-заголовок: так секрет не попадает в историю браузера и журналы прокси.

Проверка подключения

curl "https://tenderland.ru/Api/v1/User/GetStatistic" \
  -H "Tenderland-Api-Key: $TENDERLAND_API_KEY"

Серверный запрос на Node.js

const response = await fetch(
  `${process.env.TENDERLAND_API_BASE_URL}/User/GetStatistic`,
  {
    headers: {
      "Tenderland-Api-Key": process.env.TENDERLAND_API_KEY
    }
  }
);

if (!response.ok) {
  throw new Error(`Tenderland API: ${response.status}`);
}

const statistic = await response.json();

Модули и способы интеграции

API

Выгружает данные из сохранённых автопоисков по выбранной форме отчёта. Доступен широкий набор полей. Подходит для регулярной синхронизации.

API Поиск

Выполняет динамический поиск без заранее созданного автопоиска методом Search/Find. Подключается и оплачивается отдельно.

Webhook

Tenderland сам отправляет новые данные методом POST на конечную точку Kortex. Получатель подтверждает страницу ответом HTTP 200.

Выгрузка из автопоиска

  1. Получите автопоиски. Вызовите Dictionary/GetAutosearchList и выберите Id.
  2. Получите формы отчётов. Вызовите Dictionary/GetExportViewList и выберите Id отчёта.
  3. Создайте задачу. Передайте autosearchId и exportViewId в Export/Create.
  4. Читайте последовательно. Передавайте полученный exportId в Export/Get, увеличивая offset на batchSize.
# 1. Создать задачу
curl "https://tenderland.ru/Api/v1/Export/Create?autosearchId=123&exportViewId=456&batchSize=100&format=json" \
  -H "Tenderland-Api-Key: $TENDERLAND_API_KEY"

# 2. Прочитать страницы: 0, 100, 200...
curl "https://tenderland.ru/Api/v1/Export/Get?exportId=789&offset=0" \
  -H "Tenderland-Api-Key: $TENDERLAND_API_KEY"
Важно. Не отправляйте параллельные запросы Export/Get для одной задачи. Следующая страница запрашивается только после ответа на предыдущую. Разные задачи можно читать параллельно.

Инкрементальная синхронизация

Чтобы получать только новые или изменённые записи, храните контрольную точку в Kortex и при следующем запуске передавайте один из параметров:

ПараметрНазначениеФормат
searchAfterCreateDateСоздано в Tenderland не раньше датыUTC, ISO 8601
searchAfterUpdateDateОбновлено в Tenderland не раньше датыUTC, ISO 8601
searchAfterIdИдентификатор не меньше указанногоTL\d+
searchAfterFilterПрименить условие к конкретной сущностиtender, contract, position

Параметры searchAfterCreateDate, searchAfterUpdateDate и searchAfterId взаимоисключающие. Для защиты от записей с одинаковым временем храните идентификаторы обработанных сущностей и делайте загрузку идемпотентной.

Webhook

  1. В панели Tenderland откройте «Панель управления API» → «Интеграция».
  2. Выберите автопоиск, отчёт, JSON или XML, интервал 15/30/60 минут и размер страницы.
  3. Укажите HTTPS-адрес обработчика Kortex и при необходимости включите обновления и GZIP.
  4. Сохраняйте данные идемпотентно и возвращайте HTTP 200 только после успешной обработки всей страницы.

Один цикл содержит не более пяти страниц. Если обработка длится дольше 30 секунд или ответ отличается от 200, цикл останавливается и следующая попытка начинается с той же страницы.

Для теста используйте принудительную отправку. Пока обработка не подтверждена статусом 200, Tenderland повторяет ту же страницу и не списывает лимит за доставленные данные.

Каталог методов

Справочники
GET/Dictionary/GetAutosearchList

Список автопоисков и их модулей.

GET/Dictionary/GetExportViewList

Список отчётов и полей каждого отчёта.

GET/Dictionary/GetFieldList

Поля, доступность в поиске/выгрузке и возможность сортировки.

GET/Dictionary/GetFilterList

Фильтры, типы, модули и ссылки на допустимые значения.

GET/Dictionary/Get

Значения справочника по параметру name.

Выгрузка и поиск
GET/Export/Create

Создать задачу из autosearchId или sessionId.

GET/Export/Get

Прочитать страницу задачи по exportId и offset.

GET/Search/Get

Найти сущности по номерам, идентификаторам или реквизитам.

POST/Search/Find

Выполнить динамический поиск по JSON-набору фильтров.

GET/Search/GetAutosearch

Получить JSON настроек сохранённого автопоиска.

Файлы и документы
GET/File/GetEntityFileList

Список файлов тендера, контракта или позиции плана.

GET/File/GetAll

ZIP-архив файлов, которые уже сохранены на серверах Tenderland.

GET/File/Get

Один исходный файл по storageId.

Организации, события и статистика
GET/Organizations/GetEgrul

Выписка ЕГРЮЛ/ЕГРИП в XML по ОГРН или идентификатору организации.

GET/Organizations/GetEgrulStatementDates

Даты, на которые доступно формирование выписки.

GET/Entity/GetEvents

События и даты обновлений тендеров, контрактов и планов.

GET/User/GetStatistic

Лимиты и текущее потребление; сам вызов не тарифицируется.

Файлы и связанные данные

Тип сущности задаётся параметром entityTypeId: 1 — тендер, 2 — контракт, 3 — позиция плана. Идентификатор сущности имеет формат TL\d+.

Сначала вызывайте File/GetEntityFileList. Файл со storageId > 0 можно скачать через File/Get. Если storageId отсутствует, используйте sourceLink. ZIP из File/GetAll может быть неполным, потому что Tenderland хранит на своих серверах не все документы.

Отчёты могут объединять тендеры, лоты, контракты и позиции планов. В многолотовых и совместных закупках строки повторяются для сохранения связей, поэтому ключ дедупликации должен учитывать тип сущности и лот.

Лимиты

МодульОграничениеЗначение без оплаты
API / API РевизорЗапросов в суткидо 300
API / API РевизорЕдиниц данных в суткидо 300
API / API РевизорЕдиниц данных в месяцдо 9 000
API / API РевизорЗа один ответдо 100
API ПоискСущностей на страницедо 100
API ПоискГлубина страницдо 100

Суточные счётчики сбрасываются в 00:00 МСК, месячные — первого числа в 00:00 МСК. Единица данных — тендерный лот, контракт, позиция плана или один файл.

Ошибки и повторные запросы

КодHTTPДействие
USER_INVALID_API_KEY403Проверить ключ и при необходимости выпустить новый.
USER_DISABLE_API_MODULE403Подключить нужный модуль у менеджера Tenderland.
USER_INVALID_ROLE403Использовать учётную запись администратора кабинета.
USER_EXPIRATION_LIMIT403Проверить срок доступа и оплату.
API_REQUEST_LIMIT403Проверить статистику и дождаться сброса лимита.
API_INVALID_PARAMETER400Проверить значения по справочникам и пересоздать истёкшую задачу.
API_TOO_MANY_REQUESTS429Убрать параллельное чтение задачи и повторить с задержкой.
SYSTEM_ERROR500Повторить с экспоненциальной задержкой; при длительной ошибке обратиться в поддержку.

Для 429 и 500 используйте ограниченное число повторов с увеличивающейся задержкой. Ошибки 400 и 403 автоматически не повторяйте: сначала исправьте запрос, доступ или лимит.

Замечания к редакции v1

  • В таблице Export/Get для offset указано значение больше нуля, но официальный пример начинает с offset=0. Первую страницу запрашиваем с нуля.
  • В строке запроса Export/Create встречается опечатка oderBy; описание параметра и остальные примеры используют orderBy.
  • Для результата Search/Find документация использует оба имени: sessionId в таблице и id в примере. До проверки реальным ответом обработчик должен принимать оба варианта.
  • Методы поиска сейчас работают только с JSON, а Organizations/GetEgrul всегда возвращает XML.