K-12 Expenditures by Spending Function
K-12 dollars spent by Georgia public schools and districts, broken out by spending function (instruction, transportation, administration, ...), 2011-2024.
- 2011–2024
- annual
- 1.0.0
- f87003f1c86b
Overview
K-12 expenditures for every Georgia public school, school district, and the state as a whole, by spending function, published by the Governor's Office of Student Achievement (GOSA). Each row reports the total dollar amount and the per-FTE (full-time-equivalent student) dollar amount for one of 11 expenditure functions — instruction, pupil services, instructional support, school administration, general administration, maintenance and operations, transportation, media, school food services, debt services, and renovation and capital projects — covering school years 2010-11 through 2023-24. This is the full function-level spending ledger: all expenditures, broken out by function. The revenue side of the same GOSA report lives in the sibling topic `k12_revenues` (K-12 revenues by funding source, district/state detail); the two topics split the retired combined `revenues_and_expenditures` topic (one measure family per fact table) and share one bronze source, so they join cleanly on year and district_code. Distinct from the `per_pupil_expenditure` topic (FESR methodology), which is an included-cost per-pupil spending series whose totals intentionally differ from this full ledger.
Row grain: One row per year, district_code, school_code, expenditure_function.
expenditure_amount — Expenditure Amount (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 | Ending (spring) calendar year of the school year (e.g. 2024 for 2023-24), parsed from the source's SCHOOL_YEAR / LONG_SCHOOL_YEAR column and cross-checked against the filename year.Full description▾Ending (spring) calendar year of the school year (e.g. 2024 for 2023-24), parsed from the source's SCHOOL_YEAR / LONG_SCHOOL_YEAR column and cross-checked against the filename year. |
district_code | string | — | — | yes | GOSA district code (FK to districts dimension): 3-digit zero-padded county/city codes or 7-digit compound codes for commission / state charter schools. Codes 850-888 are RESA service agencies (typed 'resa' in the dimension). NULL on state-level rows — the bronze sentinel 'ALL' is mapped to NULL.Full description▾GOSA district code (FK to districts dimension): 3-digit zero-padded county/city codes or 7-digit compound codes for commission / state charter schools. Codes 850-888 are RESA service agencies (typed 'resa' in the dimension). NULL on state-level rows — the bronze sentinel 'ALL' is mapped to NULL. |
school_code | string | — | — | yes | 4-digit zero-padded GOSA school code (composite FK to schools dimension with district_code). NULL on district- and state-level rows (bronze sentinel 'ALL' mapped to NULL). The 2012 file publishes a minority of codes as 3-digit; they are zero-padded to match the other years. 2023-2024 'DOE OTHER' rows (GNETS programs, alternative schools, Pre-K centers, central offices) carry real institution numbers and appear under the school detail level, matching where the pre-2023 files placed the same entities.Full description▾4-digit zero-padded GOSA school code (composite FK to schools dimension with district_code). NULL on district- and state-level rows (bronze sentinel 'ALL' mapped to NULL). The 2012 file publishes a minority of codes as 3-digit; they are zero-padded to match the other years. 2023-2024 'DOE OTHER' rows (GNETS programs, alternative schools, Pre-K centers, central offices) carry real institution numbers and appear under the school detail level, matching where the pre-2023 files placed the same entities. |
expenditure_function | string | — | — | no | Spending function of the expenditure: instruction, pupil_services, transportation, school_administration, and 7 more.Full description▾Spending function of the expenditure (11 values): instruction, pupil_services, instructional_support, school_administration, general_administration, maintenance_and_operations, transportation, media, school_food_services, debt_services, and renovation_and_capital_projects. Every district and state row set carries all 11 functions in every year (enforced by quality checks; school rows may publish partial function sets), so summing expenditure_amount over the 11 functions gives a district's total expenditure. The bronze spelling 'School food Services' (lowercase food) is an upstream-report typo normalized to school_food_services. 11 allowed values▾
|
expenditure_amount | number | — | yes | Total dollars spent on this function at the row's level; negatives are real budget adjustments.Full description▾Total dollar amount spent on this expenditure function at the row's detail level. Never NULL (enforced by a quality check — the source publishes no suppression). Negative values are legitimate budget adjustments / corrections and are preserved; no range check applies. This is the full-ledger figure; it is NOT comparable to the FESR-methodology totals in the per_pupil_expenditure topic, which count only included costs. | |
expenditure_per_pupil | number | — | yes | Per-FTE (full-time-equivalent student) dollar amount spent on this function. Can be negative (budget adjustments). NULL only in 2012-2014 where the bronze FTE denominator was missing or zero (475 rows; enforced by a quality check). Caution — not always a true per-pupil amount: in the 2024 file the source publishes expenditure_per_pupil equal to expenditure_amount verbatim on EVERY school-detail row (all 35,398 rows, traditional schools included), so 2024 school-level values carry no per-pupil information at all; in 2023 the same artifact covers all 9,526 DOE OTHER school rows plus 151 other nonzero school rows; in 2012 it covers the rows with a missing FTE_COUNT; and it frequently equals expenditure_amount on aggregate / non-school rows in other years. Standard-district and state rows in 2023-2024 do carry true per-FTE values (the 16 RESA rollup district rows, codes 850-888, do not). For a reliable school-level per-pupil spending series, use the per_pupil_expenditure topic (FESR methodology) instead; here, verify expenditure_per_pupil <> expenditure_amount (or sanity-check the magnitude) before treating a school-level value as per-pupil spending.Full description▾Per-FTE (full-time-equivalent student) dollar amount spent on this function. Can be negative (budget adjustments). NULL only in 2012-2014 where the bronze FTE denominator was missing or zero (475 rows; enforced by a quality check). Caution — not always a true per-pupil amount: in the 2024 file the source publishes expenditure_per_pupil equal to expenditure_amount verbatim on EVERY school-detail row (all 35,398 rows, traditional schools included), so 2024 school-level values carry no per-pupil information at all; in 2023 the same artifact covers all 9,526 DOE OTHER school rows plus 151 other nonzero school rows; in 2012 it covers the rows with a missing FTE_COUNT; and it frequently equals expenditure_amount on aggregate / non-school rows in other years. Standard-district and state rows in 2023-2024 do carry true per-FTE values (the 16 RESA rollup district rows, codes 850-888, do not). For a reliable school-level per-pupil spending series, use the per_pupil_expenditure topic (FESR methodology) instead; here, verify expenditure_per_pupil <> expenditure_amount (or sanity-check the magnitude) before treating a school-level value as per-pupil spending. |
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 | districtsschoolsstates | enum-enforced, default: schools |
district_code | foreign_key | any value | multi-value |
school_code | foreign_key | any value | multi-value |
expenditure_function | categorical | 11 allowed values▾
| multi-value, enum-enforced, pick one |
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/k12_expenditures"schools data for 2024
curl "https://georgiacivicdata.org/api/v1/education/k12_expenditures?year=2024"Filtered to expenditure_function = debt_services for 2024
curl "https://georgiacivicdata.org/api/v1/education/k12_expenditures?year=2024&expenditure_function=debt_services"One district (code 644), 2024
curl "https://georgiacivicdata.org/api/v1/education/k12_expenditures?district_code=644&year=2024&detail=districts"Download 2024 as CSV
curl "https://georgiacivicdata.org/api/v1/education/k12_expenditures?year=2024&format=csv"Notes & limitations
NULL handling
- Zero is a real, reported value.
Limitations
State rows have NULL district_code and school_code; district rows have NULL school_code. The school detail level includes non-traditional entities (central offices, GNETS programs, Pre-K centers, maintenance facilities) in every year, and district detail includes the 16 RESA service-agency rollups (district codes 850-888) — exclude both when analyzing traditional schools/districts only. expenditure_per_pupil is not a true per-pupil amount everywhere: the 2024 file publishes it equal to expenditure_amount on every school-detail row (traditional schools included — 2024 school-level per-FTE values are totals, not per-pupil amounts), the 2023 file does so on all DOE OTHER school rows plus 151 other nonzero school rows, the 2012 file on its missing-FTE rows, and it frequently equals expenditure_amount on aggregate / non-school rows in other years — for a reliable school-level per-pupil spending series use the per_pupil_expenditure topic (FESR methodology) instead. State rows are published independently of district rows and do not always equal the sum of district values within a function (e.g. the 2014 renovation_and_capital_projects district sum runs about 5x the published state total) — treat each detail level as its own published series. This topic is the full function-level ledger; its totals intentionally differ from the FESR included-cost figures in per_pupil_expenditure. No suppression exists in this topic — NULL never means suppressed; the only NULL metric values are 475 expenditure_per_pupil rows in 2012-2014 with a missing/zero FTE denominator. Negative dollar values are legitimate budget adjustments and are preserved.