Open data

The data behind this site, ready to download

Everything MoCo Parents publishes is available as static, schema-described files — per-school JSON, analysis payloads, GeoJSON boundaries, and a queryable Parquet fact table. No API key, no server, no tracking.

Start here

  • /data/index.json — the machine-readable catalog of everything below (URLs, schemas, sizes).
  • /llms.txt — the same map, for AI assistants and agents.
  • /data/manifest.json — bundle version 4.0.0 and per-source as-of vintages.

Join key everywhere: 3-digit MCPS school code, zero-padded string (e.g. 427 = Walt Whitman HS). Suppression: null values alongside suppressed flags are privacy-suppressed small counts — do not impute or infer them.

Where to look

The question-to-file map, straight from the catalog — the same routing served to AI agents in /llms.txt.

QuestionFileMethod
math acceleration/data/school_year.parquetaccel_pct = share of grade 8 testing beyond Math 8 (placement, not performance - MEASURES.md 1); MS-vs-HS Algebra 1 split: QUERYING.md recipe 5
compare schools / rankings/data/school_year.parquetshow farms_pct beside any ranking - raw ranks mostly recover demographics (MEASURES.md 12); a context model explains ~90% of between-school variance
test scores by school, grade or subgroup/data/assessments.parquetSQL: assessments.parquet; fetch-only: /data/mcap/{code}.json per school; match grade exactly - grade != 'All' is NOT per-grade (QUERYING.md recipe 3)
suspensions / discipline/data/school_year.parquetsuspended_pct = unique students suspended as pct of enrollment (near-fully suppressed from 2024); incident COUNTS are a different measure - warehouse domain='discipline_incidents'
class size/data/mcps_consolidated.parquetflat domain: WHERE domain='class_size' AND metric='avg_class_size' (see warehouse_domains.json); 2024 redefinition breaks secondary trends
absenteeism / attendance/data/school_year.parquetchronic_absent_pct + attendance_pct columns; full detail /data/climate.parquet
star ratings / accountability/data/school_year.parquetstar_rating + acct_points_pct (2022-2025 only, no 2020-21); detail /data/accountability.parquet
per-pupil spending/data/school_year.parquetppe_total vs ppe_state_local vs ppe_federal - never mix variants (MEASURES.md 10); detail /data/finance.parquet
graduation / dropout/data/school_year.parquetgrad_rate_4yr (HS only); 5-yr cohorts + dropout detail /data/graduation.parquet
enrollment, demographics, poverty/data/school_year.parquetenrollment, farms_pct, eml_pct, swd_pct; MSDE top-codes FARMS ~80 pct from 2024 (MEASURES.md 6); by-grade history /data/enrollment.parquet
teacher experience / qualifications/data/school_year.parquetinexperienced_pct + emergency_cred_pct; poverty/students-of-color breakdowns /data/educators.parquet
school lookup / roster/data/roster.jsoncode, name, type, cluster, lat, lon - the join spine; the 3-digit code keys every other file
boundaries / bus routes/boundaries/HS.geojsonES/MS/HS(.geojson) + MS_adopted/HS_adopted (post-2027); bus routes /bus/{code}.geojson per school

Datasets

