慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
如何我在兩週內從公開數據建立臨床試驗API - 快速API
Rahul Ban · 2026-05-25 · via DEV Community

臨床試驗.gov - 美國政府的FDA臨床試驗登記處 - 發布480,000+項研究作為公共資料,每日更新。它是醫療保健領域最寶貴的數據集之一。製藥公司、合同研究組織、健康科技新創公司和學術研究人員都需要這些數據進行程式化處理。

但官方的 ClinicalTrials.gov API v2?它基本上是為人類研究員建立的搜尋引擎的 REST 包裝。沒有結構化的資格篩選。沒有地理位置半徑搜尋。沒有 webhook 訊息提醒。分頁功能在更改分頁參數中途會失效。如果你想要建立超出基本關鍵字搜尋的任何東西,你終究得爬取網站、下載 2GB 的文本文件匯出,或支付企業供應商每月 500 美元以上的費用。

所以我建立了臨床試驗API——一個在ClinicalTrials.gov之上的合適REST層,包含結構化的資格條件、地區搜尋和webhook警報。這就是它實施的過程。

技術堆疊

  • 運行時: Python Workers (Pyodide, Redux記憶快照)
  • 部署: Wrangler CLI -> 全球330多個邊緣位置
  • 後端數據: ClinicalTrials.gov API v2 (公共領域,無需授權)
  • 市場& 收費: RapidAPI
  • 定價: 免費 / $49/月 (Pro) / $199/月 (Ultra)
  • 平均響應: 350-500毫秒暖機,約1秒冷啟動

我所建構的內容

10 個終點點分佈在 4 個功能組別:

終點 描述 層級
GET /v1/trials/search 全文 + 按欄位搜尋,游標分頁 免費
GET /v1/trials/{nct_id} 完整試驗詳情,包含結果、地點、參考資料 免費
GET /v1/trials/nearby 以緯度/經度進行地理半徑搜尋,按距離排序 免費
GET /v1/stats 按階段、狀態、贊助者、研究類型進行統計資料匯總 免費
GET /v1/conditions 醫療狀況自動完成瀏覽器 免費
GET /v1/health 健康檢查,無需授權 免費
GET /v1/trials/{nct_id}/eligibility 結構化資格標準解析 Pro
GET /v1/alerts 列出活動的 webhook 警報 Pro
POST /v1/alerts 為新試驗創建 webhook 警報 Pro
刪除 /v1/alerts/{alert_id} 刪除 webhook 警報 進階

艱難的部分

挑戰 1:解析自由文本資格標準

這是最困難的技術問題。ClinicalTrials.gov 將資格標準儲存為自由文本 - 通常是一個單一段落或項目符號列表,完全沒有結構:

"纳入標準:組織學確認的三阴性乳癌。年齡>= 18 歲。ECOG表現狀態0或1。血液學及器官功能良好。未接受過遠程轉移性乳癌的系統治療。排除標準:先前接受過乳癌免疫治療。活躍的自體免疫性疾病需要系統治療。未治療或症狀性腦部轉移。懷孕或哺乳期。"

我需要將這些解析成結構化的、機器可讀的標準物件,以便病患匹配算法實際可以使用:

{
  "inclusion_criteria": [
    {"category": "Age", "text": "Age >= 18 years", "criterion": "18 years and older"},
    {"category": "Condition", "text": "Histologically confirmed triple-negative breast cancer", "criterion": "Triple-negative breast cancer confirmed by histology"},
    {"category": "Performance Status", "text": "ECOG performance status 0 or 1", "criterion": "ECOG 0-1"}
  ],
  "exclusion_criteria": [
    {"category": "Prior Treatment", "text": "Prior immunotherapy for breast cancer", "criterion": "No prior checkpoint inhibitor therapy"}
  ]
}

進入全螢幕模式 離開全螢幕模式

我的方法:一個启发式的NLP流程。首先,使用匹配項目符號、編號列表、換行符和句子邊界的正則表達式模式將原始文本分割成候選標準。接著,使用關鍵字匹配和基於規則的邏輯將每個候選標準分類到8個類別之一(年齡、性別、狀況、實驗室值、既往治療、表現狀態、器官功能、其他)。最後,生成一個標準化的簡潔形式。

