← Samuel Pollock

SBC Reader

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

SBCs are a template, not free text

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

PDF in, plan design out

1

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.

2

Extract

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.

3

Cross-check

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.

4

Hand off

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

A real extraction, not a mockup

Output below is unedited from a real 2025 Texas ACA marketplace SBC (document ID 33602TX0460575), run through the CLI:

python -m src.cli extract 33602TX0460575.pdf --stated-tier silver
Individual deductible
$450
Family deductible
$900
Individual OOP max
$9,200
Family OOP max
$18,400
Primary care visit
$30/visit, deductible waived
Specialist visit
35% coinsurance
Calculated actuarial value
0.747
Calculated metal tier
Silver — matches stated tier
Extraction time
1.6s, text-based (no OCR needed)

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

Try-it-yourself demo

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.