Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Georgia Civic Data Geometry API
description: 'Read-only REST API serving cleaned, standardized tabular data for the state of Georgia: **education**, **census**, **health** and **immigration**, driven entirely by git-tracked ODCS data contracts — so every dataset''s columns, units, ranges, and allowed values are stable and documented.
**Base path:** all data routes live under `/api/v1`. Every dataset is addressed by its bare name (names are unique), e.g. `act_scores`.
**Discover, don''t hard-code.** `GET /api/v1/datasets` lists every dataset (compact; `?fields=full` for everything); `GET /api/v1/search?q=` finds one by meaning; `GET /api/v1/datasets/{name}` returns its schema (columns, units, the exact filter parameters with their allowed values, and a runnable `recommended_query` URL); `GET /api/v1/datasets/{name}/rows` returns the data.
**Note on filters:** every categorical column of a dataset is its own filter parameter, so the filters differ per dataset and are listed in the dataset''s schema (`filters`), not in this generic document. `GET /api/v1/datasets/{name}/openapi.json` is a per-dataset OpenAPI document with every filter and its allowed values, for function-calling clients that need one. Human docs: https://georgiacivicdata.org/api; agent reference: https://georgiacivicdata.org/llms-full.txt.
**R and Python packages:** `georgiacivicdata` on CRAN and PyPI wraps this API and returns data frames. Docs: https://georgiacivicdata.org/r/ and https://georgiacivicdata.org/py/ (overview: https://georgiacivicdata.org/packages).
**License:** data and documentation are licensed CC BY 4.0. Credit "Georgia Civic Data (georgiacivicdata.org)" and the original source. The license covers our cleaning, standardization, compilation, and documentation; source data stays under its original publisher''s terms (each dataset names its source). Every response carries a `Link: ; rel="license"` header, and `GET /api/v1/datasets` returns the terms as a `license` object. Details: https://georgiacivicdata.org/about#license.'
contact:
name: Georgia Civic Data
url: https://georgiacivicdata.org/api
email: shane@georgiacivicdata.org
license:
name: Creative Commons Attribution 4.0 International (CC BY 4.0)
url: https://creativecommons.org/licenses/by/4.0/
version: 0.2.0
servers:
- url: https://georgiacivicdata.org
description: Production (brand domain, same-origin proxy)
- url: https://georgia-civic-data-production.up.railway.app
description: Production (origin)
tags:
- name: geometry
description: 'The geometry datasets: school attendance zones and school district boundaries (GeoJSON, shapefile, GeoParquet).'
paths:
/api/v1/datasets/school_attendance_zones/rows:
get:
tags:
- geometry
summary: School attendance zones
description: 'Attendance-zone polygons: one per school, level and grade run. Filter by district_code / school_code / zone_level (comma-separated), grade and year. format=geojson (default), shapefile (a zip with one layer per level), geoparquet, or json (attributes only). resolution=display (simplified as a coverage, default) or full. Properties carry school and district labels and NCES ids.'
operationId: read_zones_api_v1_datasets_school_attendance_zones_rows_get
parameters:
- name: district_code
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: District Code
- name: school_code
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: School Code
- name: zone_level
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Zone Level
- name: grade
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Grade
- name: year
in: query
required: false
schema:
anyOf:
- type: integer
- type: 'null'
title: Year
- name: format
in: query
required: false
schema:
enum:
- geojson
- shapefile
- geoparquet
- json
type: string
default: geojson
title: Format
- name: resolution
in: query
required: false
schema:
enum:
- display
- full
type: string
default: display
title: Resolution
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/datasets/school_attendance_zones:
get:
tags:
- geometry
summary: School attendance zone fields, enums, CRS and shapefile names
operationId: zones_schema_api_v1_datasets_school_attendance_zones_get
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
/api/v1/datasets/school_attendance_zones/contract:
get:
tags:
- geometry
summary: The school attendance zones' ODCS contract
description: '`format=yaml` (default) returns it verbatim; `json` parsed.'
operationId: zones_contract_api_v1_datasets_school_attendance_zones_contract_get
parameters:
- name: format
in: query
required: false
schema:
enum:
- yaml
- json
type: string
default: yaml
title: Format
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/datasets/school_attendance_zones/coverage:
get:
tags:
- geometry
summary: Which districts have zones, by level
description: 'One row per Georgia standard school district: its status (complete, partial, one_school_per_grade, not_available), per-level status and share of land and population covered, methods, and why anything is missing. format=json (default) or geojson (with district outlines).'
operationId: zones_coverage_api_v1_datasets_school_attendance_zones_coverage_get
parameters:
- name: format
in: query
required: false
schema:
enum:
- json
- geojson
type: string
default: json
title: Format
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/datasets/school_attendance_zones/school_status:
get:
tags:
- geometry
summary: Whether each school has a zone, and if not, why
description: 'One row per school of Georgia''s 180 standard school districts: zone_status is zoned (a zone is published here; zone_levels lists its levels), no_zone (no attendance zone by design: no_zone_category and reason say why, e.g. a charter, magnet or alternative school) or not_yet_collected (it should have a zone and none is published yet; reason is its district''s coverage reason). Filter by district_code, school_code, zone_status and no_zone_category (comma-separated). format=json (default) or csv.'
operationId: zones_school_status_api_v1_datasets_school_attendance_zones_school_status_get
parameters:
- name: district_code
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: District Code
- name: school_code
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: School Code
- name: zone_status
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Zone Status
- name: no_zone_category
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: No Zone Category
- name: format
in: query
required: false
schema:
enum:
- json
- csv
type: string
default: json
title: Format
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/datasets/school_attendance_zones/attendance_rules:
get:
tags:
- geometry
summary: How zones work in Georgia, and the ways to attend another school
description: 'A plain-language summary of Georgia''s school attendance rules: who draws attendance zones, what a zone does, and the main ways a student attends a public school other than the zoned one (routes), in three groups: any_student, student_circumstances and schools_without_a_neighborhood_zone. Each route says who decides, whether it crosses a school-system line (crosses_district_line: no, yes, either, not_stated), who provides transportation (family, district, varies, not_stated), its conditions, and the statute or rule it rests on (sources). not_stated means the cited source does not say. lang=en (default) or es returns the same ids, codes and sources with the text in that language. A summary for orientation as of the as_of date, not legal advice and not an enrollment determination: school districts add their own transfer rules, deadlines and forms, so confirm with the school district.'
operationId: zones_attendance_rules_api_v1_datasets_school_attendance_zones_attendance_rules_get
parameters:
- name: lang
in: query
required: false
schema:
enum:
- en
- es
type: string
default: en
title: Lang
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/datasets/school_district_boundaries:
get:
tags:
- geometry
summary: 'School district boundaries: fields and formats'
operationId: districts_schema_api_v1_datasets_school_district_boundaries_get
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
/api/v1/datasets/school_district_boundaries/rows:
get:
tags:
- geometry
summary: School district boundaries (TIGER/Line)
description: 'Census TIGER/Line school district boundaries for Georgia, keyed to district_code: unified districts, the secondary-only pieces some districts serve (Fort Benning grades 9-12) and the Department of Defense districts. Same formats as the zones.'
operationId: read_district_boundaries_api_v1_datasets_school_district_boundaries_rows_get
parameters:
- name: district_code
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: District Code
- name: format
in: query
required: false
schema:
enum:
- geojson
- shapefile
- geoparquet
- json
type: string
default: geojson
title: Format
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
/api/v1/locate:
get:
tags:
- geometry
summary: Where is this point? Geography keys and school zones
description: 'lat and lon: the point''s county (`county_fips`), 2020 census tract and block group, school district, and the attendance zones containing it with a coverage status (zoned, gap, one_school_per_grade, not_available, not_zoned): the keys every dataset filters on. tract_geoid instead: every zone covering the tract, with population and area shares (`coverage_reason` explains a tract with none). Optional grade and year. Not an official enrollment determination. For privacy prefer POST: an address is accepted only there, and responses are never cached.'
operationId: lookup_get_api_v1_locate_get
parameters:
- name: lat
in: query
required: false
schema:
anyOf:
- type: number
- type: 'null'
title: Lat
- name: lon
in: query
required: false
schema:
anyOf:
- type: number
- type: 'null'
title: Lon
- name: tract_geoid
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Tract Geoid
- name: grade
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
title: Grade
- name: year
in: query
required: false
schema:
anyOf:
- type: integer
- type: 'null'
title: Year
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
post:
tags:
- geometry
summary: 'Locate an address or a batch of points (private: POST body)'
description: 'Body: {"address": "..."} (geocoded by the U.S. Census Geocoder; returns the matched address and the geocoder''s tract too), {"lat": .., "lon": ..}, or {"points": [{"id", "lat", "lon"}, ...]} (up to the batch cap). Optional grade and year. Each result carries county_fips, tract_geoid, block_group_geoid, the district and the zones. Responses are never cached, and addresses and points are never written to the application''s logs.'
operationId: lookup_post_api_v1_locate_post
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LookupBody'
responses:
'200':
description: Successful Response
content:
application/json:
schema: {}
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
components:
schemas:
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
LookupPoint:
properties:
id:
anyOf:
- type: string
- type: integer
- type: 'null'
title: Id
lat:
type: number
title: Lat
lon:
type: number
title: Lon
type: object
required:
- lat
- lon
title: LookupPoint
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
LookupBody:
properties:
points:
anyOf:
- items:
$ref: '#/components/schemas/LookupPoint'
type: array
- type: 'null'
title: Points
address:
anyOf:
- type: string
maxLength: 200
- type: 'null'
title: Address
lat:
anyOf:
- type: number
- type: 'null'
title: Lat
lon:
anyOf:
- type: number
- type: 'null'
title: Lon
grade:
anyOf:
- type: string
- type: 'null'
title: Grade
year:
anyOf:
- type: integer
- type: 'null'
title: Year
type: object
title: LookupBody
description: 'One of: ``points`` (a batch), ``address`` (geocoded), or ``lat``/``lon``.'