Digitize Kaplan–Meier curves and reconstruct patient-level data
Upload a Kaplan–Meier figure from any paper, multi-panel figures included. In about a minute you get patient-level data, hazard ratios and medians, checked against the numbers printed in the paper.
3 free figures a month. Nothing you upload is stored.
Tested on published trials and on 80 simulated figures with known truth. How we measure →
Better than doing it by hand
The usual route is a manual digitizer, a typed-in at-risk table and an R script.
| By handWebPlotDigitizer + IPDfromKM | TrialCurve | |
|---|---|---|
| Time per figure | 20–60 minutes | About a minute |
| Multi-panel figures | One panel at a time | Every panel at once |
| Numbers-at-risk table | Typed in by hand | Read automatically |
| IPD, HRs, medians, RMST | Separate R scripts | In one response |
| Checked against the paper | If there's time | Always, automatically |
| Audit trail for HTA | Your notes | Built in |
| Accuracy | Good, done carefully | As good: 95% of printed HRs within 10% |
See it work
Try an example or drop in your own figure. Whole multi-panel figures are fine.
Uploads run on the live engine (a few per hour without a key). Nothing is stored.
Results appear here: the figure with the reconstructed curves drawn over it, per-arm statistics, hazard ratios and the validation pack.
What happens to your figure
Claude Opus 5.5, currently the most accurate model on our benchmark, reads the whole figure: every panel, curve, at-risk table and printed statistic. Pixel measurement double-checks each curve, and every reconstruction is checked against the numbers printed on the figure. The statistics are the method HTA bodies already know.
Read the whole figure
Every panel, curve, at-risk table and printed statistic, zooming in wherever the text is small.
Cross-check the curves
Pixel measurement traces every curve independently and flags any disagreement.
Check against the paper
The result must reproduce the printed hazard ratios and medians. A failed check triggers a second reading by a larger model.
Reconstruct IPD
The Guyot (2012) method rebuilds patient-level data: hazard ratios with CIs, medians, RMST, CSV export.
Audit-grade output for HTA dossiers
JCA and NICE assessors want to see how digitised data were checked. Every result comes with the evidence.
- Two independent readings: vision model and pixel measurement, like dual data extraction (Cochrane MECIR C46).
- Checks against the paper: printed hazard ratios, medians and events, with a prespecified 10% tolerance.
- Overlay and provenance: reconstructed curves drawn over your figure, image hash, engine and model versions.
- AI-use disclosure ready to paste into a JCA dossier, as the EU HTA AI principles require.
Accuracy you can check
Tested on real published figures and on simulated trials where the truth is known.
Published trials
95% of printed hazard ratios and 96% of printed medians reproduced within 10%, across 40 trials.
Simulated trials
91% of hazard ratios within 5% of the truth, and 100% of at-risk cells read exactly.
Known limits
Tiny arms, adjusted hazard ratios and blurry screenshots are the hard cases. Every result says which checks failed. Details →
One request
Send an image, get JSON or CSV back: curves, at-risk tables, pseudo-IPD and statistics, ready for survival, flexsurv, NMA or MAIC.
- Optional hints: arm names, at-risk table, N, events, reference arm.
"audit"mode for dossier work,"csv"for IPD rows. No SDK needed.
# reconstruct IPD from a KM figure curl https://trialcurve.com/v1/reconstruct \ -H "Authorization: Bearer $TRIALCURVE_KEY" \ -F image=@figure2a.png \ -F 'options={"mode":"audit","published":{"hazard_ratio":0.72}}'
import requests, json r = requests.post( "https://trialcurve.com/v1/reconstruct", headers={"Authorization": f"Bearer {KEY}"}, files={"image": open("figure2a.png", "rb")}, data={"options": json.dumps({"mode": "standard"})}, ) res = r.json() for c in res["comparisons"]: print(c["arm"], "vs", c["reference"], c["hazard_ratio"], c["ci95"])
library(httr2); library(survival) ipd <- request("https://trialcurve.com/v1/reconstruct") |> req_auth_bearer_token(Sys.getenv("TRIALCURVE_KEY")) |> req_body_multipart(image = curl::form_file("figure2a.png"), options = '{"format":"csv"}') |> req_perform() |> resp_body_string() |> read.csv(text = _) coxph(Surv(time, event) ~ arm, data = ipd)
Reconstructed data from published trials
Free curves and pseudo-IPD from openly licensed trials, each checked against its figure.
CheckMate 648
Duration of response (per BICR); Overall survival; Progression-free survival (per BICR)
Gastric and oesophageal cancerKEYNOTE-671 (stage II subgroup)
Event-free survival; Overall survival
Lung cancerNETTER-2
Progression-free survival
Neuroendocrine tumoursCEPHEUS
Overall survival; Progression-free survival
Blood cancers and transplantBREAKWATER
Overall survival
Colorectal cancerPORTEC-3
Overall survival; Recurrence-free survival
Gynaecological cancersPricing
Per figure, not per seat. A standard figure uses 1 credit; audit mode, for dossiers, uses 3.
Pay as you go
- Standard: $15 per figure
- Audit-grade: $45 per figure
- Full API, CSV/JSON export, all hints
- Cancel any time from the billing portal
Team
- Enough for about 16 audit-grade or 50 standard figures a month
- Built for NMA, MAIC and JCA/NICE submissions
- Validation pack for every figure
- Priority support
Enterprise
- Private deployment (your cloud or on-premises)
- Validation dossier for your SOPs
- SSO, DPA, invoicing, volume pricing
- Batch processing of whole systematic reviews
Academic groups: apply for free credits for published or registered methods work.
Guides & free tools
Free guides and tools for working with survival curves.
Kaplan–Meier curve generator
KM plot, medians, HR and RMST from your data.
Hazard ratio from a KM curve
An HR and 95% CI when the paper has none.
RMST calculator
RMST and differences, with 95% CIs.
Reconstruct IPD from KM curves
How pseudo-IPD is rebuilt, and when to trust it.
The Guyot algorithm, explained
The standard reconstruction method, step by step.
How to read a Kaplan–Meier curve
Steps, censor marks, medians and the at-risk table.
Hazard ratio interpretation
What HR 0.75 means, and when it misleads.
Extract data from a KM curve
Manual and automated routes, with QC.
Reconstructed IPD in HTA
NICE TSD 14/21, NMA, MAIC and EU JCA.
Questions
Is reconstructed IPD accepted by HTA bodies?
Yes. Reconstructing pseudo-IPD from published KM curves (Guyot 2012) is standard in indirect comparisons and survival extrapolation, and is referenced in NICE DSU and EU HTA guidance. You stay responsible for the analysis; TrialCurve adds the evidence that it was checked.
Why not just ask a chatbot to read the curve?
A chatbot gives you a reading, not a checked reconstruction. TrialCurve extracts every panel in a fixed structure, runs the Guyot reconstruction, checks the result against the paper and keeps an audit trail. With its zoom tool, it now reads curves as precisely as pixel measurement.
What figures work best?
Whole figures work, multi-panel ones included. Use the sharpest copy you have: export from the PDF or zoom to 200% before taking a screenshot. An at-risk table makes results much more precise; without one, pass N per arm.
What happens to my figures?
They are processed in memory and discarded: we store no images and no results. The image is sent to Anthropic's API (Claude), which does not train on API data. Enterprise customers can run a fully private deployment.
Can it handle vector PDFs or a whole review at once?
PDF input and batch processing are on the roadmap for Team and Enterprise. Tell us what you need.
Is there a library of reconstructed trial data?
Yes. The trial library has reconstructed curves and pseudo-IPD from openly licensed trials, each checked against its figure, with CSV downloads. It is free.
Is this a medical device?
No. It is a research tool for published aggregate data, not for decisions about individual patients.