[ blog · tutorial ]11 min read

Связываем ClinicalTrials.gov v2 + openFDA + ChEMBL в license-clean эндпоинт лекарственной аналитики

Sarah ChoyОпубликовано 3 мая 2026 г.11 мин чтения
Связываем ClinicalTrials.gov v2 + openFDA + ChEMBL в license-clean эндпоинт лекарственной аналитики

Фарма-R&D, medical-AI стартапы и команды фармаконадзора хотят одного: эндпоинт, который тянет клинические исследования, лейблы, нежелательные явления и биоактивность license-clean способом. Вот рабочая архитектура — и подводные люки, которые удивляли команды в продакшене.

Кратко

  • ClinicalTrials.gov v2 (REST + JSON) заменил легаси v1 в 2024 году — схема чище, но пагинация, опциональные поля и исторический дрейф подлавливают новых интеграторов.
  • openFDA покрывает лейблы лекарств (SPL), отчёты о нежелательных явлениях FAERS и данные об отзывах — бесплатно; rate-limit 240 запросов/мин без авторизации, 120k/день с ключом.
  • ChEMBL даёт биоактивность (IC50, Ki, Kd, EC50), мишени и анализы — структурное / механистическое измерение, которого нет у других баз.
  • Коммерческая лицензия DrugBank — это ловушка: академическое использование разрешено; любой продукт, даже небольшой SaaS, подпадает под условия коммерческого лицензирования, которые большинство разработчиков не читают, пока не получат уведомление.
  • API Pick Clinical Search оборачивает ClinicalTrials, openFDA, ChEMBL и фармакологию DrugBank в один POST-эндпоинт — 30 кредитов за вызов, license-clean, оплата только за успех.

Форма задачи

Три аудитории в итоге нуждаются примерно в одном и том же пайплайне лекарственных данных, по разным причинам:

  • Команды биофарма-R&D и репозиционирования лекарств хотят биоактивность (ChEMBL), историю исследований (ClinicalTrials.gov) и сигналы нежелательных явлений (FAERS), сведённые вместе для оценки кандидата.
  • Medical-AI стартапы, строящие чат-боты или слои поддержки клинических решений, нуждаются в лейблах лекарств (openFDA SPL) и данных исследований, сведённых вместе, чтобы обосновать ответы LLM регуляторными источниками.
  • Команды фармаконадзора хотят FAERS плюс структурированные поля лейблов плюс информацию о механизме из ChEMBL/DrugBank, чтобы оценить правдоподобность сигнала.

Каждая из этих аудиторий в итоге связывает воедино четыре базы данных: ClinicalTrials.gov, openFDA, ChEMBL и DrugBank. У каждой базы своя схема, свои rate-limit и свои условия лицензии. DrugBank — та, что кусается: её пункт о коммерческом использовании ловит команды, интегрировавшие её на этапе разработки без чтения лицензии, а рассылка уведомлений небольшим SaaS-основателям — реальная вещь.

Вот архитектура, которую мы рекомендуем, включая license-clean альтернативный путь, обходящий ловушку DrugBank.

Четыре источника, по одному абзацу на каждый

ClinicalTrials.gov v2

US National Library of Medicine. Определяющий реестр клинических исследований, зарегистрированных в США, и де-факто глобальный стандарт. v2 запущен в 2024 году — REST + JSON, заменяет легаси v1 на CSV/XML. Бесплатно, rate-limit (10 запросов/сек). Документация на clinicaltrials.gov/data-api/api. Сильные стороны: авторитетность, полнота, отсутствие проблем с лицензией. Слабые: разреженность опциональных полей для старых исследований, трение миграции схемы для команд, всё ещё на v1.

openFDA

