Перейти до вмісту

API призначень та вебхуки ​

Публічне API Clinica Web для роботи з призначеннями у протоколі пацієнта: ліками, послугами та моніторингом. REST API дає змогу читати, створювати, змінювати й видаляти призначення; вебхуки повідомляють зовнішню систему про збережені зміни.

Swagger: усі методи · схема вхідного вебхука · OpenAPI JSON.

Зміст

Підключення та формат даних ​

Приклади використовують базову адресу https://{client}.medakadem.com.ua.  Ідентифікатори пацієнтів, протоколів, послуг і призначень належать базі цього екземпляра.

Для зовнішніх викликів передавайте Authorization: Bearer <access_token>. Запити з тілом мають Content-Type: application/json. Отримання й використання токена описані в інструкціях отримання токена та використання токена, на які посилається Swagger.

ScopeДля чого потрібен
gambit:public:patient:readЧитання призначень ліків, послуг і моніторингу у протоколі; читання моніторингу пацієнта.
gambit:public:patient:writeСтворення, зміна та видалення призначень у протоколі.
gambit:webhooksКерування підписками на вебхуки та виклик демонстраційного методу.
gambit:static_dataДовідник показників моніторингу, пошук ліків і довідники форм та одиниць.
gambit:erp:packagesОтримання каталогу послуг.
gambit:erpДодаткові методи читання направлення за ID і направлень пацієнта.

У шляхах нижче patientId — ID пацієнта, protocolId — ID протоколу, protocolDrugId — ID призначення ліків, assignmentId — ID призначення моніторингу, referralSalepackPackageId — ID призначеної послуги. Це цілі числа. Для створення протокол має існувати та належати зазначеному пацієнту. ID підписки на вебхук має формат UUID.

Регістр JSON є частиною контракту. Ліки та вкладені об’єкти ліків використовують camelCase. Послуги, моніторинг, підписки та оболонка вебхука використовують PascalCase. Усередині ProtocolDrug у вебхуку зберігається camelCase.

Переліки значень. Для розкладу, зв’язку з їжею, правил нагадування, додаткових умов і PackageType використовуйте рядкові назви, наведені далі. Для Trigger, Triggers, AssuranceAproveState, Status і removeReasonId використовуйте числові коди.

Дата з часом передається в ISO 8601, наприклад 2026-11-02T09:00:00+02:00; локальний час нагадування — як 08:00:00. Значення null і пропуск поля не означають часткове оновлення: правила конкретного PUT наведені в розділах нижче.

Призначення ліків ​

Основний шлях: /api/erp/v1/patients/{patientId}/protocol/{protocolId}/drugs. Методи читання потребують gambit:public:patient:read, зміни — gambit:public:patient:write.

HTTP і суфікс шляхуРезультатSwagger
GET без суфікса200: масив ERPProtocolDrugDto; 404, якщо протокол не належить пацієнту або відсутній.GetProtocolDrugs
POST без суфікса201: створене призначення ERPProtocolDrugDto і заголовок Location; 400, 404.CreateProtocolDrug
PUT /{protocolDrugId}200 без тіла; 400, 404.UpdateProtocolDrug
DELETE /{protocolDrugId}204 без тіла; 404.DeleteProtocolDrug

Поля запиту на створення ​

ПолеТип і обов’язковістьОпис
drugobject, обов’язковеЛіки з локального довідника або дані для створення локального запису. Поля наведені нижче.
descriptionstring або nullКоментар до призначення, до 500 символів.
assignmentDetailsobject, обов’язковеДозування та розклад.
Поле drugТипОпис і значення
idintegerID локального запису ліків.
pharmacyIdUUIDІдентифікатор каталогу ліків.
namestring, обов’язковеНазва ліків, непорожня, до 300 символів; потрібна й при передаванні ID.
componentstring або nullДіюча речовина або склад.
atxCodestring або nullATC/АТХ-код. Назва JSON-поля саме atxCode.
dosagestring або nullТекстове дозування препарату в довіднику.
dosageUnitstring або nullОдиниця дозування препарату в довіднику.
medicationFormstring або nullФорма препарату в довіднику.
manufacturestring або nullВиробник. Назва JSON-поля саме manufacture.

