GreatSchools Scraper — School Ratings, Reviews & Demographics
Pricing
from $9.60 / 1,000 school scrapeds
GreatSchools Scraper — School Ratings, Reviews & Demographics
Scrape GreatSchools ratings for every school in a US city: test scores, enrollment, address, phone, principal, demographics and reviews. USD 0.012 per school.
Pricing
from $9.60 / 1,000 school scrapeds
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
GreatSchools Scraper exports US K-12 school profiles from GreatSchools.org: the 1–10 GreatSchools rating, test-score and student-progress ratings, enrollment, address, phone, principal, demographics, attendance and parent reviews, for every public, charter and private school in a city. It is built for real-estate analysts, relocation services, EdTech sales teams and education researchers, and it costs USD 12 per 1,000 schools (USD 0.012 per school on the Free tier) plus a start fee of about USD 0.006.
What data does the GreatSchools scraper return?
Each dataset row is one school profile.
| Field | What it contains | Example |
|---|---|---|
name, url | School name and GreatSchools profile URL | Hillcrest Elementary School |
schoolId, gsid | GreatSchools school ID and state-prefixed ID | 2013, FL-2013 |
schoolType | public, charter or private | public |
grades, gradeLevels | Grades served | K-5 |
greatSchoolsRating | Overall GreatSchools rating, 1–10 | 10 |
testScoreRating, studentProgressRating | Sub-ratings, 1–10 | 10, 10 |
reviewRating, reviewCount | Average community rating (1–5) and number of reviews | 4.16, 19 |
enrollment | Number of students | 490 |
address, zipCode, city, county, state | Location | 1010 East Concord Street, 32803 |
phone, website | Contact details as listed on GreatSchools (the website can be a social page) | (407) 245-1770 |
schoolLeader, schoolLeaderEmail | Principal name and the email shown on the profile, when present | Ms Bethany Chappetta |
districtName, districtId, districtUrl | School district | Orange County Public Schools |
lowIncomePercent | Share of low-income students | 23 |
ethnicity, genderBreakdown | Student demographics, with state averages for gender | arrays |
regularAttendancePercent | Students regularly attending | 92 |
titleI, equityIndicator, collegeSuccessAwards, claimStatus | Program flags and awards | false, true |
description | GreatSchools summary sentence | text |
nearbySchools | Up to 10 nearest rated schools with rating, distance, type and grades | array |
reviews | Up to 10 recent community reviews: date, authorRole, rating, text | array |
scrapedAt, sourceUrl | Collection time and source page | ISO 8601, URL |
Fields GreatSchools does not show for a school (for example studentTeacherRatio on many profiles) are null.
How do I get every school in a city from GreatSchools?
Enter the city as City, ST (for example Chicago, IL) and set maxResults. The Actor pages through GreatSchools' complete list for that city, 25 schools per page, and opens each school's profile. Orlando, FL lists 736 schools and Chicago, IL about 1,950, so a city run is no longer limited to the 25 or so schools featured on the city's landing page. Add schoolLevels (preschool, elementary, middle, high) or schoolTypes (public, charter, private) to keep only matching schools; filtered-out schools are not charged.
Is there a GreatSchools API?
GreatSchools offers paid API products of its own; this Actor is a pay-per-result alternative that reads the public school pages and returns the same core fields as JSON, CSV or Excel. You can call it from your own code through the Apify API (examples below) or from an AI assistant, without a GreatSchools API key.
When should I use this Actor, and when not?
Use it for school-quality overlays in property analysis, school comparisons for relocating families, principal and district contact lists for EdTech outreach, and equity or test-score research by city.
Do not use it for:
- An official federal school directory with NCES IDs. Use NCES School Lookup.
- Homes for sale near a school. Use Realtor Leads Scraper for agent contacts.
- Student housing. Use Student Housing Scraper.
Input
| Field | Default | Notes |
|---|---|---|
location | Orlando, FL (prefill) | City, ST or City, State |
startUrls | – | School profile URLs, city URLs or best-schools list URLs; overrides location |
schoolLevels | – | preschool, elementary, middle, high |
schoolTypes | – | public, charter, private |
maxResults | 10 | 1–10,000 schools |
maxConcurrency | 5 | Parallel requests, 1–20 |
{"location": "Austin, TX","schoolLevels": ["high"],"schoolTypes": ["public", "charter"],"maxResults": 50}
JavaScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/greatschools-scraper').call({ location: 'Chicago, IL', maxResults: 100 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((s) => `${s.name}: ${s.greatSchoolsRating}/10`));
Python (apify-client 3.x)
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("muhammadafzal/greatschools-scraper").call(run_input={"location": "Orlando, FL", "schoolLevels": ["elementary"], "maxResults": 50})for school in client.dataset(run.default_dataset_id).iterate_items():print(school["name"], school["greatSchoolsRating"], school["enrollment"])
Use it from an AI assistant
GreatSchools Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add https://mcp.apify.com/?tools=muhammadafzal/greatschools-scraper and ask, for example: "List the public high schools in Austin, TX rated 8 or higher on GreatSchools, with enrollment and phone numbers."
Output example
[{"schoolId": "2013","name": "Hillcrest Elementary School","url": "https://www.greatschools.org/florida/orlando/2013-Hillcrest-Elementary-School/","schoolType": "public","grades": "K-5","greatSchoolsRating": 10,"testScoreRating": 10,"studentProgressRating": 10,"reviewRating": 4.16,"reviewCount": 19,"enrollment": 490,"address": "1010 East Concord Street","zipCode": "32803","phone": "(407) 245-1770","schoolLeader": "Ms Bethany Chappetta","districtName": "Orange County Public Schools","lowIncomePercent": 23,"regularAttendancePercent": 92,"nearbySchools": [{ "name": "Howard Middle School", "rating": 8, "distanceMiles": 0.39, "type": "Public district", "grades": "6-8" }],"reviews": [{ "date": "2023-11-09", "authorRole": "Other (school staff, family member, recent alum, etc)", "rating": 1, "text": "Every time a student had an issue…" }]},{"schoolId": "14731","name": "Eagle Creek Elementary","schoolType": "public","grades": "PK, K-5","greatSchoolsRating": 9,"enrollment": 834,"phone": "(407) 930-5592"}]
How much does the GreatSchools scraper cost?
You pay per school saved to the dataset, plus a start fee per started GB of allocated memory. Platform usage is included.
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| School scraped | USD 0.012 | USD 0.0117 | USD 0.0114 | USD 0.0096 |
| Actor start (per started GB of memory) | USD 0.006251 | USD 0.006094 | USD 0.005938 | USD 0.005 |
The default memory is 1 GB, so one start event is charged. Worked totals on the Free tier: 100 schools cost about USD 0.006 + 100 × 0.012 = USD 1.21; 1,000 schools cost about USD 12.01. A school is charged only after it is saved, never twice in a run, and if you set a maximum charge the run stops cleanly before going over it.
Reliability and limits
- Throughput is about 20 schools per minute (60 Chicago schools took about 3 minutes), so the default 1-hour timeout fits roughly 1,000 schools. For a larger city, raise the run timeout; the Actor stops cleanly and keeps what it saved when time runs out.
- Reviews are the 10 most recent shown on the profile; nearby schools are the first 10 in GreatSchools' "nearest rated schools" list.
- Every run writes an
OUTPUTrecord withstatus(DATA,EMPTY,BLOCKEDorREJECTED), schools delivered, school events charged, the city's listed school count, stop reason and warnings. A run that cannot read GreatSchools ends as failed with no school charges.
FAQ
Can I scrape GreatSchools ratings for a whole city?
Yes. Set location and a maxResults as large as the city's school count; the Actor pages through the full city list.
Can I scrape specific schools?
Yes. Put GreatSchools profile URLs in startUrls.
Why do some schools have no rating?
GreatSchools does not rate every school, especially private schools; the rating fields are null then.
Are filtered-out schools charged? No. Only schools saved to the dataset are charged.
Do I need a proxy? No. Access is handled by the Actor, and proxy settings in the input are ignored.
How fresh is the data? Each run reads the live GreatSchools pages, so values match the site at run time.
Related Actors
- NCES School Lookup: official US school directory.
- Realtor Leads Scraper: real-estate agent contacts.
- Student Housing Scraper: student accommodation prices and reviews.
Legal and compliance
The Actor reads public GreatSchools pages without logging in. GreatSchools ratings and reviews are GreatSchools' content; check their terms before republishing, and treat reviewer text and principal contact details as personal data under the privacy laws that apply to you.
Last verified: 2026-10-27