API каталога: выгрузка прайса с остатками
Автоматическая выгрузка вашего прайс-листа: розничная цена, ваша дилерская цена по индивидуальному соглашению и остатки по 10 складам. Один HTTP-запрос — и у вас всегда актуальные данные в учётной системе, на сайте или в Excel.
Быстрый старт
-
Получите API-ключ
Ключ выдаёт ваш менеджер Терморос. Он персональный: по нему API определяет вашу компанию и считает цены по вашему соглашению. Не публикуйте ключ; при утечке менеджер отзовёт его и выдаст новый.
-
Сделайте первый запрос
bashcurl -H "X-Api-Key: ВАШ_КЛЮЧ" \ "https://www.termoros.com/api/v1/catalog/?format=json"
Если система не умеет передавать заголовки (Excel, 1С, браузер), передайте ключ параметром:
URLhttps://www.termoros.com/api/v1/catalog/?api_key=ВАШ_КЛЮЧ&format=csv
-
Настройте ежедневную синхронизацию
Данные меняются один раз в сутки после ночного обмена с 1С — достаточно одного запроса в день после 11:00 МСК.
Готовая коллекция для Postman
20 запросов со всеми сценариями и автотестами: выгрузки во всех форматах, фильтры, справочники, кэширование по ETag, обработка ошибок. Импортируйте файл в Postman, впишите свой ключ в переменную коллекции partnerApiKey — и запускайте.
Справочник API
https://www.termoros.com/api/v1/catalog/Аутентификация
Заголовок X-Api-Key: <ключ> (рекомендуется) или параметр ?api_key=<ключ>.
Параметры запроса
| Параметр | Значения | По умолчанию |
|---|---|---|
format | json — для интеграций · csv — открывается в Excel · xml — для учётных систем | json |
brand | бренды через запятую, например Danfoss,Baxi. Регистр не важен: RIFAR, Rifar и rifar — одно и то же. Точный список — в справочнике брендов (см. ниже) | все |
type | ID разделов каталога через запятую. Раздел выгружается вместе со всеми вложенными — ID берутся из справочника разделов (см. ниже) | все |
store | ID складов через запятую (таблица ниже). Влияет только на остатки: номенклатура выгружается вся | все |
in_stock | 1 — оставить только позиции с остатком больше нуля (по складам из store, а без него — по любому) | 0 |
Склады
| ID | Город | ID | Город |
|---|---|---|---|
| 1 | Москва | 6 | Санкт-Петербург |
| 2 | Екатеринбург | 7 | Уфа |
| 3 | Казань | 8 | Ростов-на-Дону |
| 4 | Краснодар | 9 | Пятигорск |
| 5 | Новосибирск | 10 | Нижний Новгород |
Разделы каталога
Чтобы выгрузить один раздел, нужен его ID. Полный справочник отдаёт отдельный эндпоинт — по тому же ключу:
https://www.termoros.com/api/v1/catalog/sections/Поддерживает те же форматы: ?format=json (по умолчанию), csv, xml.
{
"meta": {"generated_at": "2026-08-12T22:52:39+03:00", "data_date": "2026-08-12", "sections_count": 205},
"sections": [
{
"id": 1869,
"name": "Краны шаровые",
"parent_id": 1864,
"depth": 4,
"path": "Арматура и трубопроводы / Арматура / Арматура запорная / Краны шаровые",
"items_count": 1368
}
]
}items_count — сколько позиций вернёт выгрузка с type=<id> без прочих фильтров (без brand, store, in_stock). path — путь от корня каталога, по нему удобно искать нужный раздел глазами. У корневых разделов parent_id пуст.
# справочник разделов в Excel curl -H "X-Api-Key: ВАШ_КЛЮЧ" -o sections.csv \ "https://www.termoros.com/api/v1/catalog/sections/?format=csv" # выгрузка раздела вместе со всеми вложенными: # 1862 — «Арматура и трубопроводы», внутри и «Краны шаровые» из примера выше curl -H "X-Api-Key: ВАШ_КЛЮЧ" \ "https://www.termoros.com/api/v1/catalog/?type=1862&format=json"
Бренды
Фильтр brand принимает название бренда так, как оно заведено в 1С, но без учёта регистра: RIFAR, Rifar и rifar дадут один и тот же результат. Полный список названий отдаёт отдельный эндпоинт — по тому же ключу:
https://www.termoros.com/api/v1/catalog/brands/Форматы те же: ?format=json (по умолчанию), csv, xml.
{
"meta": {
"generated_at": "2026-08-12T22:52:39+03:00",
"data_date": "2026-08-12",
"brands_count": 81,
"items_without_brand": 34
},
"brands": [
{"name": "Rifar", "items_count": 11423},
{"name": "Gekon", "items_count": 9758}
]
}items_count — сколько позиций вернёт выгрузка с brand=<название> без прочих фильтров. items_without_brand — позиции, у которых бренд в 1С не заполнен: они попадают в общую выгрузку, но никаким значением brand не выбираются.
# список брендов в Excel curl -H "X-Api-Key: ВАШ_КЛЮЧ" -o brands.csv \ "https://www.termoros.com/api/v1/catalog/brands/?format=csv"
Пример ответа
{
"meta": {
"generated_at": "2026-08-12T22:52:39+03:00",
"data_date": "2026-08-12",
"partner": "Ваша компания",
"currency": "RUB",
"items_count": 36226
},
"items": [
{
"id": 255118,
"xml_id": "92760dc3-7478-11ed-a2e5-3cecef424a55",
"article": "KW.WFHT-08/W",
"name": "Термостат проводной комнатный Kromwell, белый, 230В",
"brand": "Kromwell",
"product_type": "Термостаты комнатные",
"type_id": 1857,
"unit": "шт",
"url": "https://www.termoros.com/product/termostat_provodnoy_komnatnyy_kromwell_belyy_230v/",
"photos": [
"https://www.termoros.com/upload/iblock/477/grgp3vy0pkqy56fchf06w8k59bagxe88.jpg",
"https://www.termoros.com/upload/iblock/adb/toqamgfw7ki5rh0q6436w7y3d3az43r9.png"
],
"price_retail": 3940.00,
"price_partner": 3349.00,
"discount_percent": 15,
"stocks": {"Москва": 32, "Екатеринбург": 16, "Казань": 12}
}
]
}Поля позиции
| Поле | Описание |
|---|---|
article | артикул |
xml_id | идентификатор номенклатуры в 1С (GUID) |
name, brand, product_type, unit | наименование, бренд, вид продукции, единица измерения |
type_id | ID раздела каталога — то же значение, что принимает фильтр type. В CSV это колонка «Раздел ID» |
url | карточка товара на termoros.com |
photos | фотографии товара: первой идёт главная, затем снимки галереи. У товара без изображений список пуст. В CSV это последняя колонка «Фотографии», ссылки перечислены через запятую; если фотографий нет, ячейка пустая |
price_retail | розничная цена, без округления |
price_partner | ваша цена по соглашению (= розничная − ваша скидка) |
discount_percent | ваша скидка на товар, % |
stocks | свободные остатки: город → количество (только выбранные склады). Товар, уже отложенный в резерв под заказы, из этого числа исключён — оно совпадает с остатком на карточке товара |
CSV приходит в UTF-8 c BOM и разделителем «;» — открывается в Excel двойным кликом, остатки разложены колонками по городам. Ссылки на фотографии лежат в последней колонке «Фотографии» через запятую. XML — плоская структура <catalog><item>… с теми же полями.
Кавычки и другие спецсимволы в наименованиях
В названиях товаров встречаются кавычки (1/2"), амперсанды и угловые скобки. Каждый формат экранирует их по своим правилам, поэтому в сыром файле один и тот же текст выглядит по-разному:
JSON — "Термостат погружной 1/2\", L=50 мм" · CSV — поле берётся в кавычки, а внутренняя кавычка удваивается: "Термостат погружной 1/2"", L=50 мм" · XML — < и & вместо < и &.
Это не порча данных: любой стандартный парсер (Excel, json_decode, XML-библиотека) вернёт исходную строку. Ручной разбор «по запятой» или «по кавычке» такие названия сломает — используйте парсер формата.
Ещё примеры
# прайс по двум брендам сразу в Excel-файл curl -H "X-Api-Key: ВАШ_КЛЮЧ" -o price.csv \ "https://www.termoros.com/api/v1/catalog/?format=csv&brand=Danfoss,Baxi" # остатки только по Москве и Санкт-Петербургу, XML curl -H "X-Api-Key: ВАШ_КЛЮЧ" \ "https://www.termoros.com/api/v1/catalog/?store=1,6&format=xml"
Совет: кэшируйте по ETag
Сохраните заголовок ETag из ответа и передавайте его в следующем запросе в заголовке If-None-Match. Если данные не менялись, придёт короткий ответ 304 Not Modified без тела — вы не качаете мегабайты зря, а выгрузка обновится ровно тогда, когда обновятся данные.
Если ваш клиент не умеет работать с ETag, тот же результат даёт заголовок If-Modified-Since со значением Last-Modified из прошлого ответа. Оба заголовка относятся к конкретному URL с конкретным набором фильтров: если вы храните одно общее значение «last sync» и подставляете его в запросы с разными brand/type/store/in_stock, на новом сочетании фильтров получите пустой 304 вместо данных — сохраняйте значение отдельно для каждого набора параметров.
Что попадает в выгрузку
Активные товары каталога, у которых есть цена в прайсе 1С. Позиции без цены не выгружаются — это прайс-лист, а не полный номенклатурный справочник, поэтому число позиций в выгрузке меньше числа карточек на сайте.
data_date — дата, на которую собраны данные. Снапшот пересобирается раз в сутки, в 11:00 МСК, после ночного обмена с 1С; до этого времени выгрузка отдаёт вчерашние данные и data_date честно показывает вчерашнюю дату.
Ошибки
Любая ошибка — это JSON {"error": {"code", "message"}} с корректным HTTP-статусом:
| HTTP | Код | Что делать |
|---|---|---|
| 401 | unauthorized | ключ не передан, неверный или отозван — обратитесь к менеджеру |
| 400 | bad_format / bad_filter | неверный формат или фильтры; в details указано, что именно исправить |
| 503 | snapshot_not_ready | данные ещё готовятся — повторите запрос позже |
Вопросы по интеграции вы можете направить вашему менеджеру «Терморос».








