K-12 Public School Directory Scraper avatar

K-12 Public School Directory Scraper

Pricing

Pay per event

Go to Apify Store
K-12 Public School Directory Scraper

K-12 Public School Directory Scraper

Scrape the NCES public-school directory for every U.S. K-12 school. Returns NCES IDs, addresses, phones, websites, district linkage, enrollment, teacher FTE, student/teacher ratio, free-lunch counts, and demographics. Filter by state and grade level.

Pricing

Pay per event

Rating

0.0

(0)

Developer

BowTiedRaccoon

BowTiedRaccoon

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

NCES K-12 Public School Directory Scraper

Scrapes the NCES Common Core of Data — the federal directory of every U.S. public K-12 school. Returns NCES IDs, addresses, phone numbers, school websites, district linkage, enrollment counts, FTE teacher counts, student/teacher ratios, free/reduced-lunch eligibility, and demographic breakdowns for ~98,000 schools across 50 states plus DC, BIE, DoDEA, and territories.


NCES K-12 Scraper Features

  • Pulls the full structured record per school — 32 fields including NCES School ID, NCES District ID, mailing address, phone, website, enrollment, teacher FTE
  • Filters by state (any subset of 57 jurisdictions including BIE and DoDEA) and grade level (elementary, middle, high, or all)
  • Filters by school type — regular, special education, vocational/technical, or alternative
  • Returns free-lunch eligibility, reduced-price lunch counts, and direct-certification (SNAP-linked) counts where reported
  • Includes per-grade enrollment, gender split, and seven-category race/ethnicity breakdowns
  • Links each school to its parent district with both NCES LEAID and the district detail URL
  • Caps result count with maxItems so you can pull a sample without paying for a full national crawl
  • No proxy required — federal public data, served straight from NCES

Who Uses K-12 School Directory Data?

  • EdTech sales teams — build account lists by state, district size, or Title I demographics, then route to the right rep
  • Curriculum vendors — qualify schools by grade band and enrollment before sending the demo email
  • Education researchers — assemble study cohorts, compute district-level summaries, or join NCES data to external sources
  • Grant writers — pull free-lunch eligibility counts to qualify schools for ESSA Title I, II, IV programs (NCES is the citation source)
  • Civic data journalists — query enrollment trends and school-type distributions without learning the IPEDS download portal
  • State agency analysts — verify directory data, build comparison sets, or feed public dashboards

How the K-12 Scraper Works

  1. You pick states, school types, and a grade band. The defaults cover all U.S. states and territories with no grade filter, capped at 15 records.
  2. The scraper queries the NCES School Locator listing endpoint for each state, paginates through results 15 per page, and enqueues each school's detail page.
  3. Each detail page is parsed for the labeled directory fields, district linkage, enrollment characteristics, and the demographic tables. Records are saved as flat JSON, one per school.

Input

{
"states": ["06", "48"],
"schoolTypes": ["1"],
"gradeLevel": "all",
"maxItems": 100
}
FieldTypeDefaultDescription
statesArray of strings[] (all states)FIPS state codes. e.g. "06" California, "36" New York, "48" Texas. Leave empty for a national crawl.
schoolTypesArray of strings["1","2","3","4"]NCES school types to include. 1 = Regular, 2 = Special Education, 3 = Vocational/Technical, 4 = Other/Alternative.
gradeLevelString"all"Grade band. "all", "elementary", "middle", or "high". Filters using NCES's IncGrade form parameter.
maxItemsInteger15Maximum number of school records to return. Default is conservative; raise for production runs.
maxListingPagesPerStateInteger0 (no cap)Cap on listing pages crawled per state. Each page returns 15 schools. Use to bound crawl size.

One State, Just High Schools

{
"states": ["36"],
"schoolTypes": ["1"],
"gradeLevel": "high",
"maxItems": 500
}

National Sample

{
"states": [],
"maxItems": 1000
}

Charter / Alternative Schools in California

{
"states": ["06"],
"schoolTypes": ["4"],
"maxItems": 250
}

NCES K-12 Scraper Output Fields

