API реестра — для разработчиков
Машинный вход в открытый реестр ODIN: REST + DICOMweb (STOW-RS / QIDO-RS / WADO-RS). На пилоте токены выдаются вручную.
Аутентификация
REST: заголовок X-Registry-Token в каждом запросе (пилотный токен).
DICOMweb: HTTP Basic (пилотные логин/пароль). Наружу открыт только /dicom-web/ — admin-API Orthanc не экспонирован.
REST-endpoint’ы
POST | /api/registry/case | baseline-кейс caseFormV0 → { study_uuid } |
POST | /api/registry/upload | resumable upload (tus-core: create → HEAD offset → PATCH append) |
POST | /api/registry/predict | { study_uuid } → CDSS percentile vs cohort (research prototype) |
POST | /api/registry/outcome | { study_uuid, outcome, marginal_bone_loss_mm?, outcome_date? } |
GET | /api/registry/chain | hash-chain audit (data passport v0) |
GET | /api/registry/health | liveness |
DICOMweb (для PACS)
POST | /dicom-web/studies | STOW-RS: multipart/related; type="application/dicom" |
GET | /dicom-web/studies?PatientID={study_uuid} | QIDO-RS: поиск по study_uuid |
GET | /dicom-web/studies/{study}/metadata | WADO-RS metadata (application/dicom+json) |
Контракт: PatientID = study_uuid кейса (создаётся в реестре заранее). 2D-рентген: IO / DX / PX / CR. CT/CBCT принимаются и дефейсятся ДО записи на диск: мягкие ткани (<150 HU) заменяются воздухом — изоповерхность лица не существует, кость/зубы/импланты сохраняются (мягкотканная диагностика теряется — это цена, честно). Требования: несжатый transfer syntax, MONOCHROME2, калиброванные HU; иначе отказ.
curl -u "pilot-user:pilot-pass" \
-X POST https://dentum.uz/dicom-web/studies \
-H 'Content-Type: multipart/related; type="application/dicom"; boundary=B' \
-H 'Accept: application/dicom+json' \
--data-binary @stow-body.bin Исследовательский доступ (T1)
Через OAuth2 + DUA-клик: обезличенный экспорт FHIR R4 и OMOP CDM v5.4. T3-федерация (FedAvg с подписанными апдейтами) — при ≥2 клиниках.
POST | /api/registry/oauth/token | OAuth2 client-credentials → Bearer (после DUA-accept) |
POST | /api/registry/dua/accept | click-through DUA для скоупа T1 |
GET | /api/registry/fhir/{Resource} | FHIR R4 ndjson/Bundle (Patient/Observation/…) — Bearer T1 |
GET | /api/registry/fhir/metadata | FHIR CapabilityStatement (публично) |
GET | /api/registry/omop/{table} | OMOP CDM v5.4 ndjson (person/condition_occurrence/…) — Bearer T1 |
Де-идентификация (ДО первой записи на диск)
- Подмножество PS3.15 Basic Profile: PII-теги удаляются (имена, адреса, учреждение, серийники оборудования, комментарии и др.), AccessionNumber/StudyID бланкуются
- Все private-теги, overlay- (60xx) и curve- (50xx) группы удаляются
- Все UID детерминированно ремапятся в пространство 2.25 (SHA-256 + соль реестра) — связность серий сохраняется, обратной связи с PACS клиники нет
- StudyDate/StudyTime сохраняются (без них исходы 6/12 мес бессмысленны)
- Очистки пикселей нет: снимки с BurnedInAnnotation=YES отклоняются
- CBCT/CT: дефейсинг мягкотканной абляцией (<150 HU → воздух) до записи на диск; форма костей остаётся — остаточный риск декларируется в DUA уровня T2
OpenAPI-заготовка (YAML) → ·T0 stats → ·Data dictionary → ·Open tier T0 →