DatasetFilesSchemaSize
School-by-year wide table — one row per school × year with the headline measure from every source (start here)school_year342 KB
MCAP results — school + district, every student group, every grade, 2019-2026assessments1.2 MB
MCAP results as JSON, one file per school (all years) — parquet-free mirrormcap_json
/data/mcap/{code}.json (example) · 206 files
Per-school profiles, district rollup, sped detail, income/gaps analysessite_core
/data/schools/{code}.json (example) · 222 files
327 KB
School roster (slim JSON) — code, name, type, cluster, coordinates for every schoolroster29 KB
What each measure means — definitions, formulas, and what NOT to concludemeasures_guide6 KB
How to query this data without fooling yourself — verified DuckDB recipesquerying_guide11 KB
District-wide MCAP proficiency, race × special-services-group intersections, 2022-2026 (authoritative)assessments_race_service_district8 KB
Bus routes (per-school GeoJSON + index)bus33 KB
School directory (crosswalk) — codes, names, type, cluster, coordinates, coverageschools23 KB
Attendance-area income / demographics / property profiles (ACS + SDAT)neighborhoods73 KB
Historical enrollment by school × school-year × gradeenrollment28 KB
School program capacity + facility attributes (by vintage)capacity15 KB
MCPS official enrollment projections (by vintage × projected year)official_projections12 KB
Housing-development pipeline student yield (by school × year)development7 KB
HS college-test outcomes — SAT / ACT / AP graduate results, 2019 + 2021-2025hs_outcomes28 KB
MSDE accountability — star rating, index points, percentile rank (by school × year)accountability14 KB
Graduation — 4/5-yr cohort grad + dropout, HS completion, annual dropoutgraduation14 KB
School climate — attendance, chronic absenteeism, mobility, promotionclimate26 KB
Per-pupil expenditures (state/local, federal, total) by school × yearfinance22 KB
Educator qualifications — inexperienced/out-of-field/emergency-cred, by poverty & students-of-color leveleducators24 KB
Full-fidelity archive — every MCPS + MSDE figure, one row per source cell (audit layer; hardest to query — start with school_year or the typed tables)mcps_consolidated6.3 MB
Warehouse pivot map — per-domain shape + ready-made pivot SQL for mcps_consolidated.parquetwarehouse_domains53 KB
MSDE Maryland Report Card — every published figure, exactly as MSDE reports itmsde4.3 MB
MCPS School Profiles — every published figure, exactly as MCPS reports itmcps578 KB

Geo files

Query the fact tables directly

These Parquet tables carry every figure behind this site's pages, plus many breakdowns no page shows: MCAP and SAT/ACT/AP results, accountability, graduation, climate, finance, educators, enrollment, capacity, and neighborhood profiles. The full list, with URLs and field docs, is in the table above and in index.json. Start with /data/school_year.parquet — one row per school and year with the headline measure from every source already joined (a ~230 KB CSV twin needs no Parquet reader at all). The full-fidelity archive,/data/mcps_consolidated.parquet, holds every source cell exactly as published (~3M rows) — use it to verify a number, not to start from. Any Parquet-aware tool can query these over HTTP without downloading them first — for example, inDuckDB:

SELECT school_name, accel_pct, math_all_pct, farms_pct
FROM 'https://mocoparents.org/data/school_year.parquet'
WHERE school_type = 'MS' AND year = 2025
ORDER BY accel_pct DESC LIMIT 5;

Column meanings:mcps_consolidated_columns.json(consolidated), mcps_rows.schema.json, and msde_dictionary.json. Null values withsuppressed = true (MCPS) or marker strings in value_text (MSDE) are privacy suppression by design. Where both sources report the same fact, useWHERE canonical for one answer per fact (enrollment prefers MCPS; MSDE-origin rates and scores prefer MSDE), and treat discrepant = true rows with care — the sources genuinely disagree there (cross-check report).

Charts straight from SQL

The tables above aren't just downloads — the site itself builds charts from them. This one is a DuckDB query against mcps_consolidated.parquet executed at build time and shipped as inline SVG (no JavaScript): countywide enrollment from the canonical cross-source rows, where MCPS is preferred when both systems report a grade and MSDE fills the earlier years.

SELECT year::INT AS year, SUM(value)::DOUBLE AS students
FROM mcps_consolidated
WHERE concept = 'enrollment_by_grade_count' AND canonical
GROUP BY year ORDER BY year

Terms

All data derives from public MCPS, MSDE, and U.S. Census sources; this site's transformations are provided as-is, for any use, with attribution appreciated ("MoCo Parents, mocoparents.org"). Please don't present suppressed values as zeros, and check each dataset's schema before comparing numbers across sources.

Source: Generated with the data bundle by the mcps-pipeline exporter · Updated: 2026-07-31