District Revenues and Expenditures
K-12 dollars taken in and spent by Georgia public schools and districts, broken out by revenue source and spending function, 2011-2024.
- 2011–2024
- annual
- 1.0.0
- e307e2e5704b
Overview
K-12 financial reporting for every Georgia public school, school district, and the state as a whole, published by the Governor's Office of Student Achievement (GOSA). Each row reports the total dollar amount and the per-FTE dollar amount for one cell of a two-bucket breakdown: K-12 Revenues across 6 revenue-source categories (federal, local, state QBE, state lottery, state other, other) and K-12 Expenditures across 11 expenditure-function categories (instruction, pupil services, instructional support, school administration, general administration, maintenance and operations, transportation, media, school food services, debt services, renovation and capital projects). Covers school years 2010-11 through 2023-24.
Row grain: One row per year, district_code, school_code, rev_exp_category, rev_exp_subcategory.
rev_exp_value — Rev Exp Value (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. |
rev_exp_category | string | — | — | no | Whether the row is money coming in or going out: k12_revenues or k12_expenditures. Filter with rev_exp_subcategory since each bucket has its own subcategory set.Full description▾Top-level bucket — whether the row reports a revenue or an expenditure: k12_revenues or k12_expenditures. 2 allowed values▾
|
rev_exp_subcategory | string | — | — | no | Revenue source (e.g. federal, local, state_qbe) or spending function (e.g. instruction, transportation); the valid set depends on rev_exp_category.Full description▾Functional subcategory within the bucket (17 values). The valid subset depends on rev_exp_category: revenue rows carry only the 6 revenue-source subcategories (federal, local, state_qbe, state_lottery, state_other, other); expenditure rows carry only the 11 expenditure-function subcategories. The two sets are disjoint (enforced by a quality check), so filter on both columns together. The bronze spelling 'School food Services' (lowercase food) is an upstream-report typo normalized to school_food_services. 17 allowed values▾
|
rev_exp_value | number | — | yes | Total dollars for this revenue source or spending function at the row's level; negatives are real budget adjustments.Full description▾Total dollar amount for this (rev_exp_category, rev_exp_subcategory) cell 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. | |
rev_exp_per_pupil | number | — | yes | Per-FTE (full-time-equivalent student) dollar amount for the cell. Can be negative (budget adjustments). NULL only in 2012-2014 where the bronze FTE denominator was missing or zero (667 rows; enforced by a quality check). Caution — not always a true per-pupil amount: in the 2024 file the source publishes rev_exp_per_pupil equal to rev_exp_value verbatim on EVERY school-detail row (15,678 of 15,678 nonzero rows, traditional schools included), so 2024 school-level values carry no per-pupil information at all; in 2023 the same artifact covers all 9,798 DOE OTHER specialty-program rows plus 151 other school rows; in 2012 it covers the 10,414 rows with a missing FTE_COUNT; and it frequently equals rev_exp_value on aggregate / non-school rows in other years. District- and state-detail rows in 2023-2024 do carry true per-FTE values. Verify rev_exp_per_pupil <> rev_exp_value (or sanity-check per-pupil magnitude) before treating a school-level value as per-pupil spending.Full description▾Per-FTE (full-time-equivalent student) dollar amount for the cell. Can be negative (budget adjustments). NULL only in 2012-2014 where the bronze FTE denominator was missing or zero (667 rows; enforced by a quality check). Caution — not always a true per-pupil amount: in the 2024 file the source publishes rev_exp_per_pupil equal to rev_exp_value verbatim on EVERY school-detail row (15,678 of 15,678 nonzero rows, traditional schools included), so 2024 school-level values carry no per-pupil information at all; in 2023 the same artifact covers all 9,798 DOE OTHER specialty-program rows plus 151 other school rows; in 2012 it covers the 10,414 rows with a missing FTE_COUNT; and it frequently equals rev_exp_value on aggregate / non-school rows in other years. District- and state-detail rows in 2023-2024 do carry true per-FTE values. Verify rev_exp_per_pupil <> rev_exp_value (or sanity-check per-pupil 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 |
rev_exp_category | categorical | k12_expendituresk12_revenues | multi-value, enum-enforced, pick one |
rev_exp_subcategory | categorical | 17 allowed values▾
| multi-value, enum-enforced, pick one |
district_type | dimension_attribute | 7 allowed values▾
| 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/revenues_and_expenditures"schools data for 2024
curl "https://georgiacivicdata.org/api/v1/education/revenues_and_expenditures?year=2024"Filtered to rev_exp_category = k12_expenditures for 2024
curl "https://georgiacivicdata.org/api/v1/education/revenues_and_expenditures?year=2024&rev_exp_category=k12_expenditures"One district (code 644), 2024
curl "https://georgiacivicdata.org/api/v1/education/revenues_and_expenditures?district_code=644&year=2024&detail=districts"Download 2024 as CSV
curl "https://georgiacivicdata.org/api/v1/education/revenues_and_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. rev_exp_per_pupil is not a true per-pupil amount everywhere: the 2024 file publishes it equal to rev_exp_value 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 rows, the 2012 file on its 10,414 missing-FTE rows, and it frequently equals rev_exp_value on aggregate / non-school rows in other years. State rows are published independently of district rows and do not always equal the sum of district values within a subcategory (e.g. the 2014 renovation_and_capital_projects state total runs several times the district sum) — treat each detail level as its own published series. The valid rev_exp_subcategory values are disjoint between the two rev_exp_category buckets (6 revenue-source vs 11 expenditure-function subcategories). No suppression exists in this topic — NULL never means suppressed; the only NULL metric values are 667 rev_exp_per_pupil rows in 2012-2014 with a missing/zero FTE denominator. Negative dollar values are legitimate budget adjustments and are preserved.