GreatSchools Scraper — School Ratings, Reviews & Demographics avatar

GreatSchools Scraper — School Ratings, Reviews & Demographics

Pricing

from $9.60 / 1,000 school scrapeds

Go to Apify Store
GreatSchools Scraper — School Ratings, Reviews & Demographics

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

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

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.

FieldWhat it containsExample
name, urlSchool name and GreatSchools profile URLHillcrest Elementary School
schoolId, gsidGreatSchools school ID and state-prefixed ID2013, FL-2013
schoolTypepublic, charter or privatepublic
grades, gradeLevelsGrades servedK-5
greatSchoolsRatingOverall GreatSchools rating, 1–1010
testScoreRating, studentProgressRatingSub-ratings, 1–1010, 10
reviewRating, reviewCountAverage community rating (1–5) and number of reviews4.16, 19
enrollmentNumber of students490
address, zipCode, city, county, stateLocation1010 East Concord Street, 32803
phone, websiteContact details as listed on GreatSchools (the website can be a social page)(407) 245-1770
schoolLeader, schoolLeaderEmailPrincipal name and the email shown on the profile, when presentMs Bethany Chappetta
districtName, districtId, districtUrlSchool districtOrange County Public Schools
lowIncomePercentShare of low-income students23
ethnicity, genderBreakdownStudent demographics, with state averages for genderarrays
regularAttendancePercentStudents regularly attending92
titleI, equityIndicator, collegeSuccessAwards, claimStatusProgram flags and awardsfalse, true
descriptionGreatSchools summary sentencetext
nearbySchoolsUp to 10 nearest rated schools with rating, distance, type and gradesarray
reviewsUp to 10 recent community reviews: date, authorRole, rating, textarray
scrapedAt, sourceUrlCollection time and source pageISO 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:

Input

FieldDefaultNotes
locationOrlando, 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
maxResults101–10,000 schools
maxConcurrency5Parallel 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 os
from apify_client import ApifyClient
client = 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.

EventFreeBronzeSilverGold
School scrapedUSD 0.012USD 0.0117USD 0.0114USD 0.0096
Actor start (per started GB of memory)USD 0.006251USD 0.006094USD 0.005938USD 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 OUTPUT record with status (DATA, EMPTY, BLOCKED or REJECTED), 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.

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