[ blog · tutorial ]11 min read

ClinicalTrials.gov v2 + openFDA + ChEMBL을 라이선스 클린 약물 인텔리전스 엔드포인트로 묶기

Sarah Choy2026년 5월 3일 게시11분 분량
ClinicalTrials.gov v2 + openFDA + ChEMBL을 라이선스 클린 약물 인텔리전스 엔드포인트로 묶기

제약 R&D, 의료 AI 스타트업, 약물감시 팀은 모두 같은 것을 원한다: 임상시험·라벨·이상사례·생물활성을 라이선스 클린한 방식으로 한 번에 끌어오는 엔드포인트 하나. 여기 동작하는 아키텍처와, 운영에서 팀들을 놀라게 한 함정들을 정리한다.

한눈에

  • ClinicalTrials.gov v2(REST + JSON)는 2024년에 레거시 v1을 대체했다 — 스키마는 더 깔끔하지만 페이지네이션, 선택 필드, 과거 데이터 편차가 신규 통합자를 곤란하게 한다.
  • openFDA는 의약품 라벨(SPL), FAERS 이상사례 보고, 리콜 데이터를 무료로 커버한다. 미인증 240 req/min, 키 사용 시 12만 req/일로 레이트 리밋.
  • ChEMBL은 생물활성(IC50, Ki, Kd, EC50), 표적, 분석법을 제공한다 — 다른 데이터베이스가 갖지 못한 구조적/기전적 차원이다.
  • DrugBank의 상업 라이선스가 함정이다: 학술 용도는 허용되지만, 어떤 제품이든 — 작은 SaaS조차 — 대부분의 빌더가 통지를 받기 전까지 읽지 않는 상업 라이선스 조항의 적용을 받는다.
  • API Pick Clinical Search는 ClinicalTrials, openFDA, ChEMBL, DrugBank 약리 데이터를 하나의 POST 엔드포인트로 감싼다 — 호출당 30 크레딧, 라이선스 클린, 성공시에만 과금.

문제의 모양

세 부류의 사용자가 서로 다른 이유로 거의 같은 약물 데이터 파이프라인을 필요로 하게 된다:

  • 바이오제약 R&D와 약물 재창출 팀은 후보를 평가하기 위해 생물활성 데이터(ChEMBL), 시험 이력(ClinicalTrials.gov), 이상사례 시그널(FAERS)을 결합하고 싶어 한다.
  • 의료 AI 스타트업은 챗봇이나 임상 의사결정 지원 레이어를 만들면서, LLM 답변을 규제 출처에 근거시키기 위해 의약품 라벨(openFDA SPL)과 시험 데이터를 결합해야 한다.
  • 약물감시 팀은 시그널 타당성을 평가하기 위해 FAERS에 의약품 라벨 구조화 필드, 그리고 ChEMBL/DrugBank의 기전 정보를 더해서 보고 싶어 한다.

이 부류들은 모두 결국 네 개의 데이터베이스를 함께 엮게 된다: ClinicalTrials.gov, openFDA, ChEMBL, DrugBank. 데이터베이스마다 자체 스키마, 레이트 리밋, 라이선스 약관이 있다. 무는 것은 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에 남아 있는 팀의 스키마 마이그레이션 마찰.

openFDA

FDA가 운영하는 공개 API. 의약품 라벨(SPL — Structured Product Labels), FAERS(Adverse Event Reporting System), 리콜 데이터, 식품/기기 등가물을 커버한다. 무료, 미인증 240 req/min과 API 키 사용 시 120,000 req/일로 레이트 리밋. 강점: 권위 있는 규제 출처, 구조화된 데이터, 폭넓은 커버리지. 약점: SPL 파싱에는 HL7 관례에 대한 이해가 필요하고, FAERS 중복 제거는 사용자의 몫이다.

ChEMBL

EBI / EMBL-EBI. 큐레이션된 생물활성 데이터베이스 — 화합물, 표적, 분석법에 걸친 IC50, Ki, Kd, EC50 측정값. 무료, REST + JSON, 중간 규모에서는 레이트 리밋 골칫거리가 없다. 강점: 다른 어디에도 없는 구조적·기전적 데이터. 약점: 초점이 연구급이라, 치료/임상 매핑은 부분적이다.

DrugBank

앨버타 대학(University of Alberta) 출신으로, 지금은 상업적. 약물-표적 매핑, 약리, 약물 상호작용, 다약물요법. 학술 용도는 무료이나, 상업적 사용에는 유료 라이선스가 필요하다. 라이선스는 무료 SaaS 도구를 포함한 어떤 상업 제품에도 적용된다 — 통합 전에 약관을 읽으라.

우리가 라이선스를 보유한, ClinicalTrials.gov, FDA 의약품 라벨, ChEMBL 생물활성, DrugBank 약리 메타데이터에 걸친 시맨틱 검색. JSON in / JSON out, 호출당 30 크레딧(약 $0.03), 성공시에만 과금. 출력은 규제 및 구조 데이터 약관과 일관되며, 최종 사용자에게 상업 라이선스 함정이 없다.

나란히 비교

