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"}]}'

Позиція, поле за полем

ПолеТипПравило
namestring · ≤300
обов’язкове
Назва товару у вашій системі. Обрізається, не може бути порожньою.
brandstring · ≤120
обов’язкове
Розпізнається матчером у межах категорії.
categorystring · ≤120
обов’язкове
У людському вигляді. Розпізнається за списком нижче.
unitstring · ≤40
обов’язкове
У людському вигляді: «шт», «шт.», «кг», «т», «каністра» — усі розпізнаються.
pricenumber
обов’язкове
Більше 0. Число, не рядок; десятковий розділювач — «.».
stocknumber
обов’язкове
0 або більше. Нуль означає «немає в наявності», а не «невідомо».
skustring · ≤100
необов’язкове
Ваш артикул. За схемою необов’язковий, але без нього подальший PATCH не має за чим шукати позицію.
warehousestring · ≤200
необов’язкове
Звіряється з вашими адресами. Неоднозначність — попередження, не відмова.
moqnumber
необов’язкове
Більше 0. За замовчуванням 1.
descriptionstring · ≤500
необов’язкове
Вільний текст. Використовується, коли рядок стає заявкою на новий товар каталогу.
updated_atrfc3339
необов’язкове
Коли позиція останній раз змінилася у вашій системі. Дає правило порядку для 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 — обов’язкове поле, якого немає або воно порожнє. На PATCH /v1/offers це завжди sku.

field_too_longодин рядок

Містить field. Межа для кожного поля — у таблиці вище.

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один рядок

Ви надіслали discontinued сюди. Зняття з продажу й повернення — це PATCH /v1/offers.

Закритий набір — ваша інтеграція може на них розгалужуватися. Один код на відхилений рядок: рядок, що не пройшов кілька перевірок, повідомляє першу за порядком вище.

Оновлення ціни й залишку

Коли позицію зв’язано, 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}]}'
ПолеТипПравило
skustring · ≤100
обов’язкове
Ваш артикул, той самий, що надсилали в POST /v1/products. Єдиний спосіб назвати позицію.
pricenumber
необов’язкове
Більше 0. Не надсилайте — ціна залишиться як є.
stocknumber
необов’язкове
0 або більше. Нуль ставить «немає в наявності» й залишає пропозицію в каталозі.
moqnumber
необов’язкове
Більше 0. Мінімальна партія; одиниця виміру тут не змінюється.
discontinuedboolean
необов’язкове
true знімає пропозицію з продажу, false повертає. Зняття завжди проходить; повернення може бути відхилене.
updated_atrfc3339
необов’язкове
Коли позиція останній раз змінилася у вашій системі. Надішліть — і запізніла повторна спроба не перезапише новішу ціну; не надішлете — переможе останній запит, що надійшов. Той самий час і ті самі значення — це 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один рядок

Присутнє, але не булеве. "yes" — це не true.

sku_unknownодин рядок

Для цього коду немає активного зв’язку. Надішліть позицію через POST /v1/products один раз — після підтвердження PATCH працює завжди.

sku_ambiguousодин рядок

Цей код мають кілька ваших пропозицій, тому неясно, яку ціну змінювати. detail перелічує товари. Дайте їм різні коди у своїй системі.

offer_missingодин рядок

Зв’язок є, але його пропозиція зникла. Надішліть позицію через POST /v1/products ще раз.

stale_updateодин рядок

Ваш updated_at старіший за останній застосований, тому нічого не змінилося. detail містить наш timestamp.

equal_timestamp_conflictодин рядок

Ваш updated_at збігається з уже застосованим, але значення інші — ми не можемо визначити, яке актуальне, і відмовляємо, а не вгадуємо. Змістіть updated_at. Якщо значення однакові, позиція йде в unchanged і помилки немає.

relist_blockedодин рядок

discontinued: false відхилено перевіркою публікації. Зняття з продажу завжди проходить; повернення потребує повної пропозиції та права публікувати. detail містить причину.

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

+380 (67) 419-07-94