Якщо ліки за вибраним ідентифікатором не знайдено, сервіс створює запис із переданих даних drug. Для повторного використання ліків передавайте відомий id або pharmacyId; не використовуйте пошук за невідомим ID як перевірку існування.

Дозування та розклад ліків ​

Поле assignmentDetailsТип і обов’язковістьОпис і обмеження
medicationFormstring або nullКод форми з MEDICATION_FORM, до 100 символів.
dosageAmountnumber або nullКількість на прийом; якщо задана, має бути > 0.
dosageUnitstring або nullКод одиниці з MEDICATION_UNIT, до 100 символів. Обов’язкова непорожня одиниця, якщо задано dosageAmount.
mealRelationstring enum або nullUnspecified, BeforeMeal, WithMeal, AfterMeal, Irrelevant; значення розшифровані в розділі переліків.
scheduleobject, обов’язковеРозклад. У ліків усі його поля мають camelCase; повний перелік наведений у спільному розділі розкладу.

Зміна та відповідь API ​

PUT приймає description, обов’язковий assignmentDetails та необов’язковий drugName. description і assignmentDetails замінюють поточні значення; для зміни лише назви також передайте актуальний розклад. drugName: null або пропуск поля залишає назву без змін. Непорожня назва до 300 символів перейменовує локальні ліки після обрізання пробілів. Каталожні ліки з ненульовим pharmacyId не перейменовуються: сервер повертає 400 з кодом catalog_drug_rename. Якщо локальні ліки використовуються іншими призначеннями, створюється окрема копія для цього призначення.

Поле ERPProtocolDrugDtoТипОпис
idintegerID призначення; відрізняється від drug.id.
patientIdintegerID пацієнта.
protocolIdintegerID протоколу.
delbooleanОзнака логічного видалення. REST-список приховує видалені призначення; вебхук видалення містить true.
drugobjectОб’єкт ліків із наведеними вище полями.
descriptionstring або nullЗбережений коментар.
assignmentDetailsobject або nullДозування та розклад; у старих записів можуть бути відсутні структуровані деталі.
daysCount, perDayCountintegerПоля сумісності для тривалості та кількості прийомів. Нові запити їх не приймають; використовуйте assignmentDetails.schedule.
dosestring або nullТекстове дозування для сумісності. Нові запити його не приймають; використовуйте структуровані поля дозування.

Приклад створення ліків ​

POST /api/erp/v1/patients/7/protocol/42/drugs. Ідентифікатори та назва нижче демонстраційні.

{
  "drug": {
    "id": 0,
    "pharmacyId": "00000000-0000-0000-0000-000000000000",
    "name": "Демонстраційний препарат",
    "component": null,
    "atxCode": null,
    "dosage": null,
    "dosageUnit": null,
    "medicationForm": null,
    "manufacture": null
  },
  "description": "Демонстраційний коментар",
  "assignmentDetails": {
    "medicationForm": null,
    "dosageAmount": 1,
    "dosageUnit": "PIECE",
    "mealRelation": "AfterMeal",
    "schedule": {
      "frequency": "Daily",
      "weekdays": [],
      "intervalValue": null,
      "intervalUnit": null,
      "cycleActiveDays": null,
      "cyclePauseDays": null,
      "multiplicity": "Twice",
      "everyHours": null,
      "reminders": [
        {
          "time": "08:00:00",
          "dosageAmount": 1,
          "dosageUnit": "PIECE"
        },
        {
          "time": "20:00:00",
          "dosageAmount": 1,
          "dosageUnit": "PIECE"
        }
      ],
      "durationDays": 7
    }
  }
}

Призначення послуг ​

Основний шлях: /api/erp/v1/patients/{patientId}/protocol/{protocolId}/referralSalepackPackages. Методи читання потребують gambit:public:patient:read, зміни — gambit:public:patient:write. Послуга прив’язується до вихідної замовленої послуги протоколу.

HTTP і суфікс шляхуРезультатSwagger
GET без суфікса200: масив повних ERPReferralSalepackPackage; Swagger також декларує 404.GetProtocolServices
POST без суфікса201: SavedERPReferralSalepackPackage і Location; 400, 404.CreateProtocolService
PUT /{referralSalepackPackageId}200: SavedERPReferralSalepackPackage; 400, 404.UpdateProtocolService
DELETE /{referralSalepackPackageId}204 без тіла; необов’язковий query-параметр removeReasonId; 400, 404.DeleteProtocolService