準確度約為80-85%。剩下的15-20%歸類為"其他",並保留原始文本。一個完善的機器學習模型會做得更好,但我想要發布v1版本,並根據回饋進行迭代。結構化解析是專業級服務($49/每月),因為它是證明付費計劃價值的核心理由。

挑戰2:無預算的地理搜索

ClinicalTrials.gov 列出機構地址(名稱、城市、州、國家),但沒有提供緯度/經度坐標。要建立地理半徑搜尋,我需要對每個機構進行地理編碼。

問題在於:資料庫中有約500,000個獨特的機構地址。商業地理編碼API按每1,000次查詢收費。免費地理編碼API有嚴格的速率限制(約每秒1次請求)。

我的方法:使用預先建立的查詢表。我運行了一個 Python 腳本,花了三天時間,使用帶有請求速率限制的免費地理編碼 API 對所有地址進行地理編碼。結果表格將設施地址映射到緯度/經度,並載入到工作者的模塊級別記憶體中。當您查詢 /v1/trials/nearby 時,工作者:

  1. 在 ClinicalTrials.gov 上搜索符合您篩選條件的試驗
  2. 從記憶體表檢索每個設施的坐標
  3. 計算從您的搜尋中心到目的地的哈維辛距離
  4. 按距離排序並返回結果

這個表格在記憶體中佔用約20MB,但只包含有活躍試用的設施。附近搜尋的反應時間為400-600毫秒,包括上遊API呼叫和距離計算。不是即時的,但遠比即時地進行地理編碼快得多。

挑戰3:定價 - 真正實用的免費方案與收入

永恆的獨立開發者困境。你該如何讓免費版本對用戶有足夠的吸引力,同時又夠限制以推動轉化?

我的方法:免費提供數據訪問,收費提供增值處理。

免費方案包含10個端點中的7個。您可以搜尋試驗、獲取詳情、進行地區搜尋、瀏覽條件、拉取綜合統計數據——這一切都足以建立一個真實的原型。每天100個請求,3個儲存的 webhook 警報。無需信用卡,無有效期。免費方案應該帶來「啊哈時刻」:『我的天,我剛在單次 API 請求中查詢了480K個試驗。』

Pro tier (每月49美元) 解鎖可節省實際工程時間的功能:結構化資格判斷解析 (而不是您建立正則表達式解析器) 和擴展的 webhook 警報 (25個而不是3個,檢查頻率為每6小時而不是每日)。

Ultra (每月199美元) 供臨床試驗數據對公司而言任務至關重要的情況。更高的請求限制、無限警報、優先支持、專屬 SLA。

轉換假說:免費使用者觸及每日100請求的限制或需要資格判斷,$49/每月比一個小時的開發者時間便宜.

我會做不同的改變

  1. 地理位置編碼策略。 花費三天對免費的地理位置編碼API進行速率限制是愚蠢的。我應該花50美元購買商業地理位置編碼服務,然後在兩小時內完成。獨立開發者中「我這樣做可以省錢」的本能很強,但你的時間更值錢。

  2. API設計 - 分離資格端點與內嵌。 我選擇了分離的端點/v1/trials/{nct_id}/eligibility) 因為解析增加了約 200 毫秒的處理時間,而且免費使用者不應該為他們無法使用的功能支付延遲成本。回顧來說,在試用詳情端點中直接返回解析的資格資訊會更乾淨。開發者期望一次請求,而不是兩次。我可能會在 v2 中合併這些。

數據(至今)

剛推出。實際數據即將推出。

指標
訂閱者 0 (第1天)
API呼叫處理量 0 (第1天)
收入 (月營收) $0 (第1天)
服務可用性 99.9% (目標)
平均響應時間 350-500毫秒
基礎設施成本 $0 (CF Workers免費方案)

我會在30天內更新這裡的真實數據

試試看

https://rapidapi.com/capifactory-capifactory-default/api/clinical-trials-api - 免費方案,無需信用卡。只需30秒即可獲取API金鑰並進行第一次調用。


如果你正在開發一個健康科技產品,需要臨床試驗數據,我很想聽聽哪些終點會讓這個對你有真正的幫助。我發布得很快 - 如果你需要某個目前不存在的东西,告訴我,我很可能在48小時內讓它上線。