Связываем 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), оплата только за успех. Вывод соответствует условиям регуляторных и структурных данных; никакой ловушки коммерческой лицензии для конечных пользователей.
Бок о бок
| ClinicalTrials.gov v2 | openFDA | ChEMBL | DrugBank | API Pick Clinical | |
|---|---|---|---|---|---|
| Покрытие | Реестр исследований | Лейблы + FAERS + отзывы | Биоактивность, мишени, анализы | Лекарства + мишени + взаимодействия | Все четыре, семантически |
| Формат | REST + JSON | REST + JSON | REST + JSON | REST + JSON / SQL-дампы | JSON, сниппеты предформатированы |
| Rate limit | 10 запросов/сек | 240/мин без авторизации, 120k/день с ключом | Щедрый | Зависит от тарифа лицензии | За вызов (без per-user) |
| Лицензия | Public domain | Public domain | CC-BY-SA | Academic бесплатно / 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}")API Pick Clinical Search: один вызов, все источники
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, использованные в статье
Сара Чой — CEO API Pick. Пишет о продакшен-готовых API для AI-агентов и LLM-воркфлоу.