Поля створення та зміни послуги ​

ПолеТип і обов’язковістьОпис і значення
ProtocolIdinteger, обов’язкове, > 0Має точно збігатися з protocolId у шляху. Незбіг дає 400 з помилкою ProtocolId.
PackageIdinteger, обов’язкове, > 0ID доступної послуги з каталогу. При створенні недоступна послуга дає 400. PUT не змінює послугу на іншу: передавайте поточний ID; для іншої послуги створіть нове призначення.
AssuranceAproveStateinteger enumСтан погодження страховою: 0 NONE, 1 REJECTED, 2 APROVED, 3 PARTIALLY. Якщо пропущено, значення 0.
TargetDatedate-time або nullПланова дата послуги; не є датою нагадування.
RecommendationDetailsobject або nullУмови рекомендації та нагадування. При PUT null або пропуск зберігає наявні деталі; переданий об’єкт замінює їх.
Поле RecommendationDetailsТипОпис і умови
ReminderRulestring enumSpecificDate, DaysAfterMedication, NoDate, TreatmentDay. Типове значення при пропуску в об’єкті — NoDate; Unspecified не допускається валідатором.
ReminderDatedate-time або nullОбов’язкове для SpecificDate.
DaysAfterMedicationinteger або nullКількість днів після приймання ліків; обов’язкове > 0 для DaysAfterMedication.
TreatmentDayinteger або nullДень лікування; обов’язкове > 0 для TreatmentDay.
AdditionalConditionstring enum або nullFasting, OneHourBeforeMeal, OneHourAfterMeal, WithMeal, Other; Unspecified не допускається.
AdditionalConditionTextstring або nullНепорожній текст для умови Other; під час збереження обрізаються пробіли.
Recipientstring або nullАдресат рекомендації; під час збереження обрізаються пробіли.

Зберігається лише дата або числовий параметр, що відповідає вибраному ReminderRule; решта скидається в null. AdditionalConditionText зберігається лише для Other. У PUT надсилайте актуальні ProtocolId, PackageId, AssuranceAproveState і TargetDate: пропущений TargetDate стає null, а пропущений стан погодження — 0.

removeReasonId передається в query при DELETE: 0 — CorrectionOfAppointments (корекція призначень), 1 — PatientRefusal (відмова пацієнта), 2 — AlreadyDone (вже виконано). Причину можна не передавати.

Поля відповіді послуги ​

Відповіді POST і PUT мають тип SavedERPReferralSalepackPackage: усі поля редагування та Id — ID збереженого призначення. GET і вебхуки повертають повний ERPReferralSalepackPackage, який додатково містить наведені нижче поля.

Додаткове полеТипОпис
PackageCodestring або nullКод послуги з каталогу.
PackageNamestring або nullНазва послуги.
PackageTypestring enumGroup, Protocol, Analize, MaterialSale.
Statusinteger enum0 None, 1 PatientRefusal, 2 AlreadyDone, 3 RemindedLater, 4 NotReachedByPhone.
PatientIdintegerID пацієнта.
SourceDiscoveryIdintegerID лікаря або користувача, який видав направлення.
SourcePrerecordIdinteger або nullID вихідного запису на прийом, під час якого виникла рекомендація.
SourceSalepackIdintegerID вихідної замовленої послуги.
SourceSalepackCreatedAtdate-timeДата створення вихідної замовленої послуги.
CreatedAtdate-timeДата створення призначення.
PrerecordIdinteger або nullID запису на прийом, створеного на підставі призначення.
SalepackIdsarray of integerID замовлених послуг, створених на підставі призначення.

Приклад створення послуги ​

POST /api/erp/v1/patients/7/protocol/42/referralSalepackPackages. PackageId потрібно замінити на реальний ID каталогу.