작성 시점의 스냅샷. 상업 통합 전에 현재 레이트 리밋과 라이선스를 확인하라.
ClinicalTrials.gov v2openFDAChEMBLDrugBankAPI Pick Clinical
커버리지시험 레지스트리라벨 + FAERS + 리콜생물활성, 표적, 분석법약물 + 표적 + 상호작용넷 모두, 시맨틱
형식REST + JSONREST + JSONREST + JSONREST + JSON / SQL 덤프JSON, 스니펫 사전 정형
레이트 리밋10 req/sec미인증 240/min, 키 사용 12만/일넉넉함라이선스 등급에 따름호출 단위(사용자별 없음)
라이선스퍼블릭 도메인퍼블릭 도메인CC-BY-SA학술 무료 / 상업 유료API Pick TOS
최적시험 프로토콜, 스폰서 명확화규제 라벨, 이상사례 시그널기전적 / 구조적약물 상호작용, 다약물요법전체에 걸친 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 보고를 끌어온다. 데이터베이스의 나머지에 대해 Reporting Odds Ratio를 계산한다. 95% CI가 1을 제외하면서 ROR > 2인 시그널을 표시한다. ClinicalTrials.gov와 짝지어 사용 적응증이 라벨 내인지 라벨 외인지 확인한다. 팀의 아침 리뷰를 위해 순위가 매겨진 리스트를 출력한다 — 뉴스에 대한 모닝 브리핑 패턴과 유사하다.

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 + 해외 등가물). 약물 데이터 버전이 유별난 것은 주로 라이선스 발판이 더 다투어지기 때문이다. 다른 모든 축 — 스키마 다양성, 레이트 리밋, 중복 제거, 소스 간 식별자 매핑 — 은 일반화된다.

라이선스 클린한 약물 데이터 소스에 걸친 한 번의 호출 검색에는 API Pick Clinical Search가 배선을 해준다. 더 깊은 통합(완전한 SPL 파싱, FAERS 시그널 계산, ChEMBL 표적 트리)에는 여전히 각 소스로 직접 간다. 파이프라인의 각 부분마다 적절한 추상화 수준을 고르라.

자주 묻는 질문

ClinicalTrials.gov v2에서 무엇이 바뀌어 파이프라인을 깨뜨리는가?

세 가지다. (1) 엔드포인트 구조 — v2는 v1의 CSV/XML 대신 REST + JSON이다. (2) 필드 이름 — 새로운 protocolSection 래퍼와 snake_case에서 camelCase로의 변경이 가장 흔한 리팩터다. (3) 선택 필드 채워짐 정도 — '사용 가능'으로 문서화된 많은 필드가, 특히 오래된 연구에서, 듬성듬성 채워져 있다. 마이그레이션은 보통 2~3일이 걸리고, 엣지 케이스 연구들이 나타나면서 버그 수정에 한 주가 더 든다.

DrugBank 라이선스는 어떻게 된 일인가?

DrugBank는 학술 및 개인 연구에는 무료다. 어떤 상업적 사용이든 — 무료 SaaS 제품, 스타트업의 MVP, 유료 컨설팅에서 쓰는 도구를 포함해 — DrugBank의 상업 라이선스 조항의 적용을 받는다. 몇 년 전 Thinklab의 'Sounding the alarm on DrugBank's new license' 글이 여전히 정설격 정리다. 많은 빌더가 개발 단계에서 DrugBank를 통합하면서, 제품을 출시하는 순간 라이선스가 적용된다는 걸 깨닫지 못한다. 통합 전에 약관을 읽거나, 라이선스 클린한 대안을 쓰라.

기본적인 약물감시 시그널 탐지는 어떻게 하는가?

표준 불균형 측도 — Reporting Odds Ratio(ROR), Proportional Reporting Ratio(PRR), 베이지안 BCPNN — 를 FAERS 이상사례 데이터베이스 위에서 계산한다. vigipy 같은 오픈소스 라이브러리가 이를 구현한다. 함정은 FAERS 중복 제거다: 많은 보고가 같은 사례를 서로 다른 당사자가 중복 제출한 것이다. WHO의 VigiMatch 같은 라이브러리가 이를 처리하지만 비용이 든다. 대부분의 의료 AI 사용 사례에서는 openFDA의 FAERS 엔드포인트에 간단한 ROR 계산을 더하면 조사할 가치가 있는 시그널을 드러내기에 충분하다.

API Pick Clinical Search는 HIPAA를 준수하는가?

우리가 감싸는 데이터 소스(ClinicalTrials.gov, openFDA, ChEMBL, DrugBank 약리 메타데이터)에는 보호 대상 건강 정보가 없다 — 시험 프로토콜, 의약품 라벨, 이상사례 집계, 구조적/생물활성 데이터를 다룬다. HIPAA 준수는 PHI에 적용되는데, 우리 인덱스에는 PHI가 나타나지 않는다. PHI를 실제로 다루는 다운스트림 제품(예: 환자 기록 위의 임상 의사결정 지원)을 만든다면, 그것은 별도로 처리해야 한다. 우리 엔드포인트를 통해 흐르는 데이터는 공개 규제 데이터와 일관된다.

이 출력을 임상 의사결정에 쓸 수 있는가?

아니다. 모든 검색 API의 출력은 정보 제공용이다. 의학적 조언이나 임상 의사결정 지원에 해당하지 않는다. 데이터를 자격 있는 인력 — 약사, 의사, 규제 전문가 — 을 지원하는 데 쓰고, 그들을 대체하는 데 쓰지 말라. 이는 API Pick Clinical Search와 이 분야의 다른 모든 API에 적용된다.

이 글에서 사용한 API

Sarah Choy
작성
Sarah Choy
CEO, API Pick

Sarah Choy는 API Pick의 CEO입니다. AI 에이전트와 LLM 워크플로를 위한 프로덕션 등급 API에 대해 씁니다.