Static
Badge Last
Update Repo
Size

FSA Weekly County Eligibility Data from the Livestock Forage Disaster Program, 2008–present

This repository is an archive of the Weekly LFP Program Eligibility Maps and Table published by the USDA Farm Service Agency for the Livestock Forage Disaster Program (LFP). Per-pasture-type eligibility map PDFs and county eligibility tables are acquired daily from the USDA LFP maps portal. The raw data are archived in the data-raw directory.

FSA publishes each week’s maps and table at new, dated URLs and only links the current week from the maps page — prior weeks simply drop off the page. This archive preserves that history: every dated PDF and XLSX is captured once and kept forever, and the weekly tables are additionally harmonized into a single analysis-ready dataset.

This repository is the web-published companion to sustainable-fsa/fsa-lfp-eligibility, which archives the same LFP county eligibility determinations as obtained directly from FSA via FOIA request. The two datasets share a common schema and agree on the determinations they both contain, but differ at the margins: the FOIA data are somewhat richer — they include Fire eligibility, payment factors for 2008–2011, and modestly more records in most years (roughly 0.3–3%) reflecting corrections and late determinations captured in FSA’s subsequent database extracts. This archive’s unique contributions are current-year coverage, the weekly snapshot history, and the original published maps and tables themselves. For analyses of completed program years, prefer the FOIA archive; use this archive for the current program year and for studying when eligibility was published.

The fsa-lfp-eligibility-web.R script handles all data acquisition and processing. The script scrapes the USDA LFP maps page, resolves every linked document to its underlying file, and exits quietly if nothing new has been published. When new files appear, it downloads them, appends them to the S3 archive, parses all archived eligibility tables (whose column layouts vary considerably across vintages), harmonizes them into a consistent schema — standardizing column names, dates, pasture types, and county codes — and writes consolidated CSV and Parquet outputs along with an interactive dashboard.


About the Livestock Forage Disaster Program

LFP compensates eligible livestock producers for grazing losses on drought-afflicted pastureland. Eligibility is determined by county and pasture type from the US Drought Monitor, against the normal grazing period FSA establishes for that pasture type. The tiers and the payments they earn are set out under Drought tiers and payment ladders below.

Program year 2026 is the first under the tiers introduced by P.L. 119-21, and the weekly tables archived here report the split D2 windows FSA added for it. Because the revisions apply retroactively to 2026, the snapshot history records when and how the published determinations changed.


🗂️ Contents


☁️ Archive Hosting & Automated Publishing

The consolidated data, the event-grain projection — which now also ships a browser-optimized .json alongside its CSV and Parquet — the snapshot history, the QA report, the assets/ directory the dashboard reads from, and the raw weekly data-raw/ corpus are mirrored to S3 and served via CloudFront at https://data.sustainable-fsa.com/fsa-lfp-eligibility-web/ (browse the archive listing or _manifest.txt for a flat index). The interactive dashboard is served separately, via GitHub Pages at https://sustainable-fsa.com/fsa-lfp-eligibility-web/.

Publishing is handled by fsa-lfp-eligibility-web.R via the shared R/s3-archive.R helpers, and runs automatically in GitHub Actions (.github/workflows/fsa-lfp-eligibility-web.yaml) each evening, or on manual dispatch. The workflow authenticates to AWS via GitHub OIDC (no long-lived credentials stored in the repo), re-renders the README and dashboard, and commits them back to git only if the rendered output changed.

The raw archive is append-only: FSA publishes each week at a new URL, and a file once archived is never overwritten or removed. Days on which FSA has published nothing exit before any write.


📥 Input Data: Weekly Maps and Tables

FSA publishes, for each program year, roughly a dozen per-pasture-type eligibility map PDFs (Native Pasture, Cool/Warm Season Improved, Forage Sorghum, small grains variants, etc.) and a single Counties & Pasture Types Eligible XLSX table. During the current program year these are re-issued weekly, following each Thursday’s U.S. Drought Monitor release, at new dated URLs.

The XLSX table layout has varied over the years — a multi-sheet workbook covering 2008–2011, a wide layout with FSA state/county codes for 2012–2023, a revised layout for 2024–2025, and a slimmed-down weekly layout from 2026 onward that omits county codes entirely. The processing workflow in fsa-lfp-eligibility-web.R harmonizes all of these, resolving county identities against the archive’s own earlier records.