{
  "ProtocolId": 42,
  "PackageId": 101,
  "AssuranceAproveState": 0,
  "TargetDate": "2026-11-02T09:00:00+02:00",
  "RecommendationDetails": {
    "ReminderRule": "SpecificDate",
    "ReminderDate": "2026-11-01T10:00:00+02:00",
    "DaysAfterMedication": null,
    "TreatmentDay": null,
    "AdditionalCondition": "Other",
    "AdditionalConditionText": "Демонстраційна умова",
    "Recipient": "Пацієнт"
  }
}

Додаткове читання направлень ​

Метод і шляхВідповідь та доступSwagger
GET /api/erp/v1/referral-salepack-package/{id}Повний ERPReferralSalepackPackage; scope gambit:erp.GetReferral
GET /api/public/v1/patients/{id}/referral-salepack-packagesМасив повних направлень пацієнта; scope gambit:erp.GetPatientReferrals

Призначення моніторингу ​

Основний шлях: /api/erp/v1/patients/{patientId}/protocol/{protocolId}/monitoring-assignments. Читання потребує gambit:public:patient:read, зміни — gambit:public:patient:write. Призначення визначає показник і розклад спостереження; збереження розкладу саме по собі не надсилає пацієнту нагадування.

HTTP і суфікс шляхуРезультатSwagger
GET без суфікса200: масив ERPProtocolMonitoringAssignment.GetProtocolMonitoringAssignments
GET /{assignmentId}200: одне призначення; 404.GetProtocolMonitoringAssignment
POST без суфікса201: створене призначення і Location; 400, 404.CreateProtocolMonitoringAssignment
PUT /{assignmentId}200 без тіла; 400, 404.UpdateProtocolMonitoringAssignment
DELETE /{assignmentId}204 без тіла; 404.DeleteProtocolMonitoringAssignment
GET /api/erp/v1/patients/{patientId}/monitoring-assignments — повний шлях200: масив призначень пацієнта з різних протоколів.GetPatientMonitoringAssignments

Поля моніторингу ​

Поле запитуТип і обов’язковістьОпис
MonitoringIndicatorIdinteger, обов’язкове для POST, > 0ID показника з довідника моніторингу. У PUT цього поля немає; PUT змінює лише розклад.
ScheduleDetailsobject, обов’язкове для POST і PUTРозклад із полями PascalCase, описаними далі. PUT повністю замінює розклад.
Поле відповідіТипОпис
IdintegerID призначення моніторингу.
PatientIdintegerID пацієнта.
ProtocolIdintegerID протоколу.
DelbooleanОзнака логічного видалення. Видалені записи приховані в REST-читанні; вебхук видалення містить true.
MonitoringIndicatorIdintegerID показника.
MonitoringIndicatorNamestring або nullНазва показника.
MonitoringIndicatorUnitstring або nullКод одиниці показника з eHealth/ucum/units, до 255 символів. Використовується для відображення.
ScheduleDetailsobjectЗбережений розклад. Нагадування містять лише час, без дозування.

Приклад створення моніторингу ​

POST /api/erp/v1/patients/7/protocol/42/monitoring-assignments. MonitoringIndicatorId потрібно замінити на реальний ID показника.

{
  "MonitoringIndicatorId": 30,
  "ScheduleDetails": {
    "Frequency": "SpecificWeekdays",
    "Weekdays": [
      "Monday",
      "Wednesday",
      "Friday"
    ],
    "IntervalValue": null,
    "IntervalUnit": null,
    "CycleActiveDays": null,
    "CyclePauseDays": null,
    "Multiplicity": "Once",
    "EveryHours": null,
    "Reminders": [
      {
        "Time": "08:00:00"
      }
    ],
    "DurationDays": 14
  }
}

Розклад ліків і моніторингу ​

Розклад має однакові основні поняття, але різний регістр назв полів. У ліків він міститься в assignmentDetails.schedule, у моніторингу — в ScheduleDetails. frequency або Frequency задає дні виконання; multiplicity або Multiplicity — кратність протягом дня.