{
"school_name": "A. E. Arnold Elementary",
"school_nces_id": "061044001166",
"state_school_id": "CA-3066480-6027767",
"school_type": "Regular school",
"school_status": "Open",
"charter": "No",
"district_name": "Cypress Elementary",
"district_nces_id": "0610440",
"state_district_id": "CA-3066480",
"district_url": "https://nces.ed.gov/ccd/districtsearch/district_detail.asp?Search=2&details=1&ID2=0610440&DistrictID=0610440",
"grade_span": "KG - 6",
"grade_low": "KG",
"grade_high": "6",
"address_mailing": "9281 Denni St.",
"city": "Cypress",
"state": "CA",
"zip": "90630-2724",
"county": "Orange County",
"locale": "City, Small (13)",
"phone": "(714)220-6965",
"website": "http://ar.cypsd.org/",
"enrollment_total": 560,
"teachers_fte": 23,
"student_teacher_ratio": 24.35,
"free_lunch_eligible": 225,
"reduced_lunch_eligible": 72,
"free_reduced_lunch_total": 297,
"free_lunch_direct_cert": 164,
"enrollment_by_grade": "KG=100; 1=69; 2=70; 3=77; 4=75; 5=74; 6=95",
"enrollment_male": 266,
"enrollment_female": 294,
"enrollment_by_race": "American Indian/Alaska Native=1; Asian=162; Black=21; Hispanic=215; White=125; Native Hawaiian/Pacific Islander=2; Two or More Races=34",
"data_year": "2024-2025",
"detail_url": "https://nces.ed.gov/ccd/schoolsearch/school_detail.asp?...&ID=061044001166",
"scraped_at": "2026-04-28T01:24:00.000Z"
}
FieldTypeDescription
school_nameStringFull school name as published by NCES
school_nces_idString12-digit NCES School ID (national unique key)
state_school_idStringState-assigned school identifier
school_typeStringRegular, Special Education, Vocational/Technical, or Other/Alternative
school_statusStringOpen, Closed, New, Reopened, Future, or Inactive
charterString"Yes" or "No"
district_nameStringLocal Education Agency (district) name
district_nces_idString7-digit NCES District ID (LEAID)
state_district_idStringState-assigned district identifier
district_urlStringURL to the NCES district detail page
grade_spanStringGrade span as shown on NCES (e.g. "KG - 5", "6 - 8", "9 - 12")
grade_lowStringLowest grade served
grade_highStringHighest grade served
address_mailingStringStreet line of the mailing address
cityStringCity
stateStringTwo-letter state postal code
zipStringZIP or ZIP+4
countyStringCounty name
localeStringNCES urbanicity code + label (e.g. "City, Midsize (12)")
phoneStringMain phone number
websiteStringOfficial school website URL where district publishes one
enrollment_totalNumberTotal enrolled students
teachers_fteNumberFull-time-equivalent classroom teachers
student_teacher_ratioNumberStudent-to-teacher ratio
free_lunch_eligibleNumberStudents eligible for free lunch under NSLP
reduced_lunch_eligibleNumberStudents eligible for reduced-price lunch
free_reduced_lunch_totalNumberCombined free + reduced-price lunch eligible
free_lunch_direct_certNumberFree-lunch eligible by Direct Certification (SNAP-linked)
enrollment_by_gradeStringPer-grade counts as "Grade=Count" pairs joined with "; "
enrollment_maleNumberMale student count
enrollment_femaleNumberFemale student count
enrollment_by_raceStringRace/ethnicity counts as "Group=Count" pairs joined with "; "
data_yearStringSchool year of the source data (e.g. "2024-2025")
detail_urlStringURL to the NCES school detail page
scraped_atStringISO 8601 timestamp when the record was extracted

Numeric fields are null when NCES marks the value as missing () or not applicable (). Title I and Magnet status fields aren't returned because NCES dropped them from CCD starting school year 2022-23.


FAQ

How do I scrape NCES school directory data?

The NCES K-12 Scraper handles it for you. Pick the states, school types, and grade level you want, then let it run. The actor walks the public CCD School Locator pages and returns one structured JSON record per school — no scraping logic to write, no NCES bulk download to wrangle.

How much does it cost to run?

Each run has a $0.10 start fee plus $0.001 per school record. A full California crawl (~10,000 schools) costs about $10.10. A 1,000-school national sample runs about $1.10. Pricing is the same across states.

Can I filter to charter schools or by Title I status?

You can filter by school type (schoolTypes: ["4"] for Other/Alternative, which includes most charters) and by grade band. Title I status itself isn't available — NCES removed it from CCD starting school year 2022-23, and the page now points users to the ED Data Express site for that field. The free-lunch counts returned here are usually a better proxy for need-based qualification anyway.

Does the scraper need proxies?

The NCES K-12 Scraper does not need proxies. NCES is a public federal site with no anti-bot protection. The actor crawls at a polite concurrency of 8 and respects rate limits.

How current is the data?

NCES publishes one school year of CCD data at a time. The current release is school year 2024-2025, included in the data_year field on every record. NCES updates annually around late spring.

Can I get superintendent or principal emails?

Not from this actor. NCES doesn't publish individual staff contacts — only the school's main phone, address, and website. For superintendent or principal emails you'd need to scrape each district's own site, which uses dozens of different content management systems and is its own project.


Need More Features?

Need additional fields, district-level rollups, or per-district staff scraping? File an issue or get in touch.

Why Use the NCES K-12 Scraper?

  • Authoritative source — pulls from the federal CCD release, the same dataset every state agency and education researcher already cites
  • Real demographics — returns per-grade enrollment, gender split, race/ethnicity breakdowns, and NSLP eligibility counts in the same record as the directory fields, which is more than most directory scrapers bother with
  • Affordable — $0.10 per run plus $0.001 per record. A million-school national crawl would cost about $98, if anyone needed that