把 ClinicalTrials.gov v2 + openFDA + ChEMBL 串成一個授權乾淨的藥物情報端點

藥廠研發、醫療 AI 新創與藥物安全監測團隊,要的其實是同一件事:一個能以授權乾淨方式同時拉取試驗、仿單、不良事件與生物活性的端點。這裡是可運作的架構,以及那些在正式環境中讓團隊踩坑的暗門。
一句話總結
- •ClinicalTrials.gov v2(REST + JSON)已於 2024 年取代舊版 v1 —— schema 更乾淨,但分頁、可選欄位與歷史資料漂移會讓新接入者措手不及。
- •openFDA 免費涵蓋藥品仿單(SPL)、FAERS 不良事件報告與召回資料;未認證限速 240 req/min,帶 key 為每日 120k。
- •ChEMBL 給你生物活性(IC50、Ki、Kd、EC50)、標靶與分析法 —— 這是其他資料庫缺乏的結構 / 機制面向。
- •DrugBank 的商業授權才是陷阱:學術用途可以;任何產品,連小型 SaaS 都算,都落在多數開發者直到收到通知前都沒讀過的商業授權條款裡。
- •API Pick Clinical Search 用一個 POST 端點包了 ClinicalTrials、openFDA、ChEMBL 與 DrugBank 藥理 —— 每次呼叫 30 credits、授權乾淨、僅在成功時計費。
問題的樣貌
三類受眾最後都需要大致相同的藥物資料管線,理由各異:
- 生技製藥研發與藥物再定位團隊要把生物活性資料(ChEMBL)、試驗歷史(ClinicalTrials.gov)與不良事件訊號(FAERS)串起來,以評估某個候選藥。
- 醫療 AI 新創在打造聊天機器人或臨床決策支援層時,需要把藥品仿單(openFDA SPL)與試驗資料串起來,讓 LLM 的回答有法規來源為依據。
- 藥物安全監測團隊需要 FAERS、加上藥品仿單的結構化欄位、再加上來自 ChEMBL/DrugBank 的機制資訊,來評估訊號的合理性。
這幾類受眾最後都要把四個資料庫串在一起:ClinicalTrials.gov、openFDA、ChEMBL 與 DrugBank。每個資料庫都有自己的 schema、流量限制與授權條款。DrugBank 是會咬人的那個 —— 它的商業使用條款會抓到那些在開發階段整合卻沒讀授權的團隊,而向小型 SaaS 創辦人發出通知是真實存在的事。
以下是我們建議的架構,含一條避開 DrugBank 陷阱、授權乾淨的替代路徑。
四個來源,各一段
ClinicalTrials.gov v2
美國國家醫學圖書館(US National Library of Medicine)。美國註冊臨床試驗的權威登錄系統,也是事實上的全球標準。v2 於 2024 年上線 —— REST + JSON,取代舊版 v1 的 CSV/XML。免費,限速(10 req/sec)。文件在 clinicaltrials.gov/data-api/api。優點:權威、全面、無授權問題。缺點:較舊研究的可選欄位稀疏,仍在 v1 上的團隊有 schema 遷移摩擦。
openFDA
FDA 營運的公開 API。涵蓋藥品仿單(SPL —— Structured Product Labels)、FAERS(不良事件通報系統)、召回資料,以及食品 / 醫材的對應資料。免費,未認證限速 240 req/min,帶 API key 為每日 120,000 req。優點:權威的法規來源、結構化資料、覆蓋面廣。缺點:解析 SPL 需要懂 HL7 慣例;FAERS 去重是使用者自己的問題。
ChEMBL
EBI / EMBL-EBI。經人工策展的生物活性資料庫 —— 涵蓋化合物、標靶與分析法的 IC50、Ki、Kd、EC50 量測值。免費,REST + JSON,中等流量下沒有限速困擾。優點:別處沒有的結構與機制資料。缺點:定位偏研究等級;治療 / 臨床對應不完整。
DrugBank
起源於阿爾伯塔大學(University of Alberta),如今商業化。藥物-標靶對應、藥理、藥物交互作用、多重藥理學。學術使用免費;商業使用需付費授權。授權適用於任何商業產品,包含免費的 SaaS 工具 —— 整合前先讀條款。
API Pick Clinical Search(授權乾淨的替代方案)
跨 ClinicalTrials.gov、FDA 藥品仿單、ChEMBL 生物活性,以及我們取得授權的 DrugBank 藥理 metadata 的語意搜尋。JSON in / JSON out,每次呼叫 30 credits(約 $0.03),僅在成功時計費。輸出與法規及結構資料條款一致;對終端使用者不存在商業授權陷阱。
並排比較
| ClinicalTrials.gov v2 | openFDA | ChEMBL | DrugBank | API Pick Clinical | |
|---|---|---|---|---|---|
| 涵蓋範圍 | 試驗登錄 | 仿單 + FAERS + 召回 | 生物活性、標靶、分析法 | 藥物 + 標靶 + 交互作用 | 四者全包,語意 |
| 格式 | REST + JSON | REST + JSON | REST + JSON | REST + JSON / SQL dumps | JSON,snippet 已預先整理 |
| 流量限制 | 10 req/sec | 未認證 240/min,帶 key 120k/day | 寬鬆 | 視授權等級而定 | 按呼叫(無按使用者) |
| 授權 | 公有領域 | 公有領域 | CC-BY-SA | 學術免費 / 商業付費 | API Pick TOS |
| 最適用途 | 試驗計畫書、贊助方消歧 | 法規仿單、不良事件訊號 | 機制 / 結構 | 藥物交互作用、多重藥理 | AI agent 跨全部檢索 |
可執行程式碼:各來源
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 交叉比對,看新適應症下的安全訊號。Agent 把這四塊組裝起來,浮現出值得藥理學家花時間看的候選。
2. 藥物安全監測訊號分流
每小時的 cron 為一份藥物觀察清單拉取新的 FAERS 報告。對資料庫其餘部分計算報告勝算比。標記任何 ROR > 2 且 95% CI 不含 1 的訊號。配上 ClinicalTrials.gov,檢查使用適應症是否在仿單上(on-label)還是仿單外(off-label)。輸出一份排序清單供團隊晨間檢視 —— 與新聞的晨間簡報模式類似。
3. AI 醫療助理的依據錨定
助理給出的任何與藥物相關的回答,都去拉 openFDA 仿單,並以它作為權威的事實依據。明確引用 FDA 仿單的章節。當仿單無法取得時,拒絕回答劑量相關的問題。這就是英國判例法那篇裡的「引用錨定」模式套用到醫學上 —— 而且風險更高。
DrugBank 陷阱
值得再強調一次。DrugBank 的學術授權廣為人知,但它的條款在你向任何人收取使用該資料的任何費用的那一刻就會轉變 —— 包含一個你打算之後把使用者轉成付費的免費產品。好幾位小型 SaaS 創辦人都是在通知落進信箱後,才硬生生學到這一課。
兩條乾淨的路:
- 付商業授權費。標準定價不透明;要有談判的準備。對於有資金的成熟產品,這是正確答案,因為 DrugBank 的藥物交互作用資料很難取代。
- 早期階段改用授權乾淨的替代方案。ChEMBL 涵蓋大部分機制資料。RxNorm + DailyMed(NIH)涵蓋藥名正規化與仿單。FAERS 涵蓋不良事件。這個組合會缺少一些 DrugBank 特有的資料(豐富的交互作用表、多重藥理學),但對多數早期階段產品已經夠用。API Pick Clinical Search 已替你包好這個授權乾淨的子集。
這套模式還能推廣到哪
「把四個公開資料庫串在一起,並做好流量限制處理與授權紀律」這個模式,在許多受監管的垂直領域都會出現 —— 財務申報文件(SEC + 財報法說逐字稿 + 股權統計)、專利(USPTO + EPO + WIPO + JPO + KIPO + CNIPA)、法律(Find Case Law + legislation.gov.uk + 各國對應系統)。藥物資料版本之所以特殊,主要是因為授權立足點爭議更大。其他每個面向 —— schema 多樣性、流量限制、去重、跨來源識別碼對應 —— 都可以推廣。
若要對授權乾淨的藥物資料來源做一次呼叫的檢索,API Pick Clinical Search 替你做好串接。至於更深的整合(完整 SPL 解析、FAERS 訊號計算、ChEMBL 標靶樹),你仍然要直接去各個來源。為管線的每個部分挑選正確的抽象層級。
常見問題
ClinicalTrials.gov v2 改了什麼,會弄壞管線?
三件事。(1) 端點結構 —— v2 是 REST + JSON,不再是 v1 的 CSV/XML。(2) 欄位命名 —— 新的 protocolSection 包裝,以及 snake_case 改成 camelCase,是最常見的重構。(3) 可選欄位的填充率 —— 許多文件上標為「可用」的欄位其實很稀疏,尤其是較舊的研究。遷移通常要 2-3 天,再加一週修 bug,因為邊角案例的研究會陸續冒出來。
DrugBank 授權到底是怎麼回事?
DrugBank 對學術與個人研究免費。任何商業用途 —— 包含免費的 SaaS 產品、新創的 MVP,或在付費顧問業務中使用的工具 —— 都落在 DrugBank 的商業授權條款裡。幾年前 Thinklab 那篇〈Sounding the alarm on DrugBank's new license〉至今仍是這方面的權威整理。許多開發者在開發階段整合 DrugBank,卻沒意識到一旦出貨成產品,授權就適用了。整合前先讀條款,或改用授權乾淨的替代方案。
我要怎麼做基本的藥物安全監測訊號偵測?
標準的不成比例性度量 —— 報告勝算比(ROR)、比例報告比(PRR)、貝氏 BCPNN —— 套用在 FAERS 不良事件資料庫上。像 vigipy 這類開源函式庫已實作這些。陷阱在 FAERS 去重:很多報告是同一案件由不同方重複呈報;像 WHO 的 VigiMatch 這類函式庫能處理,但你得付出代價。對多數醫療 AI 使用情境,openFDA 的 FAERS 端點加上一個簡單的 ROR 計算,就足以浮現出值得進一步調查的訊號。
API Pick Clinical Search 符合 HIPAA 嗎?
我們包裝的資料來源(ClinicalTrials.gov、openFDA、ChEMBL、DrugBank 藥理 metadata)不含受保護的健康資訊 —— 它們涵蓋的是試驗計畫書、藥品仿單、不良事件彙總與結構 / 生物活性資料。HIPAA 合規針對的是 PHI,而 PHI 不出現在我們的索引中。如果你正在打造一個會處理 PHI 的下游產品(例如針對病患紀錄的臨床決策支援),那部分要另行處理。流經我們端點的資料,與公開法規資料的性質一致。
這裡的輸出能用於臨床決策嗎?
不行。任何檢索 API 的輸出都只是資訊性質;它不構成醫療建議或臨床決策支援。請用這些資料去支援具資格的人員 —— 藥師、醫師、法規專員 —— 而不是取代他們。這適用於 API Pick Clinical Search,也適用於這個領域裡任何其他 API。
本文使用的 API
Sarah Choy 是 API Pick 的 CEO,專注於為 AI Agent 與 LLM 工作流打造可用於正式環境的 API。