Поле ліківПоле моніторингуТип і правила
frequencyFrequencyРядковий DoctorAssignmentFrequency. Явно передавайте потрібне значення; при пропуску типове значення Unspecified.
weekdaysWeekdaysМасив рядкових DoctorAssignmentWeekday; типово [], null не допускається. Для SpecificWeekdays потрібен непорожній масив унікальних днів. У моніторингу Unspecified не допускається як день.
intervalValueIntervalValueinteger або null; для Interval обов’язкове > 0.
intervalUnitIntervalUnitРядковий DoctorAssignmentIntervalUnit або null; для Interval обов’язкове. У моніторингу Unspecified не допускається.
cycleActiveDaysCycleActiveDaysinteger або null; для частоти RepeatingCycle обов’язкове > 0.
cyclePauseDaysCyclePauseDaysinteger або null; для частоти RepeatingCycle обов’язкове ≥ 0.
multiplicityMultiplicityРядковий DoctorAssignmentMultiplicity; при пропуску Unspecified.
everyHoursEveryHoursinteger або null; для кратності EveryHours обов’язкове > 0.
remindersRemindersМасив нагадувань, типово []. У моніторингу null і null-елементи не допускаються. Формати елементів наведені нижче.
durationDaysDurationDaysinteger або null; якщо задане, > 0.

Числові параметри розкладу зберігаються як short: позитивні значення мають бути в межах 1–32767; для паузи допустимий також 0. Swagger відображає їх як integer/int32.

Для моніторингу сервер залишає лише параметри вибраної частоти: дні тижня для SpecificWeekdays, інтервал для Interval, активні дні та паузу для RepeatingCycle. EveryHours зберігається лише при однойменній кратності. Інші залежні параметри очищуються. Передавайте лише параметри, які відповідають вибраному розкладу.

НагадуванняПолеТип і значення
ЛікиtimeЛокальний час, наприклад 08:00:00.
ЛікиdosageAmountnumber або null; кількість для цього часу прийому.
ЛікиdosageUnitstring або null; код одиниці для цього часу прийому.
МоніторингTimeОбов’язковий локальний час із точністю до хвилини: 08:00:00; секунди й частки секунди мають бути нульовими.

Частота виконання ​

JSON значенняКод enumЗначення
"Unspecified"0Не визначено.
"Daily"1Щодня.
"EveryOtherDay"2Через день.
"SpecificWeekdays"3У вибрані дні тижня.
"RepeatingCycle"4Повторюваний цикл активних днів і паузи.
"Interval"5Через заданий інтервал.
"AsNeeded"6За потреби.

Дні тижня та одиниці інтервалу ​

ПерелікJSON значення і відповідні коди
DoctorAssignmentWeekday"Unspecified" = 0; "Monday" = 1; "Tuesday" = 2; "Wednesday" = 3; "Thursday" = 4; "Friday" = 5; "Saturday" = 6; "Sunday" = 7.
DoctorAssignmentIntervalUnit"Unspecified" = 0; "Day" = 1; "Week" = 2; "Month" = 3.

Коди в цьому розділі пояснюють enum. У JSON-полях розкладу та елементах масиву днів використовуйте рядкові назви.

Кратність протягом дня ​

JSON значенняКод enumЗначення
"Unspecified"0Не визначено.
"Once"1Один раз.
"Twice"2Двічі.
"ThreeTimes"3Тричі.
"MoreThanThree"4Більше трьох разів.
"EveryHours"5Кожні N годин; потрібне everyHours або EveryHours.
"RepeatingCycle"6Повторювана кратність. Параметри активних днів і паузи належать до частоти RepeatingCycle.
"AsNeeded"7За потреби.

Зв’язок приймання ліків із їжею ​

mealRelation у JSONКод enumЗначення
"Unspecified"0Не визначено.
"BeforeMeal"1До їжі.
"WithMeal"2Під час їжі.
"AfterMeal"3Після їжі.
"Irrelevant"4Незалежно від їжі.
null—Зв’язок не заданий.

Правила нагадування послуги ​

ReminderRule у JSONКод enumЗначення
"Unspecified"0Значення enum; нові запити його не приймають.
"SpecificDate"1На конкретну дату ReminderDate.
"DaysAfterMedication"2Через DaysAfterMedication днів після приймання ліків.
"NoDate"3Без визначеної дати; типове значення.
"TreatmentDay"4На TreatmentDay день лікування.
AdditionalCondition у JSONКод enumЗначення
"Unspecified"0Значення enum; у запиті використовуйте null, якщо умови немає.
"Fasting"1Натщесерце.
"OneHourBeforeMeal"2За годину до їжі.
"OneHourAfterMeal"3Через годину після їжі.
"WithMeal"4Під час їжі.
"Other"5Інша умова; потрібний AdditionalConditionText.