Each run that archives new files also records provenance under data-raw/log/<date>/: the maps page HTML as fetched, and a links.json listing every discovered asset with its resolved URL and (for new files) SHA-256 hash.


📤 Output Data

The archive is published as fsa-lfp-eligibility-web.csv and fsa-lfp-eligibility-web.parquet. The archive is published in both formats with identical records. The Parquet carries column types; the CSV does not, so the zero-padded FSA and FIPS codes must be read as character or they lose their leading zeros.

readr::read_csv(URL, col_types = readr::cols(FIPS = "c", `FSA County` = "c"))

Each record is one eligibility determination, keyed on FSA county, program year, pasture type and disaster type — the same grain as the FOIA archive. The 2008–2011 workbook reports qualifying drought windows but no payment information, so Drought Factor and Payment Factor are NA for those years.

Variables in Output

Variable Name Description
FIPS State Code A two-digit FIPS state code
FIPS County Code A three-digit FIPS county code
FIPS State Name U.S. state
FIPS County Name County or county-equivalent name
file Source file, as a path within data-raw/
file_datestamp Publication datestamp embedded in the source filename
FSA State Code A two-digit FSA state code (not always FIPS)
FSA County Code A three-digit FSA county code (not always FIPS)
FSA County Name County or county-equivalent name
Program Year Year the data applies to
Pasture Type Pasture classification (e.g., Native, Improved)
Disaster Type Type of disaster (Drought)
D2 START DATE:D4B END Start and end dates for qualifying drought events, including the D2A/D2B pair FSA introduced for 2026
Date of Qualifying Drought Start date of qualifying disaster
Drought Factor Monthly payments earned by drought severity and duration
Grazing Period Start Date Start date of grazing period for the pasture type
Grazing Period End Date End date of grazing period for the pasture type
Maximum Eligible Payment Months Duration of grazing period, in months
Payment Factor Eligible monthly payments (Drought Factor capped by Maximum Eligible Payment Months)

current is last-published-value-wins

fsa-lfp-eligibility-web.csv is not a point-in-time view of any one weekly table. FSA’s workbook is not a fixed schema: it alternates between a full 27-column extract and a short list carrying only the county, pasture type, qualifying date and payment factor. The 08-20-2026 table was one of the short ones. So each field here comes from the most recent archived file that published its columns — a column FSA omits from a week leaves the last published value standing, while a column FSA publishes but leaves blank is honoured as blank, which is a real retraction. Without that rule a short week would blank every tier window, drought factor and grazing period of the open program year, and with them every event derived from those dates.

Columns describing one drought tier move as a block, because FSA publishes the 2026 D2 window as either the legacy unsplit D2 END or the split D2A END/D2B END pair; mixing the two encodings would count the same qualification twice.

Two consequences worth knowing. file and file_datestamp name the vintage that most recently reported the record, which for a record assembled from more than one week is not where every value came from. And fields of one record can date from different weeks — a Payment Factor FSA raised this week can sit beside tier windows it last published a fortnight ago. qa-report.txt tallies how much of each program year was carried forward.

If FSA silently withdraws a county from a later weekly table, the earlier determination is still what you see here — the archive keeps the record rather than dropping it. A withdrawal is therefore invisible in this file and recoverable only by diffing fsa-lfp-eligibility-web-snapshots.parquet, which holds every weekly version exactly as FSA published it.



🌵 Drought tiers and payment ladders

LFP pays for grazing losses when the US Drought Monitor rates a county at a qualifying intensity during the normal grazing period for that pasture type. The tiers, and the monthly payments they earn, have changed twice.

2008 Farm Bill — program years 2008–2011

Monthly payments Qualifying drought event
1 D2 for at least 8 consecutive weeks
2 D3 at any time
3 D3 for at least 4 weeks, or D4 at any time

2014 Farm Bill — program years 2012–2025

Monthly payments Qualifying drought event
1 D2 for at least 8 consecutive weeks
3 D3 at any time
4 D3 for at least 4 weeks, or D4 at any time
5 D4 for at least 4 weeks

