Skip to content
← All datasets

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.

Year coverage
20112024
Updated
annual
Version
1.0.0
Schema hash
e307e2e5704b

Detail levels available

StateDistrictSchool · default

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.

Key metric

rev_exp_valueRev 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.

ColumnTypeUnitRangeNull?Description
yearYearintegernoEnding (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_codeDistrict CodestringyesGOSA 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.

Joins districts; adds its label columns.

school_codeSchool Codestringyes4-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.

Joins schools; adds its label columns.

rev_exp_categoryRevenue / Expenditure CategorystringnoWhether 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
  • k12_expenditures
  • k12_revenues
rev_exp_subcategoryRev Exp SubcategorystringnoRevenue 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
  • debt_services
  • federal
  • general_administration
  • instruction
  • instructional_support
  • local
  • maintenance_and_operations
  • media
  • other
  • pupil_services
  • renovation_and_capital_projects
  • school_administration
  • school_food_services
  • state_lottery
  • state_other
  • state_qbe
  • transportation
rev_exp_valueRev Exp ValuenumbercurrencyyesTotal 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_pupilRev Exp per PupilnumbercurrencyyesPer-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.

ParameterKindAllowed valuesNotes
yearyear_exactany value
year_minyear_rangeany value
year_maxyear_rangeany value
detaildetaildistrictsschoolsstatesenum-enforced, default: schools
district_codeforeign_keyany valuemulti-value
school_codeforeign_keyany valuemulti-value
rev_exp_categorycategoricalk12_expendituresk12_revenuesmulti-value, enum-enforced, pick one
rev_exp_subcategorycategorical
17 allowed values
  • debt_services
  • federal
  • general_administration
  • instruction
  • instructional_support
  • local
  • maintenance_and_operations
  • media
  • other
  • pupil_services
  • renovation_and_capital_projects
  • school_administration
  • school_food_services
  • state_lottery
  • state_other
  • state_qbe
  • transportation
multi-value, enum-enforced, pick one
district_typedimension_attribute
7 allowed values
  • commission_charter
  • resa
  • standard
  • state_agency
  • state_charter
  • state_school
  • state_special
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.