Типи та статуси послуг ​

ПолеЗначення
PackageType — рядок"Group" = 0 — група; "Protocol" = 1 — протокол/консультаційна послуга; "Analize" = 2 — аналіз; "MaterialSale" = 3 — продаж матеріалів. Назва "Analize" зберігається саме в такому написанні.
AssuranceAproveState — число0 NONE — без погодження; 1 REJECTED — відхилено; 2 APROVED — погоджено; 3 PARTIALLY — погоджено частково. Назви Aprove і APROVED відповідають контракту.
Status — число0 None — без окремого статусу; 1 PatientRefusal — відмова пацієнта; 2 AlreadyDone — вже виконано; 3 RemindedLater — нагадати пізніше; 4 NotReachedByPhone — не додзвонилися.

Довідники для заповнення полів ​

Коди форм та одиниць потрібно брати з відповідного довідника, передавати саме код, а не перекладену назву.

МетодПризначенняSwagger
GET /api/erp/v1/drugs?search={text}Пошук локальних ліків. Повертає масив DrugDto; scope gambit:static_data.SearchDrugs
GET /api/erp/v1/drugs/catalog/search?search={text}Пошук ліків у каталозі з відповіддю DrugDto[]; scope gambit:static_data.SearchCatalogDrugs
GET /api/erp/v1/packagesКаталог послуг для вибору PackageId; scope gambit:erp:packages.GetPackages
GET /api/v2/dictionaries/{name}Довідники MEDICATION_FORM для форми та MEDICATION_UNIT для одиниці дозування; scope gambit:static_data.GetAppDictionariesByName
GET /api/erp/v1/monitoring-indicators?q={text}Список показників моніторингу; необов’язковий пошук q; scope gambit:static_data.GetMonitoringIndicators
GET /api/erp/v1/monitoring-indicators/{id}Один показник моніторингу; 200 або 404; scope gambit:static_data.GetMonitoringIndicator

DrugDto описаний у розділі ліків. Об’єкт показника моніторингу має Id (integer), Name (непорожній string, до 500 символів після обрізання пробілів) і Unit (string або null, до 255 символів). Приклад коду одиниці моніторингу — mm[Hg].

Керування довідником моніторингу ​

Для зовнішнього API потрібен scope gambit:static_data. Тіло POST і PUT: { "Name": "Демонстраційний показник", "Unit": "mm[Hg]" }.

МетодРезультатSwagger
POST /api/erp/v1/monitoring-indicators201: показник; 400 — валідація; 409 — конфлікт.CreateMonitoringIndicator
PUT /api/erp/v1/monitoring-indicators/{id}200: показник; 400, 404, 409.UpdateMonitoringIndicator
DELETE /api/erp/v1/monitoring-indicators/{id}204 без тіла; 404.DeleteMonitoringIndicator

Вебхуки призначень ​

Зовнішня система реєструє URL свого обробника та потрібні тригери через /api/webhooks. Clinica Web надсилає на цей URL HTTP POST із JSON-об’єктом WebhookUpdateEvent. Для керування підписками потрібен scope gambit:webhooks.

Основне посилання: приклад обробника та схема WebhookUpdateEvent у Swagger. Метод /api/webhooks/dummy є демонстрацією контракту; для інтеграції в Uri потрібно вказати URL власного сервісу.

Методи керування підписками ​

МетодВідповідьSwagger
GET /api/webhooks200: масив підписок поточного API-клієнта WebhookDescription[].GetWebhooks
GET /api/webhooks/{id}200: WebhookDetails; 404.GetWebhookById
POST /api/webhooks200: UUID створеної підписки; 400 — валідація.CreateWebhook
PUT /api/webhooks/{id}200 без тіла; 400, 404 за Swagger.UpdateWebhook
DELETE /api/webhooks/{id}200 без тіла. Swagger також декларує 404.DeleteWebhook
POST /api/webhooks/dummyДемонстраційний приймач WebhookUpdateEvent; повертає 200.HandleExampleWebhook