Публичный API под управлением FDA. Покрывает лейблы лекарств (SPL — Structured Product Labels), FAERS (Adverse Event Reporting System), данные об отзывах и эквиваленты для продуктов питания/устройств. Бесплатно, rate-limit 240 запросов/мин без авторизации и 120 000 запросов/день с API-ключом. Сильные стороны: авторитетный регуляторный источник, структурированные данные, широкое покрытие. Слабые: парсинг SPL требует понимания конвенций HL7; дедупликация FAERS — проблема пользователя.

ChEMBL

EBI / EMBL-EBI. Курируемая база биоактивности — измерения IC50, Ki, Kd, EC50 по соединениям, мишеням и анализам. Бесплатно, REST + JSON, без головной боли с rate-limit при умеренном объёме. Сильные стороны: структурные и механистические данные, которых нет больше нигде. Слабые: фокус на research-grade; терапевтические/клинические сопоставления неполны.

DrugBank

Возникла в University of Alberta, теперь коммерческая. Сопоставления лекарство–мишень, фармакология, лекарственные взаимодействия, полифармакология. Академическое использование бесплатно; коммерческое требует платной лицензии. Лицензия применяется к любому коммерческому продукту, включая бесплатные SaaS-инструменты — читайте условия до интеграции.

API Pick Clinical Search (license-clean альтернатива)

Семантический поиск по ClinicalTrials.gov, лейблам лекарств FDA, биоактивности ChEMBL и фармакологическим метаданным DrugBank, которые мы лицензируем. JSON на входе / JSON на выходе, 30 кредитов за вызов (~$0.03), оплата только за успех. Вывод соответствует условиям регуляторных и структурных данных; никакой ловушки коммерческой лицензии для конечных пользователей.

Бок о бок

Снимок на момент написания. Перед коммерческой интеграцией сверьте актуальные rate-limit и лицензирование.
ClinicalTrials.gov v2openFDAChEMBLDrugBankAPI Pick Clinical
ПокрытиеРеестр исследованийЛейблы + FAERS + отзывыБиоактивность, мишени, анализыЛекарства + мишени + взаимодействияВсе четыре, семантически
ФорматREST + JSONREST + JSONREST + JSONREST + JSON / SQL-дампыJSON, сниппеты предформатированы
Rate limit10 запросов/сек240/мин без авторизации, 120k/день с ключомЩедрыйЗависит от тарифа лицензииЗа вызов (без per-user)
ЛицензияPublic domainPublic domainCC-BY-SAAcademic бесплатно / commercial платноAPI Pick TOS
Лучший сценарийПротоколы исследований, разрешение спонсоровРегуляторные лейблы, AE-сигналыМеханистическое / структурноеЛекарственные взаимодействия, полифармаRetrieval AI-агента по всем источникам

Рабочий код: каждый источник

ClinicalTrials.gov v2

import requests

# Trials for a specific condition + intervention
r = requests.get(
    "https://clinicaltrials.gov/api/v2/studies",
    params={
        "query.cond": "non-small cell lung cancer",
        "query.intr": "pembrolizumab",
        "filter.overallStatus": "RECRUITING",
        "pageSize": 25,
        "format": "json",
    },
)
studies = r.json()["studies"]
for s in studies[:3]:
    proto = s["protocolSection"]
    nct = proto["identificationModule"]["nctId"]
    title = proto["identificationModule"]["briefTitle"]
    sponsor = proto["sponsorCollaboratorsModule"]["leadSponsor"]["name"]
    print(f"{nct}: {title} (sponsor: {sponsor})")

openFDA: лейбл лекарства + сигнал FAERS

import requests
from collections import Counter

# Drug label lookup
r = requests.get(
    "https://api.fda.gov/drug/label.json",
    params={"search": "openfda.brand_name:Lipitor", "limit": 1},
).json()
label = r["results"][0]
print("Indications:", label.get("indications_and_usage", ["—"])[0][:200])

