Skip to content
← All datasets

Certified Personnel Compensation (Salaries and Positions)

Average salaries, contract days, and FTE position counts for Georgia school staff by school, district, and state, 2011-2025.

Year coverage
2011–2025
Updated
annual
Version
1.1.0
Schema hash
360139ef250a

Detail levels available

StateDistrictSchool · default

Overview

Governor's Office of Education and Workforce Strategy (GOEWS, formerly GOSA) certified-personnel compensation dataset, compiled from local school systems' Certified/Classified Personnel Information (CPI) submissions. For every Georgia public school, for each school district (all but `799` State Schools in 2024-25; see limitations), and for the state as a whole, publishes four position measures per employee group (Administrators, PK-12 Teachers, Support Personnel): the full-time-equivalent (FTE) count of certified positions and the average annual salary, average daily salary, and average contract days of those positions. A school or district has a row only for the employee groups it reports positions in. Coverage runs from the 2010-11 school year through 2024-25. This is one of three topics split from the retired certified_personnel dataset, all reading the same GOSA source: staff headcounts by certificate level, certification status, gender, employment status, and race/ethnicity live in certified_personnel_composition, and years-of-experience band headcounts live in certified_personnel_experience.

Row grain: One row per year, district_code, school_code, employee_type.

Key metric

avg_annual_salary — Average Annual Salary (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
yearYearinteger——noEnding calendar year of the school year. Year 2024 = 2023-2024 school year. Derived from the bronze `LONG_SCHOOL_YEAR` column's ending year.
Full description
Ending calendar year of the school year. Year 2024 = 2023-2024 school year. Derived from the bronze `LONG_SCHOOL_YEAR` column's ending year.
district_codeDistrict Codestring——yesGOSA district code (FK to the education districts dimension): 3-digit zero-padded for standard districts, 7-digit for state/commission charter schools (present from 2012 onward). NULL for state-level aggregate rows (the bronze sentinel `ALL`).
Full description
GOSA district code (FK to the education districts dimension): 3-digit zero-padded for standard districts, 7-digit for state/commission charter schools (present from 2012 onward). NULL for state-level aggregate rows (the bronze sentinel `ALL`).

Joins districts; adds its label columns.

school_codeSchool Codestring——yes4-digit zero-padded GOSA school code (FK to the education schools dimension, composite key with district_code). NULL for district-level and state-level aggregate rows (the bronze sentinel `ALL`).
Full description
4-digit zero-padded GOSA school code (FK to the education schools dimension, composite key with district_code). NULL for district-level and state-level aggregate rows (the bronze sentinel `ALL`).

Joins schools; adds its label columns.

employee_typeEmployee Typestring——noWhich staff group the row covers: administrators, PK-12 teachers, or support personnel.
Full description
Certified employee group this row's position and compensation figures cover. Snake_case recode of bronze EMPLOYEE_TYPE: `administrators`, `pk_12_teachers`, `support_personnel`.
3 allowed values
  • administrators
  • pk_12_teachers
  • support_personnel
fte_positionsFTE Positionsnumbercount—noFull-time-equivalent count of certified positions in this staff group — fractional because part-time positions count as fractions.
Full description
Full-time-equivalent (FTE) count of certified positions for this employee group (bronze Positions/Number). An FTE-style count, so legitimately fractional — part-time positions contribute fractions of a position. This is the N behind the three salary/contract-day averages (their denominator). Do not sum school rows to rebuild district or state totals — use the published aggregate rows.
avg_annual_salaryAverage Annual Salarynumbercurrency—yesAverage annual salary (US dollars) of this staff group's certified positions.
Full description
Average annual salary in US dollars across this entity's certified positions in the employee group (bronze Positions/Average Annual Salary). An entity-level mean: never sum across entities, and a state average is not the sum (or mean) of district averages. Equals avg_daily_salary x avg_contract_days up to the rounding of the three published figures (enforced by a quality check). 5 cells publish 0.0; the source does not say whether this means unpaid or unreported. NULL on 114 cells (2012-2025) at 7 state/commission charter districts (7820110 Odyssey Charter School every year 2016-2025; 7820120 Georgia Cyber Academy 2015, 2016 and 2018; 7820119 2014; 7820212 2012; 7820616 2017; 7830613 2017-2018; 7830619 2018-2019), where the source published about 1/100 of the same school's pay in other years at similar FTE and contract days (e.g. 7820120 PK-12 teachers $38,681.49 in 2016-17, $395.69 in 2017-18, $40,680.74 in 2018-19 on 360-393 FTE): a units error, not pay. Also NULL on 4 other cells under $5,000 that are not plausible average salaries (see limitations). Observed max: 250,831.94.
avg_daily_salaryAverage Daily Salarynumbercurrency—yesAverage daily salary (US dollars) of this staff group's certified positions.
Full description
Average daily salary in US dollars across this entity's certified positions in the employee group (bronze Positions/Average Daily Salary). An entity-level mean: never sum across entities. Multiplied by avg_contract_days it reproduces avg_annual_salary up to the rounding of the published figures (observed max: 2,764.56). NULL wherever avg_annual_salary is masked (118 cells; see avg_annual_salary).
avg_contract_daysAverage Contract Daysnumber——noAverage number of contract days per year for this staff group's certified positions.
Full description
Average number of contract days per year across this entity's certified positions in the employee group (bronze Positions/Average Contract Days). An entity-level mean: never sum across entities. Declares no `unit` (days are neither a rescaled percentage nor a currency); the [0, 366] range is enforced by an authored quality check instead (observed bronze range: [30, 260]).

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
employee_typecategoricaladministratorspk_12_teacherssupport_personnelmulti-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
school_leveldimension_attributeelementarymiddlehighk12othermulti-value, enum-enforced
localedimension_attributecitysuburbtownruralmulti-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/certified_personnel_compensation"

schools data for 2025

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_compensation?year=2025"

Filtered to employee_type = administrators for 2025

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_compensation?year=2025&employee_type=administrators"

One district (code 644), 2025

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_compensation?district_code=644&year=2025&detail=districts"

Download 2025 as CSV

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel_compensation?year=2025&format=csv"

Notes & limitations

NULL handling

  • Zero is a real, reported value.

Limitations

This source has no suppression markers in any year (2010-11 through 2024-25): every value is published and no zero is a suppressed cell. fte_positions and avg_contract_days are non-null on every row; avg_annual_salary and avg_daily_salary are NULL only on the 118 masked cells below. avg_annual_salary, avg_daily_salary, and avg_contract_days are entity-level means — never sum them across entities, and a state average is not the sum (or mean) of district averages; use the published district/state rows for aggregate analysis. avg_annual_salary is 0.0 at 5 small cells; the source does not say whether this means unpaid or unreported. At 7 state/commission charter districts (7820110 Odyssey Charter School every year 2016-2025, 7820120, 7820119, 7820212, 7820616, 7830613, 7830619) the source published average salaries about 1/100 of the same school's pay in other years, a units error: those 114 cells (2012-2025, school rows and their district rows) are NULL in avg_annual_salary and avg_daily_salary, with fte_positions and avg_contract_days kept. Four other cells under $5,000 are NULL too: none is about 1/100 of a neighbouring year, but none is a plausible average salary (daily rates $0.47-$21.05) and the source gives no reason: 7820512 support personnel in 2012 ($2,194.20 on 1 FTE; school and district rows), district 605 school 6104 support personnel in 2013 ($89.00 on 3 FTE) and district 660 school 0307 PK-12 teachers in 2023 ($4,000.00 on 1 FTE). A school or district has a row only for the employee groups it reports positions in (about one school-year in seven lacks at least one group). fte_positions is an FTE-style fractional position count (part-time positions count as fractions), and it is the N behind the three averages; do not sum school rows to rebuild district or state position totals. District rows are served where the source publishes them. For a single-school state charter (7-digit district code) whose district row the source omits, the district row is a copy of its one school row (6 charters in 2017-18, 2 in 2018-19, 29 in 2024-25); where the source does publish such a charter's district row, it equals the school row. `799` State Schools has school rows but no district row in 2024-25; its schools and the state rows are still served, and no other district row is built from school rows. State rows have NULL district_code and school_code; district rows have NULL school_code.