Журнал змін
Історія змін публічного API SAMO-TRANS.
Нові записи — згори. Кожна зміна публічного контракту потрапляє сюди.
Про принципи сумісності — Версіонування.
v1.1
-
Додано: транспортні заявки отримали необов'язкове поле
vehicleType, незалежне відcarTypes. Допустимі коди віддає новийGET /reference/vehicle-types;nullуPATCHочищає значення. Поле повертається у відповіді як код абоnull. Для вантажних заявок воно не дозволене. Зміна адитивна: старі записи та інтеграції лишаються валідними. -
Додано:
GET /reference/car-typesтепер також повертає спеціалізовані коди кузовівbox_type,walking_floor_type,coil_carrier_type,timber_truck_type,concrete_mixer_typeтаhooklift_type. Це адитивна зміна довідника; інтеграціям слід читати цей ендпоінт і бути готовими до нових кодів замість закритого локального enum. -
Додано: заявка отримала необов'язковий температурний режим. У тілі створення та редагування —
temperatureMinіtemperatureMax(°C, діапазон −99…+99, будь-яку межу можна не вказувати); у відповіді —temperatureMinCіtemperatureMaxC, обидваnull, якщо режим не заданий. Поля приймаються лише разом із температурним кузовом (ref,ref-tushe,izoterm), інакше —400 validation_error.PATCH, що змінює кузов на нетемпературний, обнуляє обидві межі. Зміна адитивна: наявні інтеграції нічого не втрачають і можуть просто ігнорувати нові поля. -
Змінено: контакти в
descriptionвирізаються перед збереженням заявки — телефони, адреси електронної пошти,@нікита посилання (зокрема «голі» домени та посилання на месенджери). Діє наPOST /proposals/cargo,POST /proposals/transport,POST /proposals/batchіPATCH /proposals/{id}. Це не валідація: запит із телефоном в описі проходить успішно, помилки не буде — заявка зберігається з очищеним текстом. Наслідок для інтеграції:descriptionу відповіді й при наступномуGETможе бути коротшим за надісланий — не звіряйте ці рядки на рівність. Текст без контактів повертається без змін: дати рейсу, ЄДРПОУ, вага та ціна телефоном не вважаються. Опис поля в довіднику оновлено. -
Виправлено: нечисловий ідентифікатор населеного пункту більше не дає
500 internal.startLocalities/endLocalitiesуGET /proposals/search, а такожstartLocations[].osmIdіendLocations[].osmIdпри створенні та редагуванні заявки приймають лише додатне ціле число — OSM ID. Будь-що інше (літери, дріб, знак, число поза діапазономbigint) тепер повертає400з кодомvalidation_error; раніше такий запит падав із500 internal. Коректні ідентифікатори працюють точно як раніше. -
Змінено:
POST /proposals/{id}/bumpтепер доступний ще й власникові та менеджеру компанії, якій належить заявка, — рівно ті самі права, що вже діяли дляupdate,archiveіdelete. Раніше підняти заявку міг лише її автор або контактна особа, тож власник компанії отримував403 forbiddenна заявку власного працівника, хоча редагувати чи зняти її з ефіру міг. Обмеження прав це не звужує — доступ лише розширено, наявні інтеграції нічого не втрачають. -
GET /proposals/searchприймаєstartLocalityCountriesіendLocalityCountries— країна кожного населеного пункту зstartLocalities/endLocalities, у тому самому порядку. Разом із ними у видачу потрапляють і заявки, виставлені на всю цю країну («будь-який напрямок»), а не лише привʼязані до самого міста. Параметри необовʼязкові — без них пошук працює як раніше. -
GET /employees— перелік працівників компанії. -
GET /employees/{id}/proposals-count— кількість заявок, де працівник є контактною особою. -
PATCH /employees/{id}/status— увімкнути або тимчасово вимкнути працівника. -
PATCH /employees/{id}— змінити роль або відображуване ім'я. -
Нові області доступу
employees:readтаemployees:write. Раніше випущені ключі їх не мають — потрібен новий ключ. -
Поле
contactPersonIdтепер приймається при створенні та редагуванні заявки (зокрема в пакетному створенні). Допускаються лише власник компанії та працівники зі статусомACTIVE. -
Змінено:
GET /localities/searchтепер повертає ще й області (type: "region") — раніше у відповіді були лише країни та населені пункти, тож знайти область за назвою було неможливо. Порядок: країни → області → населені пункти. Нових полів немає, з'явився ще один тип елемента масиву — якщо ви очікуєте в кожному записіosmId, фільтруйте заtype === "locality". -
Змінено:
GET /proposals/searchвіддає закриті заявки після всіх відкритих, а всередині кожної групи — від найновіших. Раніше сортування було лише заcreatedAt, тож ізincludeInactive=trueзакриті заявки перемішувалися з відкритими. Склад відповіді не змінився — лише порядок; якщо ви покладалися на суто хронологічний порядок, сортуйте заcreatedAtу себе. -
Змінено:
descriptionпри створенні та редагуванні заявки (зокрема в пакетному створенні) обмежений 250 символами. Раніше довжина не перевірялася взагалі — приймався будь-який рядок. Довший текст тепер отримує400з кодомvalidation_error; обрізайте опис на своєму боці. Обмеження видно і в довіднику якmaxLengthполя. -
Виправлено:
GET /employeesтепер завжди повертає власника компанії з роллюOWNER. Для компаній, перенесених із попередньої платформи, цього запису не існувало, тож перелік працівників починався з найманих людей. Склад полів не змінився — з'явився ще один елемент масиву. Якщо ви рахуєте працівників за довжиною відповіді, врахуйте власника. -
Виправлено:
avatar(у працівників і в контактній особі заявки) завжди повертається абсолютним URL. Раніше для частини записів у полі лежав «голий» ключ сховища (avatars/….jpeg) — такий рядок клієнт розвʼязував відносно власної адреси й отримував 404. Формат поля не змінився, це той самий рядок з URL. -
Виправлено:
includeInactiveуGET /proposals/searchраніше сприймав будь-яке непорожнє значення якtrue— зокремаincludeInactive=falseповертав і закриті заявки. Тепер параметр читається як записано:true/1/yes/onвмикають,false/0/no/offвимикають, нерозпізнане значення дорівнює відсутньому. Якщо ваша інтеграція надсилалаfalseі розраховувала на закриті заявки, вона отримає інший набір — надсилайтеtrueявно.
v1.0
Перший публічний випуск API.
Довідники
GET /reference/countries,/reference/regions— географія.GET /reference/car-types,/load-types,/permits,/currencies,/payment-types— словники кодів із назвами п'ятьма мовами.GET /localities/search— пошук населених пунктів, джерелоosmIdдля маршрутів.
Біржа
GET /proposals/search— пошук по всій біржі з фільтрами веб-версії, параметрupdatedSinceдля інкрементальної синхронізації.GET /proposals/{id}— картка заявки.GET /companies/{id},GET /companies/{id}/reviews— картка контрагента й схвалені відгуки.
Власні заявки
POST /proposals/cargo,POST /proposals/transport— створення.POST /proposals/batch— до 25 заявок одним запитом із результатом по кожній позиції.GET /proposals/my— перелік заявок компанії, до якої прив'язаний ключ.PATCH /proposals/{id},POST /proposals/{id}/bump,/archive,/restore,DELETE /proposals/{id}.
Платформа
- Аутентифікація ключами
samo_live_з областями доступуreference:read,proposals:read,proposals:writeта необов'язковим переліком дозволених IP. - Ліміти на ключ із заголовками
X-RateLimit-*і сталими кодамиrate_limited/quota_exceeded. - Заголовок
Idempotency-Keyдля безпечних повторів запитів на запис. - Вебхуки
proposal.created/updated/deletedтаproposal.matchedіз підписомX-Samo-Signature. - Сталий конверт помилки
{ error: { code, message, requestId } }.