GreatSchools Scraper — Ratings & Demographics
Pricing
from $12.00 / 1,000 school scrapeds
GreatSchools Scraper — Ratings & Demographics
Scrape GreatSchools profiles with ratings, test scores, equity data, demographics, reviews, grades, and location details for school research.
Pricing
from $12.00 / 1,000 school scrapeds
Rating
0.0
(0)
Developer
Muhammad Afzal
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Extract comprehensive US K-12 school data from GreatSchools.org — the nation's leading school quality resource trusted by millions of parents and educators.
What it does
The GreatSchools Scraper collects detailed school profiles for public, charter, and private schools across all 50 US states plus Washington DC. Search by city/state or paste GreatSchools URLs directly. Each record includes 35+ data fields: GreatSchools ratings (1-10), test score ratings, student progress ratings, community review ratings, enrollment numbers, grade levels, contact information (phone, website, principal email), student demographics (race/ethnicity, gender breakdown, low-income percentage), regular attendance rates, Title I status, equity indicators, nearby schools, and recent community reviews.
Use cases
- Real estate analysis — school quality overlays for neighborhood scoring and property valuation
- Relocation research — side-by-side school comparisons for families moving to a new city
- Lead generation — principal contact lists for EdTech sales, partnership outreach, and marketing campaigns
- Education research — demographics analysis, equity studies, and test score benchmarking by district
- Data enrichment — school intelligence for dashboards, AI/ML datasets, and market sizing reports
- Nonprofit & journalism — public school data for transparency projects and investigative reporting
Input parameters
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
startUrls | array | No | — | GreatSchools.org URLs to scrape directly (school profiles or city listing pages) |
location | string | No* | Orlando, FL | City and US state in City, ST format (e.g. Chicago, IL) |
schoolLevels | array | No | — | Filter by level: preschool, elementary, middle, high |
schoolTypes | array | No | — | Filter by type: public, charter, private |
maxResults | integer | No | 10 | Maximum number of schools to collect |
maxConcurrency | integer | No | 5 | Concurrent request limit |
proxyConfiguration | object | No | — | Proxy settings (datacenter by default) |
*Either startUrls or location must be provided.
Output fields
| Field | Type | Example |
|---|---|---|
schoolId | string|null | "18885" |
gsid | string|null | "FL-18885" |
name | string | "Laureate Park Elementary" |
url | string|null | "https://www.greatschools.org/florida/orlando/18885-Laureate-Park-Elementary/" |
state | string|null | "FL" |
city | string|null | "Orlando" |
county | string|null | "Orange County" |
districtName | string|null | "Orange County Public Schools" |
districtUrl | string|null | "https://www.greatschools.org/florida/orlando/orange-county-public-schools/" |
schoolType | string|null | "public" |
gradeLevels | string|null | "PK,KG,1,2,3,4,5" |
grades | string|null | "PK, K-5" |
greatSchoolsRating | integer|null | 10 |
testScoreRating | integer|null | 10 |
studentProgressRating | integer|null | 10 |
reviewRating | number|null | 2.92 |
reviewCount | integer|null | 12 |
enrollment | integer|null | 778 |
studentTeacherRatio | string|null | "15:1" |
address | string|null | "7800 Laureate Boulevard" |
zipCode | string|null | "32827" |
phone | string|null | "(407) 730-8730" |
website | string|null | "http://laureateparkes.ocps.net/" |
schoolLeader | string|null | "Mr Jose Perez-Valentin" |
schoolLeaderEmail | string|null | "25704@OCPS.NET" |
lowIncomePercent | number|null | 19.3 |
ethnicity | array | [{"breakdown":"Hispanic","percent":38.3}] |
genderBreakdown | array | [{"gender":"Male","schoolPercent":52.05}] |
regularAttendancePercent | number|null | 90 |
titleI | boolean|null | false |
equityIndicator | boolean|null | true |
collegeSuccessAwards | array | [] |
claimStatus | string|null | "unclaimed" |
description | string|null | "Laureate Park Elementary is a public school..." |
nearbySchools | array | [{"name":"Luminary Middle","rating":9,"distanceMiles":1.04}] |
reviews | array | [{"date":"2026-05-21","rating":2,"text":"..."}] |
scrapedAt | string | "2026-07-01T12:00:00.000Z" |
sourceUrl | string | "https://www.greatschools.org/florida/orlando/18885-..." |
Pricing
| Event | Price | Description |
|---|---|---|
| Actor Start | $0.005 | Charged once when the run starts |
| School Scraped | $0.012 per result | Charged for each school record with full profile data |
Example cost: Scraping 100 schools = $0.005 + (100 x $0.012) = $1.21
How it works
- Search mode — Enter a city and state (e.g.
Orlando, FL). The actor constructs the GreatSchools city page URL and extracts all school profile links from it. - URL mode — Paste GreatSchools URLs directly (school profiles or city listing pages).
- The actor visits each school profile page and extracts data from embedded JSON (
gonobject), JSON-LD schema, and the HTML DOM. - Filters by school level and type are applied after extraction.
- Results are pushed to the dataset immediately — no buffering, no data loss on timeout.
Technical details
- Crawler: CheerioCrawler (static HTML parsing — no browser needed, fast and reliable)
- Data extraction: Parses the
gonJavaScript object embedded in<script>tags for structured data (ratings, demographics, enrollment), plus JSON-LDSchoolschema for address, phone, website, and reviews - Proxy: Datacenter proxies by default. Switch to residential if you encounter blocking.
- Deduplication: Schools are deduplicated by GreatSchools ID across multiple listing pages
API usage
# Run via APIcurl -X POST "https://api.apify.com/v2/acts/USERNAME~greatschools-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"location": "Orlando, FL", "maxResults": 50}'
// Run via JavaScript SDKimport { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('USERNAME/greatschools-scraper').call({location: 'Orlando, FL',maxResults: 50,schoolTypes: ['public', 'charter'],});const dataset = await client.dataset(run.defaultDatasetId).listItems();console.log(dataset.items);
Limitations
- GreatSchools city pages list schools from the "Top Rated Schools" section, which may not include every school in a city. For comprehensive coverage, use the
startUrlsfield with specific school profile URLs. - Some data fields (test score breakdowns, course lists) are loaded via JavaScript and may not be available in the static HTML. The actor captures all data available in the server-rendered page.
- Private school profiles may have less data than public schools (fewer ratings, no test scores).
What is GreatSchools Scraper?
GreatSchools Scraper turns the target data into structured, reusable results on Apify. Use it when you need repeatable collection for researchers, analysts, education or recruiting teams, and structured-data workflows without maintaining a custom scraper or one-off integration. Run it manually, schedule recurring jobs, call it through the Apify API, or connect it to an AI agent through the Apify MCP server.
The Actor stores results in an Apify dataset, where they can be previewed and exported as JSON, CSV, Excel, XML, or RSS. Availability and completeness depend on the source, supplied inputs, public visibility, authentication requirements, and upstream rate limits.
Use cases for GreatSchools Scraper
- Build structured datasets for research, reporting, enrichment, or monitoring.
- Automate repetitive collection with schedules, webhooks, and API calls.
- Feed clean records into spreadsheets, databases, CRMs, BI tools, AI agents, or RAG pipelines.
- Track changes over time by running the same validated input on a schedule.
- Replace fragile manual copy-and-paste work with a reproducible Apify workflow.
How to use GreatSchools Scraper
- Open the Actor input page and choose a focused, valid target.
- Set a conservative result limit for the first run.
- Start the Actor and inspect the dataset for coverage and field availability.
- Export the results or connect the dataset to your downstream system.
- Scale gradually and use scheduling, pagination, or proxies when supported.
Important input options
startUrls— Use this field when the user provides specific GreatSchools.org URLs to scrape directly. Accepts school profile URLs (e.g. https://www.greatschools.org/florida/orlando/18885-Laureate-Park-Ellocation— Enter a city and US state to search for schools. Use 'City, ST' format — for example, 'Orlando, FL' or 'Los Angeles, CA'. You can also use just a city name with full state like 'Oklahoma CitschoolLevels— Select school levels to filter by. Leave empty to include all levels. Valid values: preschool, elementary, middle, high. The actor checks each school's grade range and includes only matchingschoolTypes— Select school types to filter by. Leave empty to include all types. Valid values: public, charter, private.maxResults— Maximum number of schools to collect and return. Set to a small number (3-5) first to verify data quality before scaling up. A single city page typically lists 100-200+ schools.proxyConfiguration— Select a proxy to use for scraping. The actor works with datacenter proxies by default. If GreatSchools blocks your requests, switch to residential proxies or provide a custom proxy URL.maxConcurrency— Maximum number of concurrent requests. Lower this if you encounter rate limiting or timeouts. Default is 5 which balances speed and reliability.
API and automation example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('muhammadafzal/greatschools-scraper').call({// Add the same input fields you use in the Apify Console.});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Related Apify Actors
Use these dedicated tools when a neighboring data source or workflow is a better match:
- Contractor License Leads — Licensed US Contractors
- Texas State Licensed Contractor Scraper — TDLR License Data
- Instagram Followers & Following Scraper — With Cookies
- Facebook Ads Library Scraper — Meta Ad Intelligence Tool
- Leads Finder Pro - B2B Leads with Emails [Apollo Alternative]
- Yellow Pages US Scraper — Business Leads & Reviews
- Justia Lawyer Directory Scraper — Attorney Leads
- Yellow Pages Australia Scraper — Business Leads & Reviews
- OpenTable Restaurants, Ratings & Reviews Scraper
- Etsy Scraper Pro — Products, Prices, Reviews & Shop Data
Frequently asked questions
How many results can I scrape with GreatSchools Scraper?
The practical total depends on the source, input limits, pagination, available records, run timeout, and upstream restrictions. Start with a small run, verify the output, and increase the limit gradually.
Can I integrate GreatSchools Scraper with other apps?
Yes. Use Apify integrations, webhooks, schedules, dataset exports, Make, Zapier, Google Sheets, cloud storage, or your own application.
Can I use GreatSchools Scraper with the Apify API?
Yes. Start runs with the Apify REST API or an official Apify client, then retrieve records from the run's default dataset. Keep your API token in a secret or environment variable.
Can I use GreatSchools Scraper through an MCP Server?
Yes. The Apify MCP server can expose the Actor to compatible AI clients and agents. Review the input and expected cost before allowing an autonomous workflow to run it at scale.
Do I need proxies?
It depends on the source and volume. Use the default configuration first. For larger or geographically sensitive jobs, select an appropriate proxy configuration only when the Actor supports it.
Is it legal to scrape this data?
Scraping rules vary by source, jurisdiction, data type, and intended use. Collect only data you are authorized to access, respect applicable terms and privacy laws, and avoid restricted or personal data misuse. This documentation is not legal advice.
Your feedback
If a field is missing, a source layout has changed, or you need a supported use case documented, open an issue on the Actor page with a reproducible input and run ID.