# CMS CCIIO Rate PUF: lossless revision history from the CMS ZIPs, PY2014-2026

`medicare_silver.fact_rate_puf_history` · Insurer negotiated rates · status live · 36,535,872 rows

Append-only, lossless history of the CMS Exchange Rate PUF read from the 13 official CMS ZIPs (pipelines/medicare/silver/rate_puf_history_writer.py, #3568/#3576): typed rates beside raw_values_json, header hash, schema era, archive member and Bronze lineage on every row. Replaces the data.healthcare.gov mirror behind medicare_silver.fact_rate_puf. Read it through medicare_semantic.vw_rate_puf_current unless you need a specific revision.

**Grain.** One publisher CSV record per CMS ZIP revision: (business_year, archive_member_sha256, source_row_number). 36,535,872 rows, PY2014-2026, one revision per business_year today (3,796,388 / 4,676,092 / 4,171,845 / 3,098,756 / 2,287,807 / 1,968,926 / 1,886,351 / 2,136,450 / 2,498,402 / 2,752,441 / 2,608,212 / 2,418,441 / 2,235,761; Athena 7aa09831, 2026-10-13).

| column | type | meaning |
|---|---|---|
| business_year | int |  |
| source_row_number | bigint |  |
| state_code | string |  |
| issuer_id | string |  |
| source_name | string |  |
| import_date | string |  |
| rate_effective_date | string |  |
| rate_expiration_date | string |  |
| plan_id | string |  |
| rating_area_id | string |  |
| tobacco | string |  |
| age | string |  |
| individual_rate | double |  |
| individual_tobacco_rate | double |  |
| couple | double |  |
| primary_plus_one_dependent | double |  |
| primary_plus_two_dependents | double |  |
| primary_plus_three_or_more_dependents | double |  |
| couple_plus_one_dependent | double |  |
| couple_plus_two_dependents | double |  |
| couple_plus_three_or_more_dependents | double |  |
| schema_era | string |  |
| source_encoding | string |  |
| raw_row_sha256 | string |  |
| raw_values_json | string |  |
| numeric_parse_status_json | string |  |
| record_selection_status | string |  |
| artifact_id | string |  |
| source_zip_sha256 | string |  |
| source_zip_bytes | bigint |  |
| final_source_url | string |  |
| archive_member | string |  |
| archive_member_sha256 | string |  |
| archive_member_bytes | bigint |  |
| ordered_header_json | string |  |
| header_sha256 | string |  |
| column_count | int |  |
| publisher_modified_at | string |  |
| publisher_etag | string |  |
| archive_member_crc32 | string |  |
| archive_inventory_json | string |  |
| expected_artifact_rows | bigint |  |
| observed_period | date |  |
| asserted_at | date |  |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int |  |
| parse_revision | int |  |
| parser_artifact_hash | string |  |
| source_url | string |  |
| sha256_content_hash | string |  |
| source_id | string |  |
| is_current | boolean |  |
| bronze_object_key | string |  |
| s3_version_id | string |  |
| vintage_tag | string |  |
| drug_source_version_id | string |  |

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.fact_rate_puf_history WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.fact_rate_puf_history")` first.