P.L. 119-21 — program years 2026 onward

Monthly payments Qualifying drought event
1 D2 for at least 4 consecutive weeks
2 D2 for at least 7 of the previous 8 consecutive weeks
3 D3 at any time
4 D3 for at least 4 weeks, or D4 at any time
5 D4 for at least 4 weeks

Section 10401(b) of P.L. 119-21 (July 4, 2025) split the D2 tier, amending 7 U.S.C. 9081(c)(3)(D)(ii)(I). The 4-week and 4-consecutive-week distinctions are as written: the D2 tiers require consecutive weeks, the D3 and D4 4-week tiers do not.

The event codes used across these archives are D2, D3a, D3b, D4a and D4b, and from 2026 D2a_2026 and D2b_2026 in place of D2. The a tiers trigger at any time; the b tiers require a duration.

FSA has not made the 2026 split cleanly: some program year 2026 records still arrive with the legacy D2 END populated rather than the D2A END/D2B END pair, giving a D2 event in a year whose ladder no longer defines one. Because Payment Factor is a record-level value driven by the record’s highest tier, it recovers the sub-tier only where D2 is that highest tier — every 2026 record topping out at D2a carries Payment Factor 1, and every one topping out at D2b carries 2. Where a higher tier is present, Payment Factor describes that tier instead, so these events take the conservative one-payment reading. qa-report.txt counts them; the count should fall to zero once FSA republishes them split.

Which date qualifies a tier

D2, D2A, D2B, D3B and D4B require a duration, and are satisfied on the last day of the qualifying window — their END. D3A and D4A trigger at any time, carry no END value, and are satisfied on their START.

Event Source column
D2 D2 END
D2a_2026 D2A END
D2b_2026 D2B END
D3a D3A START DATE
D3b D3B END
D4a D4A START DATE
D4b D4B END

FSA reports each B-tier START as a copy of its A-tier counterpart, so a START-keyed reshape of the wide table double-counts D3 and D4.

Program year 2026 onward

FSA reports the two D2 windows separately, as D2A_START_DATE/D2A_END and D2B_START_DATE/D2B_END. Observed window lengths match the statute: D2A is 27 days in every record, D2B is 48 or 55.

FSA’s implementing final rule took effect 9 July 2026, applying to program year 2026 and after. Because the revisions apply retroactively, the weekly snapshots in this archive record when and how the published determinations changed.


🔄 Output Data: Event Grain

fsa-lfp-eligibility-web-events.csv and fsa-lfp-eligibility-web-events.parquet reshape the wide table long.

One record per Census county, FSA county, program year, pasture type, and qualifying drought event. A county whose drought deepened through the season carries several records, one for each tier as it was reached.

Variable Description
FIPS Census county, five-digit state + county FIPS code
FSA County FSA county, five-digit FSA state + county code
Program Year LFP program year
Pasture Type Pasture classification, as FSA reports it
Qualifying Drought Event The tier reached
Qualifying Date The date the tier was satisfied
Drought Factor Monthly payments the event earns
Maximum Eligible Payment Months FSA’s cap, from the length of the grazing period
Payment Factor FSA’s payable months

Drought Factor is derived from the ladder in force, not copied from the record-level column of the same name, which reports only the tier that set the award. Maximum Eligible Payment Months and Payment Factor are FSA’s own, repeated on each event of a determination.

Drought Factor, Payment Factor and the cap

Drought Factor is the monthly payments a tier earns under the ladder in force. Maximum Eligible Payment Months is FSA’s cap, a function of the length of the grazing period. Payment Factor is the payable figure, min(Drought Factor, Maximum Eligible Payment Months).

From program year 2026 FSA reports Drought Factor as 1 for both D2 sub-tiers, carrying the two-payment outcome in Payment Factor alone. These archives score D2b_2026 as 2, so compare Payment Factor rather than Drought Factor when checking 2026 against FSA.

The 2008–2011 workbook carries per-tier dates, so every determination in those years yields a dated event. The FOIA archive’s response omitted those columns, so prefer this archive before 2012.

fsa-lfp-eligibility-web-events.json

