Technical writing
SSA Social Security: The Federal Database Behind $1.4 Trillion in Annual OASDI Benefits
Social Security is the largest program in the federal government. In 2023 it paid approximately $1.4 trillion in benefits to roughly 70 million Americans — retired workers, people with disabilities, surviving spouses and children, and dependents of covered workers. The Social Security Administration publishes comprehensive public-use data on every dimension of the program: trust fund actuarial projections, the benefit formula and its bend points, state- and county-level beneficiary counts, disability determination outcomes, and monthly statistical snapshots updated continuously. This article covers the mechanics of OASDI, what the public data infrastructure contains, and how to access it programmatically.
Program Architecture and Scale
The Social Security Act was signed by President Franklin D. Roosevelt on August 14, 1935, establishing a contributory old-age insurance system funded by payroll taxes. Disability Insurance (DI) was added in 1956 under President Eisenhower. Medicare was added in 1965. The SSA became an independent agency in 1995, having previously been a component of the Department of Health and Human Services. SSA operates more than 1,200 field offices across the country and employs approximately 60,000 workers.
OASDI encompasses three distinct programs that are frequently collapsed into the single label “Social Security”:
- OASI (Old-Age and Survivors Insurance) covers retirement benefits for workers aged 62 and older and survivor benefits for the families of deceased workers. As of 2023, approximately 58 million people received OASI benefits totaling roughly $1.2 trillion annually. Retired workers are the largest single category, but the OASI program also covers spouses, children, and widowed survivors of covered workers.
- DI (Disability Insurance) covers workers who become unable to engage in substantial gainful activity due to a medically determinable physical or mental impairment expected to last at least 12 months or result in death. Approximately 8.8 million people received DI benefits in 2023, totaling roughly $160 billion annually. DI beneficiaries automatically transition to OASI at full retirement age.
- SSI (Supplemental Security Income) is a separate means-tested program administered by SSA but funded from general revenues rather than the FICA payroll tax. SSI provides income support to aged, blind, and disabled individuals with limited income and resources. Approximately 7.5 million people received SSI in 2023, receiving roughly $65 billion in payments. SSI is not OASDI — it does not require a work history and is not funded by the trust funds.
These three programs serve overlapping but distinct populations. A person may receive OASI as a retired worker while their surviving spouse receives OASI survivor benefits. A person with a disability may receive both DI (based on work history) and SSI (as a means-tested supplement if DI alone is insufficient). Understanding the population covered by each program is essential for correctly interpreting SSA data tables.
Trust Fund Mechanics
OASDI is funded primarily by the Federal Insurance Contributions Act (FICA) payroll tax. Employees pay 6.2% of covered wages and employers match with another 6.2%, for a combined rate of 12.4%. Self-employed workers pay the full 12.4% as the Self-Employment Contributions Act (SECA) tax. The tax applies only up to the taxable maximum — $168,600 in 2024 — which is indexed annually to the national Average Wage Index (AWI). Wages above the taxable maximum are not subject to FICA and do not generate additional Social Security credits.
OASI and DI maintain separate trust funds. Revenue flows from the Treasury through the trust funds to beneficiaries. The trust funds do not hold cash; instead, they hold special-issue Treasury securities that are non-marketable (they cannot be sold on the open market) but bear interest at a current market rate. As of 2023, the OASI Trust Fund held approximately $2.75 trillion in these securities and the DI Trust Fund held approximately $96 billion.
The financial trajectory of the trust funds is the subject of annual actuarial analysis published in the Social Security Trustees Report, typically released each April. The 2024 Trustees Report projected OASI Trust Fund depletion in 2034. This does not mean Social Security ceases to exist in 2034 — FICA taxes continue flowing in regardless of trust fund balance. It means that after 2034, incoming revenue would be sufficient to pay only approximately 77% of scheduled benefits without legislative changes. The 75-year actuarial deficit — the present value of the gap between projected revenues and expenditures over the long-range period — was 3.50% of taxable payroll as of the 2024 report.
The DI program has been in better financial shape than OASI in recent years, partly because disability applications and awards declined from the peak levels of the 2008–2015 period. The 2024 Trustees Report projected the DI Trust Fund would remain solvent through at least the 75-year projection window.
Benefit Formula: AIME and PIA
Social Security retirement benefits are not flat payments — they are calculated through a formula that replaces a higher percentage of pre-retirement earnings for lower earners than for higher earners, making the program progressive in structure. The formula has two stages: computing Average Indexed Monthly Earnings (AIME) and converting AIME to Primary Insurance Amount (PIA).
AIME computation. SSA takes the worker's complete earnings record, indexes each year's wages to the national AWI for the year the worker turns 60, selects the 35 highest-earning years, sums them, and divides by 420 (35 years × 12 months). Years with zero earnings count as zeros, so a worker with fewer than 35 years of covered employment has those zero years diluting the AIME. The indexing step is critical: wages earned in 1985 are multiplied by a ratio reflecting wage growth between 1985 and the worker's age-60 year, so the formula measures career earnings in today's wage terms rather than nominal historical dollars.
PIA formula and bend points. The PIA is computed by applying a three-bracket formula to the AIME:
- 90% of AIME up to the first bend point ($1,174 in 2024)
- 32% of AIME between the first and second bend points ($1,174–$7,078 in 2024)
- 15% of AIME above the second bend point
The bend points are adjusted annually with the AWI. A worker with an AIME exactly at the first bend point replaces 90% of their indexed career-average monthly earnings. A worker with an AIME at the second bend point has a PIA that replaces roughly 40% of AIME. A very high earner at the taxable maximum replaces approximately 27–30% of AIME. This progressive structure means that Social Security is more important as an income source for lower-wage workers than for high earners.
Full Retirement Age and actuarial adjustments. Full Retirement Age (FRA) is 67 for anyone born in 1960 or later. Claiming at 62 — the earliest eligibility age — permanently reduces the benefit by approximately 30% relative to the PIA. Delayed claiming beyond FRA earns Delayed Retirement Credits of 8% per year, up to age 70, at which point the benefit is 124% of PIA. The actuarial reduction and credits are designed so that expected lifetime benefits are roughly equivalent regardless of claiming age for someone with average life expectancy — though in practice, the break-even calculation favors delayed claiming for those with above-average life expectancy.
Spousal benefits equal up to 50% of the worker's PIA (if higher than the spouse's own earned benefit). Survivor benefits can reach 100% of the deceased worker's benefit. Cost-of-living adjustments (COLA) are calculated annually using the Consumer Price Index for Urban Wage Earners and Clerical Workers (CPI-W), comparing the third quarter of each year against the prior year's third quarter. The 2023 COLA was 8.7% — the largest since 1981 — reflecting the post-pandemic inflation surge. The 2024 COLA was 3.2%. Once benefits begin, COLA applies uniformly to all beneficiaries.
SSA Public Data Infrastructure
SSA's open data portal at data.ssa.gov provides access to the primary statistical publications. The most important are:
Monthly Statistical Snapshot. Published monthly, this one-page table gives current beneficiary counts and total monthly payment amounts by program type: OASI retired workers, OASI survivors, OASI dependents, DI disabled workers, DI dependents, and SSI recipients. The snapshot is the fastest way to track current program scale. It is available as both a PDF table and a downloadable CSV from data.ssa.gov.
Annual Statistical Supplement to the Social Security Bulletin. This is the definitive reference publication, covering historical tables going back to 1940. Key tables for programmatic research:
- Table 5.A — OASDI beneficiaries and total monthly payments by state and beneficiary type. Enables state-level penetration rate analysis when combined with Census population estimates.
- Table 4.B — Disability Insurance applications, allowances, and denial rates by state. This table reveals substantial geographic variation in disability determination outcomes that is not attributable to population health differences alone.
- Table 6.C — SSI recipients by state, eligibility category (aged, blind, disabled), and age group. Useful for identifying states with high rates of concurrent SSDI/SSI receipt.
OASDI Beneficiaries by State and County. SSA publishes this dataset annually as a CSV/Excel file covering every county in the US. It includes beneficiary counts broken down by retired workers, disabled workers, survivors, and dependents, as well as average monthly benefit amounts. This is the most granular geographic view of Social Security coverage available. States with the highest beneficiary penetration relative to the 65+ population tend to be retirement destinations (Florida) or states with older populations and lower-wage economies (West Virginia, Maine). The average retired worker benefit as of 2024 was approximately $1,907 per month.
Actuarial Publications. SSA's Office of the Chief Actuary publishes detailed life tables, trust fund projections, wage statistics, and methodology documents. The Trustees Report appendices contain the intermediate assumptions for fertility, mortality, immigration, labor force participation, and productivity that drive the 75-year projections. Alternative assumptions (optimistic and pessimistic scenarios) are published alongside the intermediate case. These documents are essential for any research touching solvency.
FRED integration. The Federal Reserve's FRED database hosts key SSA series for time-series work: SSASSHDI (disabled beneficiary count), OASDI total expenditures, and wage base series. FRED allows programmatic access via the FRED API, making it easier to incorporate SSA statistics into models alongside macroeconomic data.
Earnings Records and the Social Security Statement
Every person assigned a Social Security Number has an earnings record maintained by SSA. This record documents covered wages year by year, back to the inception of the worker's participation in the covered workforce. It is arguably the most comprehensive employment history database in the US government — more complete than IRS records for many workers because it tracks wages from every employer, not just self-reported income.
The Social Security Statement — historically mailed annually to all workers aged 25 and older, now available online at ssa.gov/myaccount — shows estimated retirement benefits at ages 62, 67 (FRA), and 70; estimated disability and survivor benefits; a year-by-year earnings history; and the worker's quarters of coverage (40 quarters required for retirement benefit eligibility). Workers can request their full earnings record under the Privacy Act using SSA Form SSA-7050 (Request for Social Security Earnings Information).
Section 6103 of the Internal Revenue Code governs disclosure of SSA earnings records. These records receive strict legal protection and can be shared only with specified authorized parties — the IRS for tax administration, Treasury for debt collection, DHS for immigration verification, and others under narrow statutory exceptions. Researchers generally cannot access individual earnings records; the public-use microdata files SSA releases for research purposes use synthetic or masked earnings data.
Quarters of coverage (QCs) are the unit of Social Security eligibility. In 2024, a worker earns one QC for each $1,730 in covered earnings, up to four QCs per year. The $1,730 figure is indexed annually. Forty QCs (10 years of at least minimal covered employment) are required for retirement benefit eligibility, though the formula rewards workers who accumulate more QCs by including more years of earnings in the AIME calculation.
Disability Determination: The Sequential Evaluation Process
Social Security Disability Insurance has a substantially more complex administrative process than retirement benefits. Initial claims are processed by state Disability Determination Services (DDS) agencies, which operate under federal contract with SSA. The DDS applies the Social Security Administration's five-step sequential evaluation:
- Step 1 — Substantial Gainful Activity (SGA). If the claimant is working and earning above the SGA threshold ($1,550/month in 2024 for non-blind individuals), the claim is denied at this step without examining medical evidence.
- Step 2 — Severe Impairment. The claimant must have at least one medically determinable physical or mental impairment that significantly limits basic work activities. Claims are denied at step 2 if the impairment is not considered severe or if it is not expected to last 12 months.
- Step 3 — Listing of Impairments. SSA publishes the Listing of Impairments, commonly called the Blue Book, which catalogs specific medical conditions that automatically qualify for disability benefits if the documented findings meet the listing criteria. Conditions covered include musculoskeletal disorders, cardiovascular conditions, respiratory disorders, cancer, neurological disorders, and mental disorders. If the claimant's condition meets or equals a listing, benefits are awarded at step 3 without further analysis.
- Step 4 — Past Relevant Work. If the claimant's condition does not meet a listing, the DDS assesses Residual Functional Capacity (RFC) — the most the claimant can do despite impairments. If the RFC permits performing past relevant work (jobs held in the prior 15 years), the claim is denied.
- Step 5 — Other Work. If the RFC prevents past relevant work, SSA must show that other jobs exist in significant numbers in the national economy that the claimant can perform given their RFC, age, education, and work experience. The Medical- Vocational Guidelines (“vocational grids”) provide a matrix that directs outcomes based on these factors. Vocational expert testimony is typically required at this step when the grid does not direct a finding.
Initial denial rates vary significantly by state. SSA Table 4.B shows that initial allowance rates ranged from approximately 35% to over 50% across states in recent years, with no clear relationship to underlying population health. Research has attributed much of this variation to DDS adjudicator practices, hearing office characteristics, and the medical evidence standards applied by individual decision-makers.
Denied claimants may request reconsideration, then an Administrative Law Judge (ALJ) hearing if reconsideration is denied. The ALJ backlog reached approximately one million pending hearings at its peak. Average wait time from hearing request to ALJ decision has historically run 18 months or longer. After the ALJ level, claimants may appeal to the Appeals Council and ultimately to federal district court. The SSA HALLEX (Hearings, Appeals and Litigation Law manual) governs ALJ hearing procedures and is publicly available on ssa.gov.
SSDI vs. SSI: Parallel Systems
The distinction between SSDI (Social Security Disability Insurance) and SSI (Supplemental Security Income) matters for both research and policy analysis. SSDI is contributory: it requires a work history with sufficient quarters of coverage and is funded by the FICA payroll tax through the DI Trust Fund. The benefit amount is calculated from the worker's AIME just as a retirement benefit would be, and SSDI beneficiaries receive Medicare after a 24-month waiting period.
SSI is fundamentally different. It requires no work history, is means-tested (subject to income and asset limits), and is funded by general revenues rather than the trust funds. The federal SSI payment was $943/month for an individual in 2024, with many states providing a supplemental payment on top. SSI recipients automatically qualify for Medicaid in most states. Many disabled workers receive both SSDI and SSI concurrently — when the SSDI benefit is low enough that income plus resources falls below the SSI eligibility threshold.
Windfall Elimination Provision and Government Pension Offset
Two provisions historically reduced Social Security benefits for certain public sector workers: the Windfall Elimination Provision (WEP) and the Government Pension Offset (GPO).
WEP reduced Social Security benefits for workers who received a pension from non-covered employment — jobs not subject to FICA taxation. Several states — including Alaska, Colorado, Louisiana, Maine, Massachusetts, Nevada, Ohio, and Texas — have significant public sector workforces whose members participated in state pension systems rather than Social Security. Because the AIME/PIA formula is designed to replace a higher percentage of earnings for low-wage workers, someone with a short covered work history and a large pension from non-covered employment would receive a disproportionately large Social Security benefit without WEP. The provision modified the formula's first bracket from 90% to a lower replacement rate for affected workers.
GPO reduced spousal and survivor benefits by two-thirds of the government pension amount. This provision affected many teachers, police officers, and firefighters who did not pay into Social Security and whose spouses were covered workers.
Both provisions were eliminated by the Social Security Fairness Act, signed by President Biden in January 2025 — the largest expansion of Social Security benefits in decades. The repeal was retroactive to December 2023, and approximately 3.2 million affected workers and survivors became entitled to retroactive payments and higher ongoing benefits. The repeal increased the 75-year actuarial deficit of the trust funds, as WEP and GPO had previously been deficit-reducing provisions.
SSA FOIA and Program Policy Manuals
SSA's FOIA reading room at ssa.gov/foia/ contains an extensive library of program policy documents. The most important for researchers and practitioners is the Program Operations Manual System (POMS), which is SSA's internal operating manual governing how field office staff and DDS adjudicators apply policy. POMS is organized by sections corresponding to program components — GN (general), DI (disability), SI (supplemental income), HI (health insurance) — and is publicly available in its entirety. POMS is authoritative on the administrative interpretation of Social Security law and is frequently cited in ALJ decisions and federal court opinions.
The Annual Statistical Supplement tables are available in PDF atssa.gov/policy/docs/statcomps/supplement/, with some tables also available as Excel files. The state and county beneficiary files are posted as CSV downloads. SSA also publishes research working papers through the Social Security Bulletin, which are open access on ssa.gov.
Python: Analyzing OASDI Beneficiaries by State
The following script downloads SSA's state-and-county OASDI beneficiary CSV, rolls it up to the state level, fetches Census 65+ population estimates via the Population Estimates API, and computes retired-worker beneficiaries as a percentage of the 65+ population. It then ranks states by penetration rate and disabled-worker count.
import requests
import csv
import io
import json
# -----------------------------------------------------------------------
# Part 1: SSA state-level OASDI beneficiaries
# SSA publishes "OASDI Beneficiaries by State and County" annually.
# The CSV is available on data.ssa.gov:
# https://www.ssa.gov/policy/docs/statcomps/oasdi_sc/2023/oasdi_sc23.csv
# Columns include: State, County, Total beneficiaries, Retired workers,
# Disabled workers, Survivors, Dependents, Avg monthly benefit (retired)
# -----------------------------------------------------------------------
OASDI_STATE_URL = (
"https://www.ssa.gov/policy/docs/statcomps/oasdi_sc/2023/oasdi_sc23.csv"
)
print("Downloading SSA OASDI state/county beneficiary file...")
resp = requests.get(OASDI_STATE_URL, timeout=60)
resp.raise_for_status()
reader = csv.DictReader(io.StringIO(resp.text))
rows = list(reader)
print("Rows loaded:", len(rows))
# Roll up to state level (skip county-level rows by grouping on state code)
state_totals = {}
for row in rows:
state = row.get("State", "").strip()
if not state or len(state) != 2:
continue
if state not in state_totals:
state_totals[state] = {
"total_beneficiaries": 0,
"retired_workers": 0,
"disabled_workers": 0,
"avg_benefit_sum": 0.0,
"avg_benefit_count": 0,
}
def safe_int(v):
try:
return int(v.replace(",", "").strip())
except Exception:
return 0
def safe_float(v):
try:
return float(v.replace(",", "").replace("$", "").strip())
except Exception:
return 0.0
state_totals[state]["total_beneficiaries"] += safe_int(
row.get("Total beneficiaries", "0")
)
state_totals[state]["retired_workers"] += safe_int(
row.get("Retired workers", "0")
)
state_totals[state]["disabled_workers"] += safe_int(
row.get("Disabled workers", "0")
)
avg = safe_float(row.get("Avg monthly benefit, retired workers", "0"))
if avg > 0:
state_totals[state]["avg_benefit_sum"] += avg
state_totals[state]["avg_benefit_count"] += 1
# -----------------------------------------------------------------------
# Part 2: Census 65+ population estimates for penetration rate calculation
# Census Population Estimates API (vintage 2023):
# https://api.census.gov/data/2023/pep/population?get=NAME,POP_65PLUS&for=state:*
# -----------------------------------------------------------------------
CENSUS_URL = (
"https://api.census.gov/data/2023/pep/population"
"?get=NAME,POP_65PLUS&for=state:*"
)
STATE_FIPS_TO_ABBR = {
"01": "AL", "02": "AK", "04": "AZ", "05": "AR", "06": "CA",
"08": "CO", "09": "CT", "10": "DE", "11": "DC", "12": "FL",
"13": "GA", "15": "HI", "16": "ID", "17": "IL", "18": "IN",
"19": "IA", "20": "KS", "21": "KY", "22": "LA", "23": "ME",
"24": "MD", "25": "MA", "26": "MI", "27": "MN", "28": "MS",
"29": "MO", "30": "MT", "31": "NE", "32": "NV", "33": "NH",
"34": "NJ", "35": "NM", "36": "NY", "37": "NC", "38": "ND",
"39": "OH", "40": "OK", "41": "OR", "42": "PA", "44": "RI",
"45": "SC", "46": "SD", "47": "TN", "48": "TX", "49": "UT",
"50": "VT", "51": "VA", "53": "WA", "54": "WV", "55": "WI",
"56": "WY", "72": "PR",
}
print("\nFetching Census 65+ population estimates...")
pop_resp = requests.get(CENSUS_URL, timeout=30)
pop_resp.raise_for_status()
pop_data = pop_resp.json()
pop_65plus = {}
for row in pop_data[1:]: # skip header
name, pop, fips = row[0], int(row[1]), row[2]
abbr = STATE_FIPS_TO_ABBR.get(fips)
if abbr:
pop_65plus[abbr] = pop
# -----------------------------------------------------------------------
# Part 3: Compute retired-worker beneficiaries as % of 65+ population
# and rank by average monthly disability benefit
# -----------------------------------------------------------------------
results = []
for state, data in state_totals.items():
pop = pop_65plus.get(state, 0)
retired = data["retired_workers"]
penetration = (retired / pop * 100) if pop > 0 else None
avg_count = data["avg_benefit_count"]
avg_benefit = (
data["avg_benefit_sum"] / avg_count if avg_count > 0 else None
)
results.append({
"state": state,
"total_beneficiaries": data["total_beneficiaries"],
"retired_workers": retired,
"disabled_workers": data["disabled_workers"],
"pop_65plus": pop,
"retired_pct_of_65plus": round(penetration, 1) if penetration else None,
"avg_monthly_benefit_retired": round(avg_benefit, 2) if avg_benefit else None,
})
# Sort by retired-worker penetration rate
results.sort(
key=lambda r: r["retired_pct_of_65plus"] or 0,
reverse=True,
)
print("\nTop 10 states by retired-worker beneficiaries as % of 65+ population:")
print(f"{'State':<6} {'Retired':<12} {'65+ Pop':<12} {'Pct':<8} {'Avg Benefit'}")
print("-" * 55)
for r in results[:10]:
pct = f"{r['retired_pct_of_65plus']}%" if r["retired_pct_of_65plus"] else "N/A"
avg = f"${r['avg_monthly_benefit_retired']}" if r["avg_monthly_benefit_retired"] else "N/A"
print(
f"{r['state']:<6} {r['retired_workers']:<12,} "
f"{r['pop_65plus']:<12,} {pct:<8} {avg}"
)
# Sort by disabled-worker count
results.sort(key=lambda r: r["disabled_workers"], reverse=True)
print("\nTop 10 states by disabled-worker beneficiary count:")
print(f"{'State':<6} {'Disabled Workers'}")
print("-" * 25)
for r in results[:10]:
print(f"{r['state']:<6} {r['disabled_workers']:>12,}")
# Write to CSV
out_path = "ssa_oasdi_state_analysis.csv"
fieldnames = [
"state", "total_beneficiaries", "retired_workers", "disabled_workers",
"pop_65plus", "retired_pct_of_65plus", "avg_monthly_benefit_retired",
]
with open(out_path, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(results)
print("\nSaved:", out_path)
A few implementation notes. The SSA county-level file uses two-letter state abbreviations as a state identifier; rows with non-standard state codes should be filtered out. The Census Population Estimates API (vintage 2023) requires FIPS-to-abbreviation translation since it returns FIPS codes rather than state abbreviations. The penetration rate — retired workers divided by 65+ population — will often exceed 100% in states with large retirement influxes, because many beneficiaries moved to those states after their covered employment occurred elsewhere. Florida's retired-worker beneficiaries substantially exceed its 65+ population as a ratio because it draws retirees from across the country. West Virginia's high ratio reflects both an older population and lower labor force participation among younger residents. The DI beneficiary count is a separate metric that tracks disability prevalence and DDS allowance patterns rather than retirement demographics.
For longitudinal analysis, SSA posts archived county files going back to the early 2000s at the same URL pattern with the year embedded in the filename. Joining multiple years on state and county FIPS codes allows tracking of how beneficiary populations have grown or shifted geographically over time.
Most nonprofit employees are covered by Social Security and appear in SSA earnings records, though employees of some churches and religious organizations may be exempt from FICA coverage if their employer elected out. The financial disclosures underlying nonprofit compensation are available through IRS Form 990. See IRS Form 990: The Public Financial Disclosure Behind Every Major US Nonprofit.
For incident-level federal crime data — the adjacent dataset in this federal statistics series — the FBI's National Incident-Based Reporting System (NIBRS) covers offense, victim, offender, arrest, and property records from participating agencies. See FBI NIBRS: Incident-Level Crime Data for Offense Pattern and Clearance Rate Analysis.