# FAERS — most reported adverse events for atorvastatin
r = requests.get(
    "https://api.fda.gov/drug/event.json",
    params={
        "search": 'patient.drug.medicinalproduct:"ATORVASTATIN CALCIUM"',
        "count": "patient.reaction.reactionmeddrapt.exact",
        "limit": 10,
    },
).json()
print("Top reported reactions:")
for r_ in r["results"]:
    print(f"  {r_['term']}: {r_['count']}")

ChEMBL: биоактивность мишени

import requests

# Target search → activity for a specific target
r = requests.get(
    "https://www.ebi.ac.uk/chembl/api/data/activity.json",
    params={
        "target_chembl_id": "CHEMBL204",      # PD-L1
        "standard_type": "IC50",
        "limit": 25,
    },
).json()
for a in r["activities"][:5]:
    cid = a["molecule_chembl_id"]
    val = a["standard_value"]
    unit = a["standard_units"]
    print(f"{cid}: IC50 = {val} {unit}")
import requests

r = requests.post(
    "https://www.apipick.com/api/search/clinical",
    headers={"x-api-key": "pk_yourkey"},
    json={"query": "PD-L1 inhibitors in NSCLC trials and adverse events"},
)
for hit in r.json()["results"][:5]:
    print(hit["title"], "→", hit["url"], f"(source: {hit.get('source')})")
# Returns ranked semantic matches across trials + labels + bioactivity.
# 30 credits per call, only on HTTP 200.

Три паттерна, которые всплывают в продакшене

1. Скрининг для репозиционирования лекарств

Берёте одобренное лекарство. Тянете его механизм (мишени ChEMBL), текущие показания (лейбл openFDA) и любые исследования, тестирующие его в новых показаниях (ClinicalTrials.gov). Перекрёстно сверяете с FAERS на сигналы безопасности в новом показании. Агент собирает все четыре части и выводит кандидатов, стоящих времени фармаколога.

2. Триаж сигналов фармаконадзора

Ежечасный cron тянет новые отчёты FAERS по watchlist лекарств. Считаете Reporting Odds Ratio против остальной базы. Помечаете любые сигналы, где ROR > 2 с 95% ДИ, исключающим 1. Совмещаете с ClinicalTrials.gov, чтобы проверить, является ли показание-применения on-label или off-label. Выводите ранжированный список для утреннего разбора команды — по аналогии с паттерном утренней сводки для новостей.

3. Обоснование AI-медассистента

Для любого ответа ассистента, связанного с лекарством, тяните лейбл openFDA и используйте его как авторитетную ground truth. Явно цитируйте раздел лейбла FDA. Отказывайтесь отвечать на вопросы о дозировке, когда лейбл не удаётся получить. Это паттерн обоснования цитатами из разбора прецедентного права UK, применённый к медицине — с ещё более высокими ставками.

Ловушка DrugBank

Стоит подчеркнуть ещё раз. Академическая лицензия DrugBank широко известна, но её условия меняются в тот момент, когда вы берёте с кого-либо деньги за что-либо, что использует эти данные — включая бесплатный продукт, чьих пользователей вы намерены позже перевести на платный тариф. Несколько небольших SaaS-основателей узнали это на горьком опыте, когда уведомление приземлилось в их почтовый ящик.

Два чистых пути:

  • Купить коммерческую лицензию. Стандартное ценообразование непрозрачно; рассчитывайте на переговоры. Для зрелых продуктов с финансированием это правильный ответ, потому что данные о лекарственных взаимодействиях DrugBank трудно с чем-то сравнить.
  • Используйте license-clean альтернативы на ранних этапах. ChEMBL покрывает большую часть механистических данных. RxNorm + DailyMed (NIH) покрывают нормализацию названий лекарств и лейблы. FAERS покрывает нежелательные явления. Комбинация упускает часть специфичных для DrugBank данных (богатые таблицы взаимодействий, полифармакологию), но её достаточно для большинства продуктов ранней стадии. API Pick Clinical Search оборачивает license-clean подмножество за вас.

Где это обобщается

