API
Отправляйте свой прайс в ADAM
Один HTTP-запрос заменяет таблицу. Ваша система отправляет фид, а мы строка за строкой говорим, что прочитали и чего не смогли.
Проверить payload, ничего не создавая, можно в Настройки → Интеграции → Песочница. Документ OpenAPI
Как получить ключ
Настройки → Интеграции → Подключить. Секрет показывается один раз при создании и хранится только как хеш — держите его там, где его читает ваша ERP. Отправляйте как Authorization: Bearer ….
curl -X POST https://168-119-161-237.sslip.io/v1/products \
-H "Authorization: Bearer adam_live_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"items":[{"sku":"KRB-46","name":"Карбамід 46% гранульований","brand":"Sumykhimprom","category":"Добрива","unit":"кг","price":12.5,"stock":1000,"warehouse":"Київський склад","moq":100,"updated_at":"2026-08-24T14:02:31Z"}]}'Позиция, поле за полем
| Поле | Тип | Правило |
|---|---|---|
| name | string · ≤300 обязательное | Название товара в вашей системе. Обрезается, не может быть пустым. |
| brand | string · ≤120 обязательное | Распознаётся матчером внутри категории. |
| category | string · ≤120 обязательное | В человеческом виде. Распознаётся по списку ниже. |
| unit | string · ≤40 обязательное | В человеческом виде: «шт», «шт.», «кг», «т», «канистра» — все распознаются. |
| price | number обязательное | Больше 0. Число, не строка; десятичный разделитель — «.». |
| stock | number обязательное | 0 или больше. Ноль означает «нет в наличии», а не «неизвестно». |
| sku | string · ≤100 необязательное | Ваш артикул. По схеме необязателен, но без него последующий PATCH не имеет по чему искать позицию. |
| warehouse | string · ≤200 необязательное | Сверяется с вашими адресами. Неоднозначность — предупреждение, не отказ. |
| moq | number необязательное | Больше 0. По умолчанию 1. |
| description | string · ≤500 необязательное | Свободный текст. Используется, когда строка становится заявкой на новый товар каталога. |
| updated_at | rfc3339 необязательное | Когда позиция последний раз менялась в вашей системе. Даёт правило порядка для PATCH. |
Поле, которое мы не читаем, ломает весь запрос, а не отбрасывается тихо. Тихое отбрасывание — это то, как вы начинаете верить, что задали валюту, которой не задавали.
Ответ
202, потому что строки приняты в обработку, а сопоставление и проверка ещё впереди. Отклонения называют ваш собственный индекс позиции, поэтому фид, который вы правите поэтапно, сходится.
{
"request_id": "8f14e45f-ceea-467a-9c4c-1b0f0e5c9e2a",
"job_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"accepted": 1198,
"rejected": [
{
"index": 42,
"sku": "XYZ-1",
"reason": "category_unresolved",
"detail": "«Хімія» matches no category"
},
{
"index": 87,
"sku": "KRB-99",
"reason": "required_field_missing",
"field": "brand"
}
],
"rejected_total": 2
}Коды причин
| Код | Область | Значение |
|---|---|---|
| invalid_envelope | весь запрос | Тело запроса — не объект с массивом items. |
| unknown_field | весь запрос | Поле, которое мы не читаем. Возвращаем ошибку, а не молча отбрасываем — чтобы вы не считали, что задали то, чего не задали. |
| idempotency_key_reused | весь запрос | Этот Idempotency-Key уже использован для запроса с другим телом. Возьмите новый ключ — сохранённый результат принадлежит предыдущему запросу, а не этому. |
| no_items | весь запрос | items пуст. |
| too_many_items | весь запрос | Позиций больше лимита на запрос. Отправьте меньшими партиями. |
| required_field_missing | одна строка | Содержит |
| field_too_long | одна строка | Содержит |
| price_invalid | одна строка | Не число или не больше 0. |
| stock_invalid | одна строка | Не число или отрицательное. Ноль допустим. |
| moq_invalid | одна строка | Не число или не больше 0. |
| sku_duplicate_in_payload | одна строка | Тот же артикул уже есть раньше в этом запросе. Побеждает первое вхождение. |
| updated_at_invalid | одна строка | Не RFC 3339, например 2026-08-24T14:02:31Z. |
| review_backlog | весь запрос | Ваши непроверенные строки достигли лимита. Завершите проверку, прежде чем отправлять ещё. |
| category_unresolved | одна строка | Значение не совпадает ни со slug, ни с псевдонимом. |
| unit_unresolved | одна строка | Значение не совпадает ни с одной единицей. |
| wrong_endpoint | одна строка | Вы отправили |
Закрытый набор — ваша интеграция может на них ветвиться. Один код на отклонённую строку: строка, не прошедшая несколько проверок, сообщает первую по порядку выше.
Обновление цены и остатка
Когда позиция связана, PATCH /v1/offers меняет её цену и остаток без проверки и без участия человека. Вы отправляете тот же артикул, что уже отправляли в фид товаров, а мы меняем предложение за ним. Это тот вызов, который ваша ERP делает по расписанию.
curl -X PATCH https://168-119-161-237.sslip.io/v1/offers \
-H "Authorization: Bearer adam_live_…" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"items":[{"sku":"KRB-46","price":12.9,"stock":840,"updated_at":"2026-08-25T09:00:00Z"},{"sku":"KAS-32","stock":0},{"sku":"OLD-01","discontinued":true}]}'| Поле | Тип | Правило |
|---|---|---|
| sku | string · ≤100 обязательное | Ваш артикул, тот же, что отправляли в POST /v1/products. Единственный способ назвать позицию. |
| price | number необязательное | Больше 0. Не отправляйте — цена останется как есть. |
| stock | number необязательное | 0 или больше. Ноль ставит «нет в наличии» и оставляет предложение в каталоге. |
| moq | number необязательное | Больше 0. Минимальная партия; единица измерения здесь не меняется. |
| discontinued | boolean необязательное | true снимает предложение с продажи, false возвращает. Снятие всегда проходит; возврат может быть отклонён. |
| updated_at | rfc3339 необязательное | Когда позиция последний раз менялась в вашей системе. Отправьте — и запоздавший повтор не перезапишет более новую цену; не отправите — победит последний пришедший запрос. То же время и те же значения — это no-op; то же время с другими значениями — equal_timestamp_conflict. |
Позиция требует sku и хотя бы одного из price, stock, moq, discontinued. Всё, что вы не отправили, остаётся как есть — поэтому проход только по остаткам ни разу не тронет цену. Один sku отклоняется, а не считается применённым.
Отправляйте updated_at — и повторы перестают быть опасными: позиция, чьё время старее последнего применённого, ничего не меняет и возвращается как stale_update. Не отправляйте — победит последний пришедший запрос: для одного планового задания это нормально, для двух — нет.
unchanged — это позиции, у которых предложение уже держало отправленные значения. Ничего не записано и ничего не сломано: ночной фид, отправляющий всё, получает applied за изменившееся и unchanged за остальное, а не тысячи ошибок. Тот же updated_at с теми же значениями попадает сюда же; с другими значениями это equal_timestamp_conflict, потому что одинаковое время не может сказать, какая версия актуальна.
Снятие с продажи и возврат не симметричны, и лучше знать почему, чем выяснить это на практике. discontinued: true проходит всегда — убрать собственное предложение не требует ничьего разрешения. discontinued: false возвращает его только если предложение полное и ваш аккаунт вправе публиковать; иначе строка возвращается как relist_blocked с причиной в detail.
not_published — количество применённых строк на предложениях, которых фермер не видит: черновик, приостановленное предложение. Цена действительно изменилась, но на неё никто не смотрит. Патч никогда не публикует за вас, поэтому этот показатель — то, как вы об этом узнаёте, а не гадаете, почему ничего не сдвинулось.
{
"request_id": "1c9d4b7e-3f60-4a21-8de5-7a2b6c0f9e11",
"applied": 1198,
"unchanged": 613,
"not_published": 42,
"rejected": [
{
"index": 17,
"sku": "ZIR-20",
"reason": "sku_ambiguous",
"detail": "7 of your offers carry this code: Зірочка Z-20, Зірочка Z-22, …"
},
{
"index": 63,
"sku": "KRB-46",
"reason": "stale_update",
"detail": "last applied 2026-08-25T09:00:00+00"
}
],
"rejected_total": 2
}| Код | Область | Значение |
|---|---|---|
| no_change_requested | одна строка | Только sku, без изменяемых полей. Один timestamp — не изменение: отправьте price, stock, moq или discontinued. |
| discontinued_invalid | одна строка | Присутствует, но не булево. |
| sku_unknown | одна строка | Для этого кода нет активной связи. Отправьте позицию через POST /v1/products один раз — после подтверждения PATCH работает всегда. |
| sku_ambiguous | одна строка | Этот код есть у нескольких ваших предложений, поэтому неясно, какую цену менять. |
| offer_missing | одна строка | Связь есть, но её предложение исчезло. Отправьте позицию через POST /v1/products ещё раз. |
| stale_update | одна строка | Ваш updated_at старее последнего применённого, поэтому ничего не изменилось. |
| equal_timestamp_conflict | одна строка | Ваш updated_at совпадает с уже применённым, но значения другие — мы не можем определить, какое актуально, и отказываем, а не угадываем. Сдвиньте updated_at. Если значения совпадают, позиция идёт в |
| relist_blocked | одна строка |
|
| price_tiered | одна строка | У этого предложения есть ступени цены по количеству, и одна фиксированная цена их не заменяет. Уберите ступени в кабинете — дальше позицией управляет API. |
Только коды, которые возвращает лишь этот эндпоинт. Все коды уровня запроса и все проверки значений из таблицы выше действуют и здесь, а field называет sku там, где фид товаров назвал бы десяток полей.
Категории, которые мы распознаём
Читается из каталога живьём, поэтому этот список не может разойтись с тем, что принимает резолвер. Регистр и конечная пунктуация не важны.
- seedsСемена
Hybrids · Seed · seeds · Sowing material · Гибриды · Гібриди · Кукурудза · Кукуруза · Насіннєвий матеріал · Насіння · Насіння кукурудзи · Насіння рапсу · Насіння сої · Насіння соняшника · Посевной материал · Посівний матеріал · Пшеница · Пшениця · Рапс · Семена · Семена кукурузы · Семена подсолнечника · Семена подсолнуха · Семена рапса · Семена сои · Семенной материал · Соняшник · Соя · Ячмень · Ячмінь
- fertilizersУдобрения
Fertiliser · Fertilizer · fertilizers · Growth stimulants · Micro fertilizers · Агрохимия · Агрохімія · Добрива · Микроудобрения · Микроудобрения и стимуляторы роста · Минеральные удобрения · Мікродобрива · Мікродобрива та стимулятори росту · Мінеральні добрива · Органические удобрения · Органічні добрива · Стимулятори росту · Стимуляторы роста · Удобрения
- pesticidesСредства защиты растений
Agrochemicals · CPP · Crop Protection · Fungicide · Fungicides · Herbicide · Herbicides · Insecticide · Insecticides · Pesticide · pesticides · Plant protection · Агрохимикаты · Агрохімікати · Адъюванты · Адьюванти · Акарициди · Акарициды · Гербицид · Гербициды · Гербіцид · Гербіциди · Десиканти · Десиканты · Засоби захисту · Засоби захисту рослин · ЗЗР · Инсектицид · Инсектициды · Інсектицид · Інсектициди · Пестициди · Пестициди та агрохімікати · Пестициды · Пестициды и агрохимикаты · Прилипатели · Прилипачі · Прилипачі (пав) · Протравители · Протруйник · Протруйники · Родентициди · Родентициды · СЗР · Средства защиты · Средства защиты растений · Фунгицид · Фунгициды · Фунгіцид · Фунгіциди
- fuel-lubricantsГорюче-смазочные материалы
Diesel · Fuel · fuel-lubricants · Grease · Lubricants · Oils · Антифриз · Бензин · Горюче-смазочные материалы · ГСМ · Дизельне пальне · Дизельное топливо · ДТ · Масла · Мастила · Пальне · Пально-мастильні матеріали · ПММ · Смазки · Топливо
- machineryТехника
Combines · Equipment · Implements · machinery · Tractors · Комбайни · Комбайны · Обладнання · Оборудование · Прицепы · Причепи · Сельхозтехника · Сільгосптехніка · Техника · Техніка · Трактори · Тракторы
- spare-partsЗапчасти
Bearings · Belts · Filters · Parts · spare-parts · Детали · Деталі · Запчасти · Запчастини · Ножи · Ножі · Підшипники · Подшипники · Ремені · Ремни · Фильтры · Фільтри
- tires-wheelsШины и диски
Rims · Tires · tires-wheels · Tyres · Wheels · Диски · Колеса · Колёса · Покришки · Покрышки · Шини · Шини та диски · Шины · Шины и диски
- suppliesРасходные материалы
supplies · Витратні матеріали · Расходные материалы · Спецодежда · Спецодяг · Тара · Упаковка
- servicesУслуги
services · Послуги · Сервис · Сервіс · Услуги
- livestockЖивотноводство
livestock · Ветпрепарати · Ветпрепараты · Животноводство · Корма · Корми · Тваринництво
- energy-systemsЭнергосистемы
energy-systems · Генератори · Генераторы · Енергосистеми · Солнечные панели · Сонячні панелі · Энергосистемы
Единицы, которые мы распознаём
- piece
шт · штука · штук · штуки · од · одиниця · pcs · pc · piece · unit
- kg
кг · кілограм · килограмм · кілограмів · kg
- ton
т · t · тонна · тонн · тонни · ton · tonne
- liter
л · l · літр · литр · літрів · liter · litre
- bag
мішок · мешок · мішків · bag
- pack
уп · пак · пачка · упаковка · паковання · pack
- canister
каністра · канистра · кан · canister
- bottle
пляшка · бутылка · флакон · bottle
- set
набір · набор · set
- hectare
га · гектар · гектарів · ha · hectare
Лимиты и идемпотентность
- POST /v1/products — 5000 × 10 min · 30 req / 10 min
- PATCH /v1/offers — 5000 × 60 s · 30 req / 60 s
- 20000 unresolved rows · 10 open jobs
Отправляйте Idempotency-Key на каждом настоящем вызове. Повтор с тем же ключом возвращает сохранённый результат — то же задание, те же отклонения — и ничего не создаёт, так что таймаут на вашей стороне никогда не станет вторым прайсом. Повтор несёт первые 20 отклонений и rejected_total; остальное берите из эндпоинта отклонений.
Что происходит дальше
Принятые строки сопоставляются с нашим каталогом и попадают на ваш экран проверки. Позицию, которую мы распознали, вы подтверждаете там; ту, которую не распознали, становится заявкой на новый товар каталога. Проверка — шаг человека, и он не мгновенный: планируйте первый фид с учётом этого. Это также однократно: когда позиция связана, её цена и остаток идут через PATCH /v1/offers и больше никогда не встают в очередь на проверку.
Пока не поддерживается
currency, vat_rate и lead_time_days не читаются ни на одном из эндпоинтов, поэтому их отправка — ошибка, а не тихое отбрасывание. Ступени цены по количеству через API тоже не редактируются: предложение со ступенями отклоняет фиксированную price как price_tiered. Возможность забирать фид с вашего URL по расписанию — следующая фаза.