Per-Pupil Expenditure (FESR)
Annual per-pupil spending — total, federal, and state/local — for Georgia school districts (2014-2025) and schools (2017-2025), from the FESR methodology.
- 2014–2025
- annual
- 1.0.0
- ea9016eba4ca
Overview
Annual per-pupil expenditure panel for Georgia public school districts and schools under the Financial Efficiency Star Rating (FESR) methodology of the Governor's Office of Education and Workforce Strategy (GOEWS, formerly GOSA): total, federal, and state/local expenditures, full-time-equivalent K-12 enrollment, and the resulting per-pupil expenditure (PPE) for every fiscal year the FESR downloads cover — district rows FY2014-FY2025 (the 180 traditional systems), school rows FY2017-FY2025 (all schools, including charter authorizers). District rows additionally carry the federal vs state/local split of total expenditures; school rows additionally carry the pre-allocation included/excluded expenditure split and the school's share of district enrollment. This is the FESR included-cost per-pupil series, whereas the k12_expenditures topic is the full function-level expenditure ledger — their totals intentionally differ (FESR excludes capital, debt, and other non-included costs). It is also the reliable school-level PPE series: the k12_expenditures school per-pupil column equals the total dollar amount on every 2023-24 school row and on about 3,000 mostly non-traditional school rows a year in most other years. The FESR star ratings built from this panel live in the sibling financial_efficiency_star_rating topic.
Row grain: One row per year, district_code, school_code.
per_pupil_expenditure — Per-Pupil Expenditure (currency)
The single headline value most answers want.
Variables
Every column in the fact table. The code is the exact field name the API returns.
| Column | Type | Unit | Range | Null? | Description |
|---|---|---|---|---|---|
year | integer | — | — | no | Fiscal year the row's expenditure and enrollment inputs refer to (e.g. FY2024 = 2023-24 school year). Differs from the bronze filename year for back-window rows: each rolling FESR report covers up to 3 fiscal years, but gold keys every row by the actual fiscal year.Full description▾Fiscal year the row's expenditure and enrollment inputs refer to (e.g. FY2024 = 2023-24 school year). Differs from the bronze filename year for back-window rows: each rolling FESR report covers up to 3 fiscal years, but gold keys every row by the actual fiscal year. |
district_code | string | — | — | no | GOSA district/system code (FK to districts dimension), zero-padded to 3 digits (7-digit codes are charter authorizers, school rows only). District-detail rows cover the 180 traditional school systems (codes 601-793); school-detail rows additionally include charter authorizer codes. Populated on every row.Full description▾GOSA district/system code (FK to districts dimension), zero-padded to 3 digits (7-digit codes are charter authorizers, school rows only). District-detail rows cover the 180 traditional school systems (codes 601-793); school-detail rows additionally include charter authorizer codes. Populated on every row. |
school_code | string | — | — | yes | GOSA school code, zero-padded to 4 characters (composite FK to schools dimension with district_code; not globally unique on its own). Populated on school rows only — district aggregate rows carry NULL.Full description▾GOSA school code, zero-padded to 4 characters (composite FK to schools dimension with district_code; not globally unique on its own). Populated on school rows only — district aggregate rows carry NULL. |
total_expenditures | number | — | yes | Total expenditures for the fiscal year (nominal dollars, not inflation-adjusted). For DISTRICT rows this is the district's total included expenditures (= federal_expenditures + state_local_expenditures within $1, enforced by a quality check). For SCHOOL rows this is the per-school total — included expenditures plus the school's allocated share of district central costs (= total_federal_expenditures + total_state_local_expenditures within $10; from FY22 also folds in Allocated CCA and Alternative Program costs, so FY22+ school totals are not strictly comparable to FY17-FY21). per_pupil_expenditure = total_expenditures / fte_enrollment at both levels.Full description▾Total expenditures for the fiscal year (nominal dollars, not inflation-adjusted). For DISTRICT rows this is the district's total included expenditures (= federal_expenditures + state_local_expenditures within $1, enforced by a quality check). For SCHOOL rows this is the per-school total — included expenditures plus the school's allocated share of district central costs (= total_federal_expenditures + total_state_local_expenditures within $10; from FY22 also folds in Allocated CCA and Alternative Program costs, so FY22+ school totals are not strictly comparable to FY17-FY21). per_pupil_expenditure = total_expenditures / fte_enrollment at both levels. | |
fte_enrollment | integer | — | yes | Full-time-equivalent K-12 enrollment, the denominator of per_pupil_expenditure (per_pupil_expenditure = total_expenditures / fte_enrollment within rounding at both detail levels, enforced by a quality check).Full description▾Full-time-equivalent K-12 enrollment, the denominator of per_pupil_expenditure (per_pupil_expenditure = total_expenditures / fte_enrollment within rounding at both detail levels, enforced by a quality check). | |
per_pupil_expenditure | number | — | yes | Total dollars spent per student for the fiscal year (nominal, not inflation-adjusted).Full description▾Per-pupil expenditure for the fiscal year (nominal dollars) = total_expenditures / fte_enrollment, as published (rounded to cents by the source). A few Fulton County (district 660) school rows in FY21/FY22 are negative — faithful GOSA restatements preserved per §4b, not errors. Very small schools publish extreme values: 18 school rows (9 schools, one to four a year in FY2017-FY2025) have an fte_enrollment of 10 or fewer, e.g. Dooly County Prep Academy (646/0205) at 1 FTE and $243,148.59 per pupil in FY2025, and the topic's maximum, Hank Aaron New Beginnings Academy (761/0403) at 9 FTE and about $544,470 in FY2022. Published as is; filter on fte_enrollment before ranking or averaging schools. | |
federal_per_pupil_expenditure | number | — | yes | Federal portion of per_pupil_expenditure (nominal dollars). federal_per_pupil_expenditure + state_local_per_pupil_expenditure = per_pupil_expenditure within rounding (enforced by a quality check). NULL for district FY2014.Full description▾Federal portion of per_pupil_expenditure (nominal dollars). federal_per_pupil_expenditure + state_local_per_pupil_expenditure = per_pupil_expenditure within rounding (enforced by a quality check). NULL for district FY2014. | |
state_local_per_pupil_expenditure | number | — | yes | State + local portion of per_pupil_expenditure (nominal dollars). NULL for district FY2014.Full description▾State + local portion of per_pupil_expenditure (nominal dollars). NULL for district FY2014. | |
federal_expenditures | number | — | yes | Federal portion of the district's total_expenditures (nominal dollars). District-detail rows only. The school-level analogue of this quantity is total_federal_expenditures (both split the shared total_expenditures column); they are kept as separate columns because the school download names them differently and additionally publishes the pre-allocation included_* split, which districts do not.Full description▾Federal portion of the district's total_expenditures (nominal dollars). District-detail rows only. The school-level analogue of this quantity is total_federal_expenditures (both split the shared total_expenditures column); they are kept as separate columns because the school download names them differently and additionally publishes the pre-allocation included_* split, which districts do not. | |
state_local_expenditures | number | — | yes | State + local portion of the district's total_expenditures (nominal dollars). District-detail rows only; the school-level analogue is total_state_local_expenditures.Full description▾State + local portion of the district's total_expenditures (nominal dollars). District-detail rows only; the school-level analogue is total_state_local_expenditures. | |
included_expenditures | number | — | yes | Total included expenditures for the school (nominal dollars), BEFORE allocation of district central costs — the school's total_expenditures equals included_expenditures plus its allocated central-cost share. School-detail rows only. Placeholder $0 values on unreported/non-compliant FY17-FY18 rows are NULLed per §4b (see limitations).Full description▾Total included expenditures for the school (nominal dollars), BEFORE allocation of district central costs — the school's total_expenditures equals included_expenditures plus its allocated central-cost share. School-detail rows only. Placeholder $0 values on unreported/non-compliant FY17-FY18 rows are NULLed per §4b (see limitations). | |
included_federal_expenditures | number | — | yes | Federal portion of the school's included_expenditures (nominal dollars). included_federal_expenditures + included_state_local_expenditures = included_expenditures (exact in the canonical bronze blocks; enforced by a quality check). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b. A small number of rows (24 across nine districts, FY2017-FY2025, none in FY2022 or FY2024) carry negative values — federal-side restatements faithful to bronze, preserved per §4b.Full description▾Federal portion of the school's included_expenditures (nominal dollars). included_federal_expenditures + included_state_local_expenditures = included_expenditures (exact in the canonical bronze blocks; enforced by a quality check). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b. A small number of rows (24 across nine districts, FY2017-FY2025, none in FY2022 or FY2024) carry negative values — federal-side restatements faithful to bronze, preserved per §4b. | |
included_state_local_expenditures | number | — | yes | State + local portion of the school's included_expenditures (nominal dollars). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b.Full description▾State + local portion of the school's included_expenditures (nominal dollars). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b. | |
excluded_expenditures | number | — | yes | Expenditures excluded from the PPE computation (nominal dollars) per the FESR methodology. NOT a component of total_expenditures (totals = included + allocated central costs). School-detail rows only. A few rows per year carry negative values (52 rows under 19 district codes, charter systems included; one to ten in each of FY2017-FY2025) — faithful GOSA restatements preserved per §4b. FY17-FY18 placeholder $0 values NULLed per §4b. No district-level counterpart is served: the 2025 district workbook's district excluded expenditures (FY2023-FY2025) are a different, much larger quantity and are not carried (see limitations).Full description▾Expenditures excluded from the PPE computation (nominal dollars) per the FESR methodology. NOT a component of total_expenditures (totals = included + allocated central costs). School-detail rows only. A few rows per year carry negative values (52 rows under 19 district codes, charter systems included; one to ten in each of FY2017-FY2025) — faithful GOSA restatements preserved per §4b. FY17-FY18 placeholder $0 values NULLed per §4b. No district-level counterpart is served: the 2025 district workbook's district excluded expenditures (FY2023-FY2025) are a different, much larger quantity and are not carried (see limitations). | |
total_federal_expenditures | number | — | yes | Federal portion of the school's total_expenditures (post-allocation; nominal dollars). The school-level analogue of the district's federal_expenditures (both split the shared total_expenditures). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b.Full description▾Federal portion of the school's total_expenditures (post-allocation; nominal dollars). The school-level analogue of the district's federal_expenditures (both split the shared total_expenditures). School-detail rows only. FY17-FY18 placeholder $0 values NULLed per §4b. | |
total_state_local_expenditures | number | — | yes | State + local portion of the school's total_expenditures (post-allocation; nominal dollars). School-detail rows only; the district analogue is state_local_expenditures. FY17-FY18 placeholder $0 values NULLed per §4b.Full description▾State + local portion of the school's total_expenditures (post-allocation; nominal dollars). School-detail rows only; the district analogue is state_local_expenditures. FY17-FY18 placeholder $0 values NULLed per §4b. | |
pct_of_district_enrollment | number | — | yes | The school's share of its district's total enrollment, 0-1 decimal (0.2912 = 29.12%), used by the FESR methodology to allocate district central costs. School-detail rows only. Caveat: within-district sums are not a strict partition — beyond rounding they exceed 1.005 in 59 district-years (12 districts, FY2019-FY2025; none in FY2017-FY2018), up to 1.855 for district 666 in FY2025 (district 666 sums to 1.66-1.86 in every year FY2019-FY2025), faithful to bronze.Full description▾The school's share of its district's total enrollment, 0-1 decimal (0.2912 = 29.12%), used by the FESR methodology to allocate district central costs. School-detail rows only. Caveat: within-district sums are not a strict partition — beyond rounding they exceed 1.005 in 59 district-years (12 districts, FY2019-FY2025; none in FY2017-FY2018), up to 1.855 for district 666 in FY2025 (district 666 sums to 1.66-1.86 in every year FY2019-FY2025), faithful to bronze. |
Filters
Query parameters the fact endpoint accepts. Comma-separated values are OR within a parameter; multiple parameters AND together.
| Parameter | Kind | Allowed values | Notes |
|---|---|---|---|
year | year_exact | any value | — |
year_min | year_range | any value | — |
year_max | year_range | any value | — |
detail | detail | districtsschools | enum-enforced, default: schools |
district_code | foreign_key | any value | multi-value |
school_code | foreign_key | any value | multi-value |
district_type | dimension_attribute | 7 allowed values▾
| multi-value, enum-enforced |
school_level | dimension_attribute | elementarymiddlehighk12other | multi-value, enum-enforced |
locale | dimension_attribute | citysuburbtownrural | multi-value, enum-enforced |
Example requests
Run these against the base URL — they return live data.
All rows (first page), schools level
curl "https://georgiacivicdata.org/api/v1/education/per_pupil_expenditure"schools data for 2025
curl "https://georgiacivicdata.org/api/v1/education/per_pupil_expenditure?year=2025"One district (code 657), 2025
curl "https://georgiacivicdata.org/api/v1/education/per_pupil_expenditure?district_code=657&year=2025&detail=districts"Download 2025 as CSV
curl "https://georgiacivicdata.org/api/v1/education/per_pupil_expenditure?year=2025&format=csv"Notes & limitations
NULL handling
- Zero is a real, reported value.
Limitations
Two detail levels (district, school) in one fact table, split by parquet filename; school_code is NULL on district rows. Detail level is read from the geography-key NULL pattern. The district level covers FY2014-FY2025 (180 traditional systems, codes 601-793, no charters/RESAs/state agencies); the school level covers FY2017-FY2025 (all schools, including charter authorizers). School rows for each fiscal year are the schools listed by that fiscal year's OWN FESR publication; later rolling-window files that republish the year only fill NULL cells on those schools, and school codes that appear only in a later file's back-window (GOSA re-coded schools restated under new codes — 11 FY2017 and 5 FY2018 keys, including the four FY2017/FY2018 per-pupil-only rows the 2019 file annotates as involved in a FY18 code change) are dropped and ledgered in _transform_manifest.json as school_code_restated_in_later_publication, so a district-year never carries two breakouts of the same money; a quality check keeps 3-digit-district school fte_enrollment sums within 5% of the district row. Verified in gold: in every 3-digit district-year the school rows sum to the district row's fte_enrollment exactly, and to its total_expenditures within 0.3% in every district-year except two in FY2025 (district 705 +1.85%, district 755 -0.88%); the two levels come from independent GOSA downloads, so exact dollar agreement is not guaranteed. Level-specific columns are NULL on the other level: federal_expenditures / state_local_expenditures are district-only; included_* / excluded_expenditures / total_federal_expenditures / total_state_local_expenditures / pct_of_district_enrollment are school-only. The district federal_expenditures and the school total_federal_expenditures are the same federal share of total_expenditures but are kept as separate columns (different source naming; schools also publish the distinct pre-allocation included_* split). District federal/state-local breakdowns are NULL for FY2014 (the only source covering FY14 published totals only). The 2025 district workbook adds a district excluded-expenditure figure (District_Excluded_Amt_23/_24/_25, FY2023-FY2025) that is NOT carried: it is not the district total of the school excluded_expenditures (in FY2025 the district's schools' excluded amounts sum to a median ~7% of it), so it does not fit that school-only column; the omission is ledgered in _transform_manifest.json read_loss. FY2022 methodology change: from FY22 school total_expenditures (and per_pupil_expenditure) additionally include Allocated CCA and Alternative Program costs (still so in FY2025, per that file's variable key), so FY22+ school totals are not strictly comparable to FY17-FY21. This is the FESR included-cost per-pupil series — totals intentionally differ from the k12_expenditures function-level expenditure ledger. Placeholder $0 school expenditure amounts on unreported/non-compliant FY17-FY18 rows are NULLed per §4b (see _transform_manifest.json masked_values). One FY2021 school row (7830629/0629) publishes the literal 'Non-Compliant' publisher status in all three per-pupil columns; those three values are NULL here (recorded in masked_values; the status is preserved as is_non_compliant in the financial_efficiency_star_rating topic). Negative dollar values occur in three places and are faithful GOSA restatements preserved as-is: per_pupil_expenditure / total_expenditures / included_expenditures and their state-local components on three district 660 (Fulton County) school rows in FY21-FY22; excluded_expenditures on a few rows every year (52 rows, FY2017-FY2025); and included_federal_expenditures on 24 rows across nine districts (FY2017-FY2025). Currency is nominal dollars (not inflation-adjusted). No cell-level small-cell suppression exists in this source; NULLs are structural or §4b masks, never suppression.