Ingest
Extract per-page text and tables with pdfplumber, falling back to PyMuPDF and then Tesseract OCR only if a page has no extractable text.
Rules-based SBC extraction — no AI
Parses a Summary of Benefits and Coverage (SBC) PDF into structured plan design data — deductibles, out-of-pocket maximums, copays, drug tiers — using deterministic table-parsing and regex rules, not an LLM. First stage of a larger plan-design analytics pipeline built on DFW ACA marketplace plans.
Why no AI
Every SBC follows the same federally mandated layout — the same tables, the same "Important Questions," the same order — across every carrier. That structure is reliable enough to parse directly: no LLM call, no per-document API cost, and the same input produces the same output every time.
Pipeline
Extract per-page text and tables with pdfplumber, falling back to PyMuPDF and then Tesseract OCR only if a page has no extractable text.
Parse the SBC's actual tables — Important Questions, the Common Medical Events / Benefits Summary grid, covered and excluded service lists — directly by table structure, with a regex pass over the header text as a fallback.
Estimate actuarial value and metal tier from the extracted cost-sharing fields (CMS AV Calculator methodology), and optionally match the plan against official CMS Benefits Coverage Summary data by HIOS plan ID to flag discrepancies.
Output structured JSON, plus CSV exports of the benefits summary and important questions — the format the next pipeline stage (a plan-design cost model) consumes.
Sample run
Output below is unedited from a real 2025 Texas ACA marketplace SBC
(document ID 33602TX0460575), run through the CLI:
Raw JSON excerpt from the same run:
{
"document_id": "33602TX0460575",
"individual_deductible": { "tiers": { "In-Network": "$450" } },
"family_deductible": { "tiers": { "In-Network": "$900" } },
"individual_oop_max": { "tiers": { "In-Network": "$9,200" } },
"family_oop_max": { "tiers": { "In-Network": "$18,400" } },
"benefits_summary": [
{
"service": "Primary care visit to treat an injury or illness",
"costs": { "tiers": {
"In-Network": "$30/visit; deductible does not apply",
"Out-of-Network": "Not Covered"
} }
},
{
"service": "Specialist visit",
"costs": { "tiers": {
"In-Network": "35% coinsurance",
"Out-of-Network": "Not Covered"
} }
}
/* + 42 more benefit rows */
],
"actuarial_value": {
"actuarial_value": 0.747,
"calculated_metal_tier": "silver",
"stated_tier": "silver",
"tier_mismatch": false
},
"_extraction_meta": {
"extraction_method": "Text-based",
"processing_time": 1.61,
"ocr_used": false
}
}
The BCS cross-check (step 3) matches against the official CMS Benefits & Cost Sharing PUF for Texas — a multi-thousand-row file downloaded separately, not bundled here. This sample run used a small national sample instead, so no match came back for this particular plan; the matching logic itself is exercised and tested against real BCS data, just not shown live on this page yet.
What's next
This page shows real output, captured locally — there's no live upload yet. The next step is a small hosted demo where you can pick from a handful of real marketplace SBCs and watch the pipeline run in the browser. Uploading your own PDF is a later step, once the rest of the pipeline (a plan-design cost model, a database, and a Power BI benchmarking layer) is far enough along to be worth the hosting and security work that a public upload endpoint needs.