Source guide to institution-level Federal Student Aid data (Pell, Direct and PLUS loans, campus-based aid, financial responsibility scores and 90/10 metrics, 1999-2021), with a truth hierarchy for conflicting sources and join guidance.
Federal Student Aid (FSA) — institutional-level Title IV aid data for ~5,500 postsecondary institutions, covering Pell Grants, Direct and PLUS loans, campus-based aid (FWS, FSEOG, Perkins), financial responsibility composite scores, and 90/10 revenue metrics (1999-2021, varies by dataset). Use when analyzing Pell Grant distribution by institution type, student loan volume, campus-based aid allocation, or for-profit financial health and 90/10 compliance. Identified by IPEDS unitid.
Reference guide for FSA data available through the Urban Institute Education Data Portal. FSA data provides institutional-level information on Title IV federal student aid programs administered by the U.S. Department of Education.
CRITICAL: Value Encoding
The Education Data Portal converts categorical variables to integers. This differs from original FSA documentation which may use string codes. All categorical columns in the Portal parquet files are integer-typed.
Variable
Example Value
Meaning
grant_type
1
Federal Pell Grant
loan_type
1
Subsidized Direct Loan - Undergraduate
award_type
1
Federal Supplemental Educational Opportunity Grants
fips
6
California
allocation_flag
1
Yes
Missing data codes (-1, -2, -3) apply to numeric format variables, not categorical codes.
See ./references/variable-definitions.md for complete encoding tables.
When interpreting FSA data values and resolving discrepancies between this skill documentation and observed data, apply this priority:
Priority
Source
Rationale
1 (highest)
Actual data file (parquet)
What you observe IS the truth
2
Live codebook/metadata (.xls in mirror)
Authoritative documentation; may lag behind data
3 (lowest)
This skill documentation (variable-definitions.md, etc.)
Summarized; convenient but may drift
When this skill contradicts observed data: trust the data, flag the discrepancy
When codebook contradicts observed data: trust the data, but investigate
When this skill contradicts codebook: trust the codebook, update this skill
Codebook Access: Use get_codebook_url() from fetch-patterns.md with paths from datasets-reference.md:
Python
## Example: Get codebook for FSA grantsurl=get_codebook_url("fsa/codebook_colleges_fsa_grants")
S
## Example: Get codebook for FSA grants.## get_codebook_url() is a Python helper; in R, construct the codebook URL from## the mirror root in mirrors.yaml (codebooks are .xls files co-located with data).## Mirror failover: see `education-data-query/references/fetch-patterns.md` (R pattern).config<-yaml::read_yaml("mirrors.yaml")mirror<-config$mirrors[[1]]url<-paste0(mirror$root_url,"/","fsa/codebook_colleges_fsa_grants",".xls")
FSA naming note: The Financial Responsibility dataset uses composite_scores in its data path but financial_responsibility in its codebook path. The 90/10 Revenue dataset uses underscores (90_10) in the data path but hyphens (90-10) in the codebook path. Always use the exact paths shown above.
FSA dataset selection?
├─ Need grant data (Pell, FSEOG)
│ └─ fsa/colleges_fsa_grants (single-file, 1999-2021)
├─ Need loan data (Direct, PLUS)
│ └─ fsa/colleges_fsa_loans (single-file, 1999-2021)
├─ Need campus-based program data
│ └─ fsa/colleges_fsa_campus_based_volume (single-file, 2001-2021)
├─ Need institutional financial health
│ └─ fsa/colleges_fsa_composite_scores (single-file, 2006-2016)
└─ Need 90/10 compliance (for-profits)
└─ fsa/colleges_fsa_90_10_revenue_percentages (single-file, 2014-2021)
Data access: All FSA datasets are single-file (all years in one file). Fetch using fetch_from_mirrors() from fetch-patterns.md with the canonical path from datasets-reference.md. See mirrors.yaml for mirror configuration.
Naming mismatches (intentional): Financial Responsibility uses composite_scores in data path but financial_responsibility in codebook path. 90/10 Revenue uses underscores (90_10) in data path but hyphens (90-10) in codebook path.
importpolarsaspl## Using fetch_from_mirrors() from fetch-patterns.mddf_grants=fetch_from_mirrors("fsa/colleges_fsa_grants",years=[2019,2020,2021])## Filter by grant type (1 = Federal Pell Grant)df_pell=df_grants.filter(pl.col("grant_type")==1)## Filter by institutiondf_inst=df_grants.filter(pl.col("unitid")==110635)## Filter by year rangedf_recent=df_grants.filter(pl.col("year").is_between(2015,2021))
S
library(arrow)library(dplyr)## fetch_from_mirrors() is a Python helper; in R, build the URL from the mirror## root in mirrors.yaml, read directly, and filter years locally.## Mirror failover: see `education-data-query/references/fetch-patterns.md` (R pattern).config<-yaml::read_yaml("mirrors.yaml")mirror<-config$mirrors[[1]]## NOTE: illustrative only — mirror parquet files are Polars-written and may## declare string_view columns, so a plain read can fail under R arrow## ("cannot handle Array of type <utf8_view>"). Real fetch scripts must use the## view-safe parquet read from `education-data-query/references/fetch-patterns.md`.url<-paste0(mirror$root_url,"/","fsa/colleges_fsa_grants",".",mirror$format)df_grants<-arrow::read_parquet(url)|>filter(year%in%c(2019,2020,2021))## Filter by grant type (1 = Federal Pell Grant)df_pell<-df_grants|>filter(grant_type==1)## Filter by institutiondf_inst<-df_grants|>filter(unitid==110635)## Filter by year rangedf_recent<-df_grants|>filter(between(year,2015,2021))
Portal encodes categoricals as integers; original FSA docs may reference string labels
Always use integer codes (e.g., grant_type == 1 not "Pell")
Ignoring missing data codes
-1, -2, -3 in numeric columns are sentinel values, not real amounts
Filter or handle missing codes before aggregation; exclude negative values from sums/means
Stale financial responsibility data
colleges_fsa_composite_scores only covers 2006-2016
Check year coverage before analysis; do not assume current availability
90/10 percentage is a proportion
rev_pct_90_10 is stored as 0-1 (e.g., 0.87), NOT 0-100
Multiply by 100 for display; compare to 0.90 threshold, not 90
Perkins Loan discontinuation
Perkins Loans ended after 2017; campus-based data still includes historical records
Filter by year or award_type to avoid mixing discontinued and active programs
Data lag
FSA data typically lags 1-2 years behind the current award year
Verify latest available year before planning analysis
Mixing aggregate and detail loan types
Loan type codes include both individual types (1-8, 10-13) and aggregate totals (3, 6, 9, 14)
Filter to specific types or aggregates, never sum both together
Pell recipient counts unavailable for 2020+
grant_recipients_unitid is 100% NULL for Pell grants (grant_type==1) in the 2020-2021 data year. Disbursement amounts also appear null
Use IPEDS SFA (sfa_grants_and_net_price) as a proxy for grant recipient counts. Note that SFA type_of_aid=9 captures all grant/scholarship aid, not Pell-specific (see IPEDS skill)