При видаленні підписки поточна реалізація повертає 200 також тоді, коли не знайдено підписку цього клієнта; такий результат не підтверджує, що запис існував.

Поле POST і PUTТип і обов’язковістьОпис
UriURI string, обов’язковеАдреса обробника у зовнішній системі. Для інтеграції використовуйте повну HTTPS-адресу.
Triggersarray of integer, обов’язковий непорожній масивКоди подій, на які підписується зовнішня система. Для всіх змін призначень — 10–18.
SecretTokenstring або nullНеобов’язковий секрет до 255 символів. При доставці передається в заголовку X-ClinicaWeb-Token.

PUT підписки передає весь набір Uri, Triggers, SecretToken; пропуск секрету прибирає його значення. Зміни підписок можуть поширюватися між процесами до 5 хвилин.

Додаткове поле відповідіДе повертаєтьсяОпис
IdСписок і деталіUUID підписки.
LastErrorMessageЛише деталіТекст збереженої останньої помилки або null.
LastErrorDateЛише деталіДата збереженої останньої помилки або null.

Список і деталі також містять Uri, Triggers і SecretToken. Обмежуйте доступ до відповідей із секретом так само, як до конфігурації інтеграції.

Приклад підписки на всі зміни призначень ​

POST https://dev.medakadem.com.ua/api/webhooks з Bearer-токеном зі scope gambit:webhooks:

{
  "Uri": "https://integration.example.com/webhooks/clinica-assignments",
  "Triggers": [
    10,
    11,
    12,
    13,
    14,
    15,
    16,
    17,
    18
  ],
  "SecretToken": "REPLACE_WITH_YOUR_SECRET"
}

Сервер повертає UUID як JSON-рядок, наприклад "11111111-1111-4111-8111-111111111111". Збережіть його для читання, зміни або видалення підписки.

Події призначень ​

Код TriggerНазва подіїЗаповнене поле
10ReferralSalepackPackageCreated — створено послугуReferralSalepackPackage
11ReferralSalepackPackageDeleted — видалено послугуКонтракт передбачає ReferralSalepackPackage; поточне обмеження доставки описане нижче.
12ReferralSalepackPackageUpdated — змінено послугуReferralSalepackPackage
13ProtocolDrugCreated — створено призначення ліківProtocolDrug
14ProtocolDrugDeleted — видалено призначення ліківProtocolDrug
15ProtocolDrugUpdated — змінено призначення ліківProtocolDrug
16ProtocolMonitoringAssignmentCreated — створено моніторингProtocolMonitoringAssignment
17ProtocolMonitoringAssignmentDeleted — видалено моніторингProtocolMonitoringAssignment
18ProtocolMonitoringAssignmentUpdated — змінено моніторингProtocolMonitoringAssignment

Оболонка повідомлення ​

Поле WebhookUpdateEventТипКоли заповнюється
Triggerinteger enum, обов’язковеКод події.
ProtocolDrugERPProtocolDrugDtoТригери 13–15. Поля всередині мають camelCase; повна схема описана в розділі ліків.
ProtocolMonitoringAssignmentERPProtocolMonitoringAssignmentТригери 16–18. Поля всередині мають PascalCase.
ReferralSalepackPackageERPReferralSalepackPackageТригери 10 і 12; для 11 є обмеження доставки. Повна модель послуги, включно з вихідними даними та пов’язаними записами.
Prerecord, Patient, Order, ProtocolІнші об’єкти WebhookUpdateEventДля інших типів подій, перелічених нижче.

Повідомлення призначення містить Trigger і відповідний об’єкт. Незадіяні payload-поля з null пропускаються. Для ідентифікації використовуйте ID призначення, пацієнта та протоколу з payload; не ототожнюйте ID призначення ліків з ID запису drug або ID призначеної послуги з PackageId.

Приклад повідомлення про зміну ліків ​

На власний обробник надходять заголовки Content-Type: application/json і, якщо задано секрет, X-ClinicaWeb-Token: REPLACE_WITH_YOUR_SECRET.

