How to Read Your Own Blood Test Results
Yes, you can read your own blood results. If you have more than one draw you can read them better than a single-visit clinician can, because you have the time series. The method has three steps: get the values out as structured data with units and LOINC codes attached, stop treating the population reference interval as a target, and compute the reference change value for each analyte so you know how big a move has to be before it means anything. Everything below is measurement and interpretation. Deciding what to do about an abnormal value is a clinical conversation, and a few numbers on the list further down mean you stop analyzing and call someone today.
Get the data as records and not as a PDF
The PDF your portal hands you is a rendering. It is not the data. Ask for one of these instead:
- FHIR R4
Observationresources. Most US patient portals expose a SMART-on-FHIR API under the ONC certification rules. Epic’s MyChart, Cerner, and the Apple Health “Health Records” connector all speak this. Each lab result is anObservationwithcode.coding[](LOINC),valueQuantity.value,valueQuantity.unit,effectiveDateTime, and usuallyreferenceRange[]. That last field is the lab’s interval for that run, which matters because it changes when the lab changes platforms. - A CSV export. Labcorp and Quest both let you download results, though the CSVs are inconsistent across panels and often drop units.
- Apple Health export:
export.xmlplus aclinical-records/directory of raw FHIR JSON. The JSON is the useful part.
Normalize on ingest. The fields we keep are (loinc, analyte_name, value_si, unit_si, value_conventional, unit_conventional, collected_at, lab_id, method, ref_low, ref_high). LOINC codes are the join key.
- hemoglobin is 718-7
- HbA1c 4548-4
- total cholesterol 2093-3
- HDL 2085-9
- ALT 1742-6
- creatinine 2160-0
- TSH 3016-3
- ferritin 2276-4
- hs-CRP 30522-7
- platelets 777-3
Verify any code against the LOINC search before you trust it, because labs sometimes report local codes with a LOINC mapping that is close but not identical (serum vs plasma, calculated vs direct LDL).
You will need these unit conversions.
- cholesterol mg/dL ÷ 38.67 = mmol/L
- glucose mg/dL ÷ 18.016 = mmol/L
- creatinine mg/dL × 88.4 = µmol/L
- HbA1c IFCC mmol/mol = (NGSP % − 2.15) × 10.929
Store both representations. Silent unit mismatches between a 2019 draw and a 2025 draw are the most common way a personal lab database produces a fake trend.
If you only have PDFs, pdfplumber with extract_table() works on most single-column lab reports, and camelot with flavor="stream" handles the ones without ruling lines. Both will occasionally drop a decimal point. Spot-check every value above or below the flagged range by eye before it enters the database.
The reference interval is not your target
A reference interval is, in the usual construction, the central 95% of results from a reference population. Two consequences follow. One in twenty healthy people falls outside it per analyte, so on a 14-analyte comprehensive metabolic panel the probability that at least one value flags is roughly 1 − 0.95^14 ≈ 51%. And a value can sit comfortably inside the interval while being far from where you personally live.
The distinction that matters is between within-subject biological variation (CV_I) and between-subject variation (CV_G). When CV_I is much smaller than CV_G, the population interval is wide relative to your own personal band, and your own historical values are the far better comparator. Studies of biological variation in immunological blood biomarkers report exactly this pattern for many analytes, along with the derived analytical quality goals labs are supposed to hit.1 Creatinine, calcium, sodium, and albumin are classic low-index analytes: tightly regulated in you, variable across people. For those, a value that is still “normal” but has moved 25% off your baseline is more informative than a marginally out-of-range one-off.
Reference change value: the number that tells signal from noise
Before you interpret a change between two draws, compute how big a change could occur with nothing happening at all:
RCV = sqrt(2) * Z * sqrt(CV_A^2 + CV_I^2)
The term CV_A is analytical imprecision. Ask your lab, or use the method’s published CV, commonly 2–5% for chemistry and higher for immunoassays. The term CV_I is within-subject biological variation from published biological variation databases. The value of Z is 1.96 for a two-sided 95% criterion and 1.65 for one-sided 95%.
Worked example, total cholesterol. With CV_A ≈ 3% and CV_I ≈ 6%, RCV ≈ 1.41 × 1.96 × 6.7 ≈ 18%. So 185 → 205 mg/dL between two draws is inside noise. A move to 235 is not.
Contrast ALT, where CV_I is large (roughly 20–25% in most published estimates). The RCV lands near 60%, which means a single ALT of 55 after a baseline of 35 tells you close to nothing. Serial measurement is the only way through. This is why we would rather have four draws a year on a small panel than one draw a year on a 60-analyte menu.
Two practical corollaries. Draw at the same lab when you can, because between-platform bias on ferritin, TSH, and any immunoassay is often larger than the biological change you are chasing. And when a single value surprises you, the first hypothesis is a measurement or pre-analytic problem. A change in you is not the first hypothesis.
Pre-analytic variables that move numbers more than you expect
- Fasting state. Triglycerides and glucose are the obvious ones. Fasting also nudges bilirubin up.
- Posture. Supine to standing shifts plasma volume. Albumin, hemoglobin, and hematocrit read several percent higher after standing. Plasma and red cell volume can be modeled from a simple blood panel, which is precisely the machinery anti-doping programs use to detect volume shifts.2
- Hydration and hard exercise in the preceding 48 hours. Creatinine, CK, AST, and ALT all respond.
- Tourniquet time and fist clenching raise potassium. Hemolysis in the tube raises potassium, LDH, and AST. A good lab flags the specimen as hemolyzed, and that flag is in the FHIR resource if you look for it.
- Biotin supplements interfere with some streptavidin-biotin immunoassays, including certain TSH and troponin platforms.
- Time of day. Cortisol, testosterone, and iron all have diurnal swings large enough to swamp any trend you are trying to see. Fix the clock time of your draws.
Saliva is sometimes floated as a painless substitute. For most analytes the correlation with blood is weak enough that the two are not interchangeable.3
Values that mean stop analyzing and call a clinician
Every lab maintains a critical-value list and will phone the ordering provider directly when a result crosses it. Thresholds differ by lab, but the categories are consistent.
- potassium below ~2.5 or above ~6.0 mmol/L
- sodium far outside 120–160 mmol/L
- glucose below ~50 or above ~400 mg/dL
- hemoglobin below ~7 g/dL
- platelets below ~20–50 ×10⁹/L
- white cells below ~1.0 ×10⁹/L
- calcium at either extreme
- INR above ~5
- any positive blood culture
- troponin above the assay’s cutoff
If your result is in one of those bands, or if you see a rapid unexplained fall in hemoglobin or platelets across draws, that is a same-day clinical call and not a data analysis problem. The same goes for a new monoclonal band, a persistent unexplained leukocytosis, or an ALT/AST in the hundreds.
What blood panels can and cannot tell you
The following are mature assays with decades of standardization.
- Standard chemistry
- CBC
- lipids
- HbA1c
- thyroid
- hs-CRP
They describe physiology well and they trend well. The frontier is different. Most published candidate biomarkers never survive replication and validation: the discovery-to-clinic attrition rate in proteomics-based biomarker work is brutal, and the reasons are mostly design and pre-analytic rather than biology.4 Multi-gene blood expression panels for cancer detection illustrate the pattern, with early sensitivity and specificity figures that shrink on independent cohorts.5 The cancer field’s own reviews are explicit that blood-based detection requires large prospective validation before it changes management.6
Alzheimer’s blood biomarkers are the most instructive current case. Plasma p-tau217 and related markers now reach diagnostic accuracy in the high 80s to low 90s percent for amyloid pathology in specialist and primary care cohorts,7 which is a genuine analytical achievement built on a decade of assay standardization work.8 But the clinical framing matters: these assays are positioned for use in defined diagnostic pathways, with cutoffs and intermediate zones. They are not positioned as screening tests for asymptomatic people.9 The critique that the evidence for population-level use is still thin is worth taking seriously before you order one out of curiosity.10 If you do get such a result, interpret it with a clinician who knows the assay’s cutoffs.
A minimal local pipeline
# 1. Pull FHIR Observations (SMART app or portal export) into raw/
# 2. Normalize
python normalize.py raw/*.json --out labs.sqlite \
--loinc-map loinc_map.csv --units si,conventional
# 3. Per-analyte series with RCV bands
python plot.py --analyte 718-7 --rcv-cvi 2.8 --rcv-cva 1.5
Schema we use: one row per observation, a separate analyte_meta table holding CV_A, CV_I, and the computed RCV per LOINC code, and a draw_context table with fasting state, clock time, posture, and days since last hard exercise. The context table is what makes the series interpretable two years later. Plot each analyte with your own running median as the center line and ±RCV as the band, with the lab’s reference interval drawn faintly behind it. Anything crossing the RCV band is worth a conversation. Anything inside it is weather.
Questions people also ask
Can I look at my own blood results? Yes. In the US you have a direct right to your lab results, and portals must expose them through a standards-based API. Download the structured data. The PDF alone is not enough.
What are red flags in a blood test? The critical-value bands listed above, plus any large rapid change across serial draws in hemoglobin, platelets, white cells, creatinine, or liver enzymes. Those go to a clinician. They do not go to your notebook.
What are normal blood test results? “Normal” means inside the central 95% of a reference population measured on that lab’s platform. It is not a personal target, and it is not comparable across labs without checking the method. Your own stable band, established over several draws, is the more useful reference.
How can I analyze my blood test results? Build the time series, attach CV_A and CV_I to each analyte, compute the reference change value, and only interpret moves that exceed it. Control the pre-analytic variables so your draws are comparable.
Is there an app that shows blood test results? Apple Health and the major portal apps will display them and Apple will hand you the underlying FHIR JSON. For analysis we would not depend on a vendor’s chart. Keep your own SQLite file and your own plots so you control the units, the codes, and the bands.
Footnotes
-
Najib Aziz, Roger Detels, Joshua J. Quint, et al. Biological variation of immunological blood biomarkers in healthy individuals and quality goals for biomarker tests. BMC Immunology, 2019. https://doi.org/10.1186/s12865-019-0313-0 ↩
-
Louisa Margit Lobigs, Pierre‐Edouard Sottas, Pitre Collier Bourdon, et al. The use of biomarkers to describe plasma‐, red cell‐, and blood volume from a simple blood test. American Journal of Hematology, 2016. https://doi.org/10.1002/ajh.24577 ↩
-
Sarah Williamson, Cindy Munro, Rita Pickler, et al. Comparison of Biomarkers in Blood and Saliva in Healthy Adults. Nursing Research and Practice, 2012. https://doi.org/10.1155/2012/246178 ↩
-
Joshua LaBaer. So, You Want to Look for Biomarkers (Introduction to the Special Biomarkers Issue). Journal of Proteome Research, 2005. https://doi.org/10.1021/pr0501259 ↩
-
Mark Han, Choong Tsek Liew, Hong Wei Zhang, et al. Novel Blood-Based, Five-Gene Biomarker Set for the Detection of Colorectal Cancer. Clinical Cancer Research, 2008. https://doi.org/10.1158/1078-0432.ccr-07-1801 ↩
-
Samir M. Hanash, Christina S. Baik, Olli Kallioniemi. Emerging molecular biomarkers—blood-based strategies to detect and monitor cancer. Nature Reviews Clinical Oncology, 2011. https://doi.org/10.1038/nrclinonc.2010.220 ↩
-
Sebastian Palmqvist, Pontus Tideman, Niklas Mattsson-Carlgren, et al. Blood Biomarkers to Detect Alzheimer Disease in Primary Care and Secondary Care. JAMA, 2024. https://doi.org/10.1001/jama.2024.13855 ↩
-
Harald Hampel, Sid E. O’Bryant, José L. Molinuevo, et al. Blood-based biomarkers for Alzheimer disease: mapping the road to the clinic. Nature Reviews Neurology, 2018. https://doi.org/10.1038/s41582-018-0079-7 ↩
-
Oskar Hansson, Kaj Blennow, Henrik Zetterberg, et al. Blood biomarkers for Alzheimer’s disease in clinical practice and trials. Nature Aging, 2023. https://doi.org/10.1038/s43587-023-00403-3 ↩
-
Willem A Van Gool, J A Floria Siebrand, Carol Brayne, et al. Evidence gap in blood biomarkers for Alzheimer’s disease. BMJ, 2025. https://doi.org/10.1136/bmj-2025-084781 ↩
Oak builds longitudinal molecular profiles of individuals: whole-genome sequencing, blood RNA sequencing, and plasma proteomics, delivered as a detailed report plus every data file. Build your profile.