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 за розкладом — наступна фаза.