On this page
- Vacancy data sources
- School identity data
- Geographic lookup
- Distance calculations
- Data quality checks
- Update schedule
- Known limitations
- Version history
1. Vacancy data sources
Primary source: MOE annual announcements
Vacancy, applied, and taken counts for each phase come from the Ministry of Education's official P1 Registration announcements, typically published 2-4 weeks after each phase's results day on moe.gov.sg/primary/p1-registration.
The MOE releases typically include:
- A national summary table (all schools, all phases)
- Per-school breakdowns (sometimes only schools with vacancies)
- Ballot outcome statistics for oversubscribed schools
Secondary source: data.gov.sg
For historical years (2023-2025), we cross-reference against data.gov.sg releases. The official dataset is published once per year, typically in Q1 of the following year.
Tertiary source: school websites
For supplementary seats (2CS) and Phase 3, MOE does not always publish school-by-school data. We contact schools directly via email or check their websites for opening notices during the registration window.
2. School identity data
| Field | Source | Refresh cadence |
|---|---|---|
| Name, address, postal code | data.gov.sg primary schools dataset | Annually |
| Lat/lng, town, zone | data.gov.sg | Annually |
| School type, affiliation | data.gov.sg | Annually |
| Principal name, contact | School websites | When changed |
| MRT, bus services | School websites + OneMap | When changed |
| Email, phone | School websites | When changed |
3. Geographic lookup
When you type a postal code on the homepage, we go through this chain:
Step 1: OneMap Singapore API
OneMap is Singapore's authoritative geocoding service, maintained by the Singapore Land Authority (SLA). It works for specific building addresses — about 30% of Singapore postcodes. Examples:
521524→ 524A Tampines Central 7 (lat 1.3584, lng 103.9389)238859→ ION Orchard (lat 1.3041, lng 103.8318)039393→ Marina Bay Sands (lat 1.2834, lng 103.8607)
Step 2: Postal district centroid
For sector codes where no specific building exists (about 70% of postcodes), OneMap returns no result. We fall back to the postal district centroid — the average latitude/longitude of schools in that district. We mark these results as "approximate" in the UI.
Step 3: District centroids are derived from real data
For districts with 3+ schools in our dataset, we calculate the centroid from the actual school locations (averaged lat/lng). For districts with fewer schools, we use authoritative hand-curated coordinates.
Examples:
| District | Town | Source | Schools |
|---|---|---|---|
| 51 | Pasir Ris | Real-data centroid | 6 |
| 52 | Tampines | Real-data centroid | 11 |
| 54 | Sengkang | Real-data centroid | 9 |
| 29 | Sengkang | Hand-curated | 1 |
4. Distance calculations
We use the haversine formula for straight-line distance between two coordinates. This is a reasonable approximation for the kind of distances involved in P1 registration (typically 0-3 km).
Important: MOE uses building-outline distance (the walking path between two building entry points), not haversine. For distances under 1 km, the two methods typically agree within 0.1-0.3 km. For distances near the 1 km boundary, this can matter:
| Example | Haversine | MOE walking | Difference |
|---|---|---|---|
| Ahmad Ibrahim ↔ postal 768643 (Yishun) | 0.6 km | ~0.7 km | +0.1 km |
| Poi Ching ↔ postal 521524 (Tampines) | 0.4 km | ~0.5 km | +0.1 km |
We do not have access to MOE's internal walking-path calculation, so we always label our distance as "straight-line" in the UI.
5. Data quality checks
Every refresh goes through these automated and manual checks:
- Completeness: All 182 schools must have an entry for every year and every phase they participated in
- Internal consistency: Total vacancy per school-year should sum sensibly across phases
- Range checks: Vacancy between 0 and 600, applied between 0 and 1,000
- Sanity checks: Schools with extreme oversubscription (>3x) are flagged for manual review
- Cross-reference: Compare new data against previous year's value for the same school; flag changes >20% for review
6. Update schedule
| Period | Update activity |
|---|---|
| Late June (after Phase 1) | Phase 1 data + applied counts published |
| Mid July (after Phase 2A) | Phase 2A data + ballot outcomes |
| Late July (after Phase 2B) | Phase 2B data |
| Mid August (after Phase 2C) | Phase 2C data + oversubscription ratios |
| Late August (after Phase 2CS) | Phase 2CS vacancy data + taken counts |
| September (after Phase 3) | Phase 3 data |
| Q1 of following year | Annual archive snapshot + cross-reference with data.gov.sg |
7. Known limitations
What we don't have
- Individual student outcomes. We publish school-level statistics only. We do not have access to or publish individual student placement data.
- Application order within phase. MOE only publishes total applied count, not the order in which applications were received.
- Demographic breakdown. We cannot tell you how many PR vs citizen applicants were in a school's pool.
- Walking distance. As noted above, our distances are straight-line, not walking-path.
- Real-time MOE updates. We update within 7 days of MOE publishing, but not in real-time.
What can go wrong
- MOE revisions: Occasionally, MOE revises a number weeks after initial publication. We update within 14 days but there may be a brief inconsistency window.
- School data staleness: If a school changes its principal or contact info mid-year, our site may show the old value until our next refresh.
- OneMap outages: If the OneMap API is down, our postal lookup temporarily falls back to district centroids for all queries.
- Smart apostrophe schools: Singapore school names use both straight (') and curly (') apostrophes. We normalize both, but we may miss a school occasionally. Email data@primarysch.com if you spot one.
8. Version history
| Date | Version | Changes |
|---|---|---|
| 2026-08-27 | v2.1 | Added Phase 2CS (2026) and Phase 3 (2026) data. Published open dataset (CC-BY-4.0). |
| 2026-08-22 | v2.0 | Major rebuild: 4 sub-pages per phase, postal lookup with OneMap fallback, expanded school database. |
| 2026-07-30 | v1.5 | Added 2025 historical data. Phase 2C leaderboard added. |
| 2026-06-15 | v1.0 | Initial launch with 2024-2025 data. |
Questions?
For methodology questions or to report an issue: data@primarysch.com
For privacy-related questions: privacy@primarysch.com
General enquiries: Contact page →