cps.edu APIcps.edu ↗
Access Chicago Public Schools data via API: search schools by name or filters, get full listings, and retrieve GeoJSON attendance boundary polygons for mapping.
curl -X GET 'https://api.parse.bot/scraper/0e034e5c-27fe-4f1b-9b45-a02e19c019ff/search_schools?term=Lincoln' \ -H 'X-API-Key: $PARSE_API_KEY'
Search for schools by name or term using autocomplete-style matching. Returns basic school information including name, address, network, governance, category, grades offered, rating, and neighborhood.
| Param | Type | Description |
|---|---|---|
| term | string | Search term (school name or keyword) |
{
"type": "object",
"fields": {
"count": "integer, number of schools returned",
"schools": "array of school objects with school_id, short_name, long_name, address fields, network, governance, category, grades, rating, and neighborhood"
},
"sample": {
"data": {
"count": 2,
"schools": [
{
"rating": "Inability to Rate",
"network": "Network 4",
"category": "ES",
"long_name": "Abraham Lincoln Elementary School",
"school_id": "610038",
"governance": "District",
"short_name": "LINCOLN",
"address_zip": "60614",
"address_city": "Chicago",
"is_preschool": false,
"neighborhood": "LINCOLN PARK",
"rating_status": "Good Standing",
"address_street": "615 W KEMPER Pl",
"grades_offered": "K,1,2,3,4,5,6,7,8",
"is_high_school": false,
"grades_readable": "K-8",
"is_middle_school": true,
"is_elementary_school": true,
"is_gocps_participant": true
}
]
},
"status": "success"
}
}About the cps.edu API
The CPS.edu API exposes 4 endpoints covering Chicago Public Schools data — from autocomplete-style name search via search_schools to full GeoJSON attendance boundary polygons via get_school_boundaries. Each endpoint returns structured fields including school ID, network, governance type, grades offered, student count, rating, and community area, giving developers a direct path to CPS school data for directory, mapping, and research applications.
School Search and Discovery
The search_schools endpoint accepts a term parameter and returns matching schools with fields like school_id, short_name, long_name, address, network, governance, category, grades, rating, and neighborhood. It behaves like an autocomplete lookup — useful for building search UIs where users type a school name and see instant results. The get_all_schools endpoint requires no parameters and returns up to 100 schools with a fuller field set including phone, student_count, community, and GoCPS participation status.
Advanced Filtering with Facets
The advanced_search endpoint accepts POST requests with filter parameters including network, governance, grade_level, neighborhood, search_term, page_number, and page_size. The response includes total_results, page, page_size, and an available_filters array of facet objects — each with name, field, and options — so your UI can dynamically render filter controls from the data itself. Neighborhoods are passed as community area names such as WEST TOWN or LINCOLN PARK; governance values include District, Charter, and Contract.
GIS Boundary Data
The get_school_boundaries endpoint returns a GeoJSON FeatureCollection where each Feature contains a Polygon geometry with catchment area coordinates and a properties object holding school name, ID, boundary grades, and styling metadata. An optional year parameter (e.g., 2025) lets you request boundaries for a specific school year. This makes the endpoint directly usable with mapping libraries that consume standard GeoJSON.
- Build a school finder map overlaying CPS attendance boundary polygons on a city basemap
- Power a neighborhood school directory filtered by community area using the
neighborhoodparameter inadvanced_search - Display a school profile page using
student_count,phone,rating, andgrades_offeredfromget_all_schools - Populate a faceted search UI using the
available_filtersarray returned byadvanced_search - Analyze charter vs. district school distribution across Chicago networks using
governanceandnetworkfields - Support school enrollment research by cross-referencing GeoJSON catchment boundaries with census tract data
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 250 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CPS have an official developer API?+
What does `get_school_boundaries` return and how is the `year` parameter used?+
year value like 2025 scopes the boundary data to that school year; omitting it returns the default (current) boundaries.Does `advanced_search` return individual school program details such as magnet or selective enrollment program names?+
advanced_search response includes a programs field on school objects alongside governance, network, and grade_level filters, but individual program-level detail pages and admissions criteria are not currently exposed as dedicated endpoints. The API covers search, listing, and boundary data. You can fork it on Parse and revise it to add an endpoint targeting individual program or admissions detail pages.Is there a way to retrieve individual school profile data beyond what `get_all_schools` returns?+
get_all_schools (which returns up to 100 schools) and advanced_search. Fields like phone, student_count, rating, community, and accessibility info are available from those two endpoints. You can fork the API on Parse and revise it to add a dedicated school profile endpoint keyed by school ID.Does `get_all_schools` return every CPS school or only a subset?+
count field showing the total number of schools in the system. If the system count exceeds 100, use advanced_search with page_number and page_size parameters to paginate through the full set.