Паттерн 'связать четыре публичные базы данных с обработкой rate-limit и лицензионной дисциплиной' всплывает во многих регулируемых вертикалях — финансовая отчётность (SEC + транскрипты earnings + статистика по акциям), патенты (USPTO + EPO + WIPO + JPO + KIPO + CNIPA), право (Find Case Law + legislation.gov.uk + зарубежные аналоги). Версия с лекарственными данными необычна главным образом тем, что лицензионная почва более спорна. Любая другая ось — разнообразие схем, rate-limit, дедупликация, сопоставление идентификаторов между источниками — обобщается.

Для retrieval одним вызовом по license-clean источникам лекарственных данных API Pick Clinical Search делает всю обвязку. Для более глубоких интеграций (полный парсинг SPL, расчёт сигналов FAERS, деревья мишеней ChEMBL) вы по-прежнему идёте к каждому источнику напрямую. Выбирайте правильный уровень абстракции для каждой части пайплайна.

Часто задаваемые вопросы

Что изменилось в ClinicalTrials.gov v2 и ломает пайплайны?

Три вещи. (1) Структура эндпоинта — v2 это REST + JSON вместо CSV/XML в v1. (2) Имена полей — новая обёртка protocolSection и переходы snake_case→camelCase — самый частый рефакторинг. (3) Заполненность опциональных полей — многие поля, помеченные как 'доступные', заполнены разреженно, особенно для старых исследований. Миграция обычно занимает 2-3 дня плюс неделю на отлов багов по мере всплывания краевых исследований.

В чём суть лицензирования DrugBank?

DrugBank бесплатен для академических и личных исследований. Любое коммерческое использование — включая бесплатный SaaS-продукт, MVP стартапа или инструмент в платном консалтинге — подпадает под условия коммерческого лицензирования DrugBank. Пост на Thinklab 'Sounding the alarm on DrugBank's new license' нескольких лет давности до сих пор остаётся каноническим разбором. Многие разработчики интегрируют DrugBank на этапе разработки, не осознавая, что в момент выпуска продукта лицензия начинает действовать. Прочтите условия до интеграции или используйте license-clean альтернативу.

Как сделать базовое детектирование сигналов фармаконадзора?

Стандартные меры диспропорциональности — Reporting Odds Ratio (ROR), Proportional Reporting Ratio (PRR), байесовский BCPNN — поверх базы нежелательных явлений FAERS. Open-source-библиотеки вроде vigipy их реализуют. Ловушка — дедупликация FAERS: многие отчёты — дубликаты одного и того же случая от разных сторон; библиотеки вроде VigiMatch от WHO это обрабатывают, но за это надо платить. Для большинства med-AI сценариев эндпоинта FAERS в openFDA плюс простого расчёта ROR достаточно, чтобы выявить сигналы, стоящие расследования.

Соответствует ли API Pick Clinical Search требованиям HIPAA?

Источники данных, которые мы оборачиваем (ClinicalTrials.gov, openFDA, ChEMBL, фармакологические метаданные DrugBank), не содержат защищаемой медицинской информации — они покрывают протоколы исследований, лейблы лекарств, агрегаты нежелательных явлений и структурные/биоактивные данные. Соответствие HIPAA применяется к PHI, которой нет в нашем индексе. Если вы строите downstream-продукт, который всё же обрабатывает PHI (например, поддержку клинических решений по записям пациентов), это надо решать отдельно. Данные, проходящие через наш эндпоинт, соответствуют условиям публичных регуляторных данных.

Можно ли использовать вывод для клинических решений?

Нет. Вывод любого retrieval-API носит информационный характер; он не является медицинской рекомендацией или поддержкой клинических решений. Используйте данные для поддержки квалифицированного персонала — фармацевта, врача, специалиста по регуляторике — а не для их замены. Это касается API Pick Clinical Search и любого другого API в этой области.

API, использованные в статье

Sarah Choy
Автор
Sarah Choy
CEO, API Pick

Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.