fsa-lfp-eligibility-web-events.json holds the same event records as the CSV and Parquet — derived from the identical validated table in the same run — restructured for direct use in a browser. It is a browser-delivery format, not an archive of record; for analysis, use the CSV or Parquet. It differs in structure, not content:

  • Column-oriented: one array per field with one entry per record, rather than one object per record, sorted on the integer index columns so the file gzips from ~3.9 MB to roughly 340 KB over the wire.
  • Dictionary-coded strings: pasture types, FSA county codes, Census FIPS codes, and qualifying drought events each appear once in a lookup array; the record arrays hold integer indices into them. The event dictionary is built from the data, so it lists only the codes the archive actually carries — all seven today, including the D2a_2026/D2b_2026 pair FSA introduced for 2026 (see Drought tiers and payment ladders).
  • Compact dates: each Qualifying Date is a day-of-year (qy) plus a year offset from the program year (qo), not an ISO string. A grazing season that opens in the calendar year before its program year carries qualifying dates there too — 11% of events here — so the offset is what makes the day number unambiguous.

The payload is keyed on the FSA county code, with the Census FIPS code carried as a parallel per-record dictionary — the same two keys the tabular files carry, for the same reason (see Two county keys). Every event is dated, because this archive’s workbooks carry per-tier dates back to 2008, so qy and qo are never null. mepm and pf are null on exactly 14,064 records — every event of program years 2008–2011, whose workbook reports qualifying drought windows but no payment information at all (see Output Data).

The payload is self-describing via its schema field (fsa-lfp-eligibility/1), a frozen contract with the dashboard: fields may be added, but existing ones are never renamed or reordered without bumping the schema. The layout is shared with fsa-lfp-eligibility and fsa-lfp-eligibility-derived, so the three archives can be compared directly; the dataset field says which one a payload came from.


🗺️ Two county keys

An LFP determination needs two counties. The normal grazing period is set per FSA county — the administrative unit, established through NAP and the National Crop Table (1-LFP Amend. 7, par. 27). Eligibility then triggers on drought “in any area of the county” as a Census county, the unit the US Drought Monitor is aggregated to (par. 23).

The two do not nest, in either direction. One FSA county may cover several Census counties, most widely in Puerto Rico and Alaska, and in the Virginia county-plus-independent-city pairs. Several FSA counties may fall inside one Census county, where FSA splits a county administratively and each office sets its own grazing period: Aroostook ME, Custer ID, Pottawattamie IA, Otter Tail MN, Polk MN, St. Louis MN, Nye NV, Lucas OH and Galax VA.

Records are therefore keyed on both counties and never combined. Reducing to a single county grain is the consumer’s choice; qa-report.txt lists the records it affects. The FSA-to-Census crosswalk is published in fsa-counties-dd17 and fsa-counties-dd22.


📊 Demonstration Dashboard

The Quarto dashboard fsa-lfp-eligibility-web.qmd provides:

  • An interactive viewer to explore LFP Eligibility by county, year, and pasture type
  • A tool for researchers and policymakers to assess temporal trends

Access a full-screen version of the dashboard at: https://sustainable-fsa.com/fsa-lfp-eligibility-web/fsa-lfp-eligibility-web.html


📍 Quick Start: Visualize a FSA LFP Eligibility Map in R

This snippet shows how to load the FSA LFP Eligibility data from the archive and create a simple map using sf and ggplot2.

# Load required libraries
library(arrow)
library(sf)
library(ggplot2) # For plotting
library(tigris)  # For state boundaries
library(rmapshaper) # For innerlines function

## Get the LFP Eligibility data
eligibility <-
  # "https://data.sustainable-fsa.com/fsa-lfp-eligibility-web/fsa-lfp-eligibility-web.parquet" |>
  "fsa-lfp-eligibility-web.parquet" |>
  arrow::read_parquet()

## The latest program year in the archive
plot_year <- max(eligibility$`Program Year`)

counties <-
  tigris::counties(cb = TRUE,
                   resolution = "5m",
                   progress_bar = FALSE) |>
  dplyr::filter(
    !(STATE_NAME %in% c("Guam",
                        "American Samoa",
                        "United States Virgin Islands",
                        "Commonwealth of the Northern Mariana Islands"))
  ) |>
  sf::st_cast("POLYGON", warn = FALSE, do_split = TRUE) |>
  tigris::shift_geometry() |>
  dplyr::group_by(STATEFP, COUNTYFP) |>
  dplyr::summarise(.groups = "drop") |>
  sf::st_cast("MULTIPOLYGON")