{
  "Trigger": 15,
  "ProtocolDrug": {
    "id": 10,
    "patientId": 7,
    "protocolId": 42,
    "del": false,
    "drug": {
      "id": 55,
      "pharmacyId": "00000000-0000-0000-0000-000000000000",
      "name": "Демонстраційний препарат",
      "component": null,
      "atxCode": null,
      "dosage": null,
      "dosageUnit": null,
      "medicationForm": null,
      "manufacture": null
    },
    "description": "Демонстраційний коментар",
    "assignmentDetails": {
      "medicationForm": null,
      "dosageAmount": 1,
      "dosageUnit": "PIECE",
      "mealRelation": "AfterMeal",
      "schedule": {
        "frequency": "Daily",
        "weekdays": [],
        "intervalValue": null,
        "intervalUnit": null,
        "cycleActiveDays": null,
        "cyclePauseDays": null,
        "multiplicity": "Twice",
        "everyHours": null,
        "reminders": [
          {
            "time": "08:00:00",
            "dosageAmount": 1,
            "dosageUnit": "PIECE"
          },
          {
            "time": "20:00:00",
            "dosageAmount": 1,
            "dosageUnit": "PIECE"
          }
        ],
        "durationDays": 7
      }
    },
    "daysCount": 0,
    "perDayCount": 0,
    "dose": null
  }
}

Приклад повідомлення про видалення моніторингу ​

{
  "Trigger": 17,
  "ProtocolMonitoringAssignment": {
    "ScheduleDetails": {
      "Frequency": "SpecificWeekdays",
      "Weekdays": [
        "Monday",
        "Wednesday",
        "Friday"
      ],
      "IntervalValue": null,
      "IntervalUnit": null,
      "CycleActiveDays": null,
      "CyclePauseDays": null,
      "Multiplicity": "Once",
      "EveryHours": null,
      "Reminders": [
        {
          "Time": "08:00:00"
        }
      ],
      "DurationDays": 14
    },
    "Id": 20,
    "PatientId": 7,
    "ProtocolId": 42,
    "Del": true,
    "MonitoringIndicatorId": 30,
    "MonitoringIndicatorName": "Демонстраційний показник",
    "MonitoringIndicatorUnit": "mm[Hg]"
  }
}

Для видалення ліків аналогічно надходить Trigger: 14 та ProtocolDrug.del: true.

Доставка та обробка ​

Події ліків і моніторингу формуються після успішного збереження змін через відповідні операції. Помилка валідації, відсутній запис або невдале збереження не створюють ці події.

Таймаут одного HTTP-запиту доставки — 10 секунд. Реалізація налаштована на до 10 повторних спроб після початкової, із затримкою 1 секунда. Повтори застосовуються до винятків і відповідей 408, 429, 500, 502, 503, 504, 521, 522, 524. Інші помилкові HTTP-коди ця політика не повторює.

Інші доступні значення Trigger ​

Ці значення належать до спільного механізму вебхуків. Їх можна додати до Triggers, якщо інтеграції потрібні відповідні об’єкти; схеми цих об’єктів доступні за основним посиланням на приклад обробника у Swagger.

КодПодіяPayload
0PrerecordCreatedPrerecord
1PrerecordDeletedPrerecord
2PrerecordUpdatedPrerecord
3PatientCreatedPatient
4PatientUpdatedPatient
5OrderAddedOrder
6OrderUpdatedOrder
7OrderDeletedOrder
8FiscalizationOrder
9ProtocolUpdated — збереження протоколуProtocol

Помилки та практичний порядок інтеграції ​

HTTP-кодЯк трактувати
200Успішне читання або зміна; тип тіла залежить від методу. Створення підписки теж повертає 200.
201Призначення або показник створено. Для призначень повертається об’єкт і Location.
204Призначення або показник видалено; тіло відсутнє.
400Помилка структури або валідації, невідповідність протоколу, недоступна послуга чи заборонене перейменування каталожних ліків. Читайте тіло помилки.
401 / 403Перевірте токен, scope і доступ до ресурсу.
404Конкретний ресурс або потрібна відповідність ідентифікаторів не знайдені. Для порожніх списків можливий 200 з []; точні коди наведені біля методів.
409Конфлікт під час збереження показника моніторингу.

Для помилок валідації використовується application/problem+json із масивами повідомлень у errors. Приклад відповіді при незбігу ProtocolId:

{
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": {
    "ProtocolId": [
      "ProtocolId must match the route."
    ]
  }
}