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.
Выгрузка из автопоиска
- Получите автопоиски. Вызовите
Dictionary/GetAutosearchListи выберитеId. - Получите формы отчётов. Вызовите
Dictionary/GetExportViewListи выберитеIdотчёта. - Создайте задачу. Передайте
autosearchIdиexportViewIdвExport/Create. - Читайте последовательно. Передавайте полученный
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 взаимоисключающие. Для защиты от записей с одинаковым временем храните идентификаторы обработанных сущностей и делайте загрузку идемпотентной.
Поиск
По номеру или идентификатору
Search/Get принимает через запятую реестровые номера или идентификаторы Tenderland. Для организаций при подключённом модуле «API Ревизор» можно передавать ОГРН, ИНН или название.
curl "https://tenderland.ru/Api/v1/Search/Get?keys=TL12345&entityType=tender&strictMatch=true&hideSensitiveApiData=true" \
-H "Tenderland-Api-Key: $TENDERLAND_API_KEY"
Динамический поиск
POST Search/Find относится к отдельному модулю «API Поиск». Надёжнее всего создать автопоиск в интерфейсе Tenderland, получить его JSON через Search/GetAutosearch, а затем менять нужные фильтры на сервере Kortex.
curl -X POST "https://tenderland.ru/Api/v1/Search/Find" \
-H "Tenderland-Api-Key: $TENDERLAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fields": ["tender_regNumber", "tender_name", "tender_endDate"],
"filters": {"and": []},
"interval": [0, 1],
"pageSize": 30,
"skip": 0
}'
Для последующей полной выгрузки результатов укажите pageSize: 0, возьмите идентификатор поисковой сессии и передайте его как sessionId в Export/Create.
Webhook
- В панели Tenderland откройте «Панель управления API» → «Интеграция».
- Выберите автопоиск, отчёт, JSON или XML, интервал 15/30/60 минут и размер страницы.
- Укажите HTTPS-адрес обработчика Kortex и при необходимости включите обновления и GZIP.
- Сохраняйте данные идемпотентно и возвращайте HTTP 200 только после успешной обработки всей страницы.
Один цикл содержит не более пяти страниц. Если обработка длится дольше 30 секунд или ответ отличается от 200, цикл останавливается и следующая попытка начинается с той же страницы.
Каталог методов
Справочники
/Dictionary/GetAutosearchListСписок автопоисков и их модулей.
/Dictionary/GetExportViewListСписок отчётов и полей каждого отчёта.
/Dictionary/GetFieldListПоля, доступность в поиске/выгрузке и возможность сортировки.
/Dictionary/GetFilterListФильтры, типы, модули и ссылки на допустимые значения.
/Dictionary/GetЗначения справочника по параметру name.
Выгрузка и поиск
/Export/CreateСоздать задачу из autosearchId или sessionId.
/Export/GetПрочитать страницу задачи по exportId и offset.
/Search/GetНайти сущности по номерам, идентификаторам или реквизитам.
/Search/FindВыполнить динамический поиск по JSON-набору фильтров.
/Search/GetAutosearchПолучить JSON настроек сохранённого автопоиска.
Файлы и документы
/File/GetEntityFileListСписок файлов тендера, контракта или позиции плана.
/File/GetAllZIP-архив файлов, которые уже сохранены на серверах Tenderland.
/File/GetОдин исходный файл по storageId.
Организации, события и статистика
/Organizations/GetEgrulВыписка ЕГРЮЛ/ЕГРИП в XML по ОГРН или идентификатору организации.
/Organizations/GetEgrulStatementDatesДаты, на которые доступно формирование выписки.
/Entity/GetEventsСобытия и даты обновлений тендеров, контрактов и планов.
/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_KEY | 403 | Проверить ключ и при необходимости выпустить новый. |
USER_DISABLE_API_MODULE | 403 | Подключить нужный модуль у менеджера Tenderland. |
USER_INVALID_ROLE | 403 | Использовать учётную запись администратора кабинета. |
USER_EXPIRATION_LIMIT | 403 | Проверить срок доступа и оплату. |
API_REQUEST_LIMIT | 403 | Проверить статистику и дождаться сброса лимита. |
API_INVALID_PARAMETER | 400 | Проверить значения по справочникам и пересоздать истёкшую задачу. |
API_TOO_MANY_REQUESTS | 429 | Убрать параллельное чтение задачи и повторить с задержкой. |
SYSTEM_ERROR | 500 | Повторить с экспоненциальной задержкой; при длительной ошибке обратиться в поддержку. |
Для 429 и 500 используйте ограниченное число повторов с увеличивающейся задержкой. Ошибки 400 и 403 автоматически не повторяйте: сначала исправьте запрос, доступ или лимит.
Замечания к редакции v1
- В таблице
Export/Getдляoffsetуказано значение больше нуля, но официальный пример начинает сoffset=0. Первую страницу запрашиваем с нуля. - В строке запроса
Export/Createвстречается опечаткаoderBy; описание параметра и остальные примеры используютorderBy. - Для результата
Search/Findдокументация использует оба имени:sessionIdв таблице иidв примере. До проверки реальным ответом обработчик должен принимать оба варианта. - Методы поиска сейчас работают только с JSON, а
Organizations/GetEgrulвсегда возвращает XML.