## Calculate the LFP Eligibility for Native Pasture, and
## combine with the county data
eligibility_counties <-
  eligibility |>
  dplyr::filter(`Pasture Type` == "Native Pasture",
                `Program Year` == plot_year) |>
  dplyr::transmute(
    id = paste0(`FIPS State Code`, `FIPS County Code`),
    `Payment Factor` = factor(`Payment Factor`,
                            levels = 1:5,
                            ordered = TRUE)
  ) |>
  dplyr::left_join(
    counties |>
      dplyr::transmute(id = paste0(STATEFP, COUNTYFP))
    ) |>
  sf::st_as_sf()

# Plot the map
ggplot(counties) +
  geom_sf(data = sf::st_union(counties),
          fill = "grey80",
          color = NA) +
  geom_sf(data = eligibility_counties,
          aes(fill = `Payment Factor`),
          color = NA,
          show.legend = TRUE) +
  geom_sf(data = rmapshaper::ms_innerlines(counties),
          fill = NA,
          color = "white",
          linewidth = 0.1) +
  geom_sf(data = counties |>
            dplyr::group_by(STATEFP) |>
            dplyr::summarise() |>
            rmapshaper::ms_innerlines(),
          fill = NA,
          color = "white",
          linewidth = 0.2) +
  # Use the same color scale used by the LFP
  # https://www.fsa.usda.gov/documents/native-pasture-2024-lfp-01-23-25
  scale_fill_manual(
    values = c("1" = "#E0E436",
               "2" = "#DF9114",
               "3" = "#DD2313",
               "4" = "#850014",
               "5" = "#3B003C"),
    drop = FALSE,
    name = "Payment\nMonths") +
  labs(title = "FSA LFP Eligibility",
       subtitle = paste("Native Pasture —", plot_year)) +
  theme_void()


Three archives cover LFP county eligibility, at the same event grain and with the same event codes, so they can be compared directly:

  • fsa-lfp-eligibility — FSA’s determinations as obtained by FOIA, program years 2008–2025
  • fsa-lfp-eligibility-web — FSA’s determinations as published weekly on its maps page, 2008–present, including every superseded weekly version
  • fsa-lfp-eligibility-derived — eligibility recomputed from the US Drought Monitor under four county aggregations

The FOIA archive is the richer record for closed program years: it includes fire eligibility and payment factors the web tables omit. The web archive covers the current program year and, for 2008–2011, carries per-tier dates the FOIA response omitted. The derived archive is not a record of FSA’s determinations.


📝 Citation

If you use this data in published work, please cite:

USDA Farm Service Agency. Web Archive of Livestock Forage Disaster Program County Eligibility Maps and Tables, 2008–present. Curated and archived by R. Kyle Bocinsky, Montana Climate Office, University of Montana. Sustainable FSA project. Accessed YYYY-MM-DD. https://sustainable-fsa.com/fsa-lfp-eligibility-web/

Machine-readable metadata are in CITATION.cff; GitHub’s Cite this repository button (top right of the repo page) renders it as APA or BibTeX.

📄 License

  • Raw data (USDA): Public Domain (17 USC § 105)
  • Processed data & scripts: © R. Kyle Bocinsky, released under CC0 and MIT License as applicable

⚠️ Disclaimer

This dataset is archived for research and educational use only. It may not reflect current USDA administrative boundaries or official LFP policy. Always consult your local FSA office for the latest program guidance.

To locate your nearest USDA Farm Service Agency office, use the USDA Service Center Locator:

🔗 USDA Service Center Locator


👏 Acknowledgment

This project is part of:

Enhancing Sustainable Disaster Relief in FSA Programs Supported by USDA OCE/OEEP and USDA Climate Hubs
Prepared by the Montana Climate Office


✉️ Contact

R. Kyle Bocinsky
Director of Climate Extension
Montana Climate Office
📧 kyle.bocinsky@umontana.edu 🌐 https://climate.umt.edu