Skip to content
← All datasets

Certified Personnel (Teachers and Staff Credentials)

Staffing measures for Georgia school teachers, administrators, and support staff -- credentials, experience, salary, and demographics by school, district, and state, 2011-2024.

Year coverage
20112024
Updated
annual
Version
1.0.0
Schema hash
633b96090a27

Detail levels available

StateDistrictSchool · default

Overview

Georgia Office of Student Achievement (GOSA) Certified Personnel dataset, compiled from local school systems' Certified/Classified Personnel Information (CPI) submissions. For every Georgia public school, school district, and the state as a whole, publishes a complete grid of 27 staffing measurements per employee group (81 rows per entity-year): headcount by certificate level (Bachelor's through Doctoral, plus Other), certification status (Professional / Provisional), gender, employment status (Full/Part-time), position metrics (FTE position count, average annual/daily salary, average contract days), staff race/ethnicity, and years-of-experience bands (<1, 1-10, 11-20, 21-30, >30, plus the mean). The three employee groups are Administrators, PK-12 Teachers, and Support Personnel; coverage runs from the 2010-11 school year through 2023-24.

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

Key metric

measure_valueMeasure Value

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 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 CodestringyesGOSA 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 Codestringyes4-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 TypestringnoWhich staff group the measurement covers: administrators, PK-12 teachers, or support personnel.
Full description
Employee group this measurement covers. Snake_case recode of bronze EMPLOYEE_TYPE: `administrators`, `pk_12_teachers`, `support_personnel`.
3 allowed values
  • administrators
  • pk_12_teachers
  • support_personnel
measure_categoryMeasure CategorystringnoThe category of staffing measure (e.g. certificate level, gender, positions, race/ethnicity, years of experience); pairs with measure_subcategory.
Full description
High-level family of the measurement. Snake_case recode of bronze DATA_CATEGORY. Together with `measure_subcategory` it fully identifies what `measure_value` represents; the family is functionally determined by the label (27 valid pairs, enforced by a quality check).
7 allowed values
  • certificate_level
  • certified_personnel
  • gender
  • personnel
  • positions
  • race_ethnicity
  • years_experience
measure_subcategoryMeasure SubcategorystringnoThe specific staffing measure within its family (e.g. 5_yr_masters, average_annual_salary, full_time); defines what measure_value means and its unit.
Full description
Specific measurement within the family. Snake_case recode of bronze DATA_SUB_CATEGORY — e.g. `5_yr_masters` (family `certificate_level`), `average_annual_salary` (family `positions`), `less_than_1` / `average` (family `years_experience`). `other` is the fifth CERTIFICATE LEVEL bucket (bronze `Other *`; the asterisk flags a source footnote), not a race value. `asian_pacific_islander` is the bronze staff-race label `Asian`: the source publishes only 6 race buckets with no separate Pacific Islander label in any year, and state-level race-bucket sums equal the gender-bucket sums (same population) — the pre-1997 OMB combined Asian + Pacific Islander bucket per data-cleaning-standards §5b.
27 allowed values
  • 11_to_20
  • 1_to_10
  • 21_to_30
  • 4_yr_bachelors
  • 5_yr_masters
  • 6_yr_specialists
  • 7_yr_doctoral
  • asian_pacific_islander
  • average
  • average_annual_salary
  • average_contract_days
  • average_daily_salary
  • black
  • female
  • full_time
  • greater_than_30
  • hispanic
  • less_than_1
  • male
  • multiracial
  • native_american
  • number
  • other
  • part_time
  • professional
  • provisional
  • white
measure_valueMeasure ValuenumberyesThe measurement's value; its unit (headcount, FTE, dollars, days, or years) depends on measure_category and measure_subcategory, so filter to one pair before aggregating.
Full description
Numeric value of the measurement. UNITS DEPEND ON (measure_category, measure_subcategory): a whole-person headcount for the 22 count labels (all of certificate_level, certified_personnel, gender, personnel, race_ethnicity, and the five years_experience bands); an FTE-style fractional position count for positions/number; US dollars for positions/average_annual_salary and positions/average_daily_salary; days for positions/average_contract_days; years (0.01 precision) for years_experience/average. NEVER sum or average across rows without first filtering to a single (measure_category, measure_subcategory) pair — and never sum `average*` labels across entities at all. No `unit` marker is declared because the unit varies by row; range invariants are enforced by quality checks instead (non-negative everywhere; headcount labels integral; experience average within [0, 60]; contract days within [0, 366]). Known source quirk preserved per §4b (extreme-but-conceivable): in the 2016-17 file ONLY, the certified_personnel family (professional/provisional) is uniformly depressed at every level (state professional PK-12 teachers = 2,689 vs ~110,000 in adjacent years) yet internally consistent (district sum 2,690; school sum 2,748) — a GOSA scope/definition glitch for that family-year, served as published.

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
measure_categorycategorical
7 allowed values
  • certificate_level
  • certified_personnel
  • gender
  • personnel
  • positions
  • race_ethnicity
  • years_experience
multi-value, enum-enforced, pick one
measure_subcategorycategorical
27 allowed values
  • 11_to_20
  • 1_to_10
  • 21_to_30
  • 4_yr_bachelors
  • 5_yr_masters
  • 6_yr_specialists
  • 7_yr_doctoral
  • asian_pacific_islander
  • average
  • average_annual_salary
  • average_contract_days
  • average_daily_salary
  • black
  • female
  • full_time
  • greater_than_30
  • hispanic
  • less_than_1
  • male
  • multiracial
  • native_american
  • number
  • other
  • part_time
  • professional
  • provisional
  • white
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/certified_personnel"

schools data for 2024

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel?year=2024"

Filtered to employee_type = administrators for 2024

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

One district (code 644), 2024

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

Download 2024 as CSV

curl "https://georgiacivicdata.org/api/v1/education/certified_personnel?year=2024&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 2023-24); zero counts are published as real `0` values, and every bronze MEASURE value parses to a valid number. measure_value has heterogeneous units that depend on (measure_category, measure_subcategory): a whole-person headcount for certificate_level / certified_personnel / gender / personnel / race_ethnicity / years_experience (except `average`); an FTE-style fractional count for positions/number; US dollars for positions/average_annual_salary and positions/average_daily_salary; days for positions/average_contract_days; and a mean in years for years_experience/average. Never aggregate measure_value without first filtering to a single (measure_category, measure_subcategory) pair, and never sum `average*` labels across entities. measure_category is functionally determined by measure_subcategory (27 valid pairs). There is no `demographic` column: gender and race/ethnicity here describe STAFF and are measure families, not a cross-cutting demographic axis, so these rows do not join the demographics dimension; the race_ethnicity family uses the pre-1997 OMB combined `asian_pacific_islander` bucket (no separate Pacific Islander label exists in the source). Known source quirk: the 2016-17 certified_personnel family (professional/provisional counts) is uniformly depressed at every level (~2% of adjacent years' magnitude) yet internally consistent across levels — preserved as published; do not trend that family across 2017. School rows must not be summed to rebuild district or state headcounts: staff serving multiple schools are counted once per school assignment but deduplicated at higher levels, so a district count can even be smaller than a single school's count (observed only in personnel/part_time; 1,811 cells). State rows have NULL district_code and school_code; district rows have NULL school_code.