Data Methodology

Exactly how PrimarySch.com collects, processes, and publishes Singapore P1 registration data. Sources, accuracy, limitations, and update procedures.

Last updated: 27 August 2026 · Next scheduled refresh: After MOE publishes final Phase 2CS results (Aug 2026) and Phase 3 results (Sep 2026).

On this page

  1. Vacancy data sources
  2. School identity data
  3. Geographic lookup
  4. Distance calculations
  5. Data quality checks
  6. Update schedule
  7. Known limitations
  8. 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:

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

FieldSourceRefresh cadence
Name, address, postal codedata.gov.sg primary schools datasetAnnually
Lat/lng, town, zonedata.gov.sgAnnually
School type, affiliationdata.gov.sgAnnually
Principal name, contactSchool websitesWhen changed
MRT, bus servicesSchool websites + OneMapWhen changed
Email, phoneSchool websitesWhen 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:

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:

DistrictTownSourceSchools
51Pasir RisReal-data centroid6
52TampinesReal-data centroid11
54SengkangReal-data centroid9
29SengkangHand-curated1

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:

ExampleHaversineMOE walkingDifference
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:

  1. Completeness: All 182 schools must have an entry for every year and every phase they participated in
  2. Internal consistency: Total vacancy per school-year should sum sensibly across phases
  3. Range checks: Vacancy between 0 and 600, applied between 0 and 1,000
  4. Sanity checks: Schools with extreme oversubscription (>3x) are flagged for manual review
  5. Cross-reference: Compare new data against previous year's value for the same school; flag changes >20% for review

6. Update schedule

PeriodUpdate 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 yearAnnual archive snapshot + cross-reference with data.gov.sg

7. Known limitations

What we don't have

What can go wrong

8. Version history

DateVersionChanges
2026-08-27v2.1Added Phase 2CS (2026) and Phase 3 (2026) data. Published open dataset (CC-BY-4.0).
2026-08-22v2.0Major rebuild: 4 sub-pages per phase, postal lookup with OneMap fallback, expanded school database.
2026-07-30v1.5Added 2025 historical data. Phase 2C leaderboard added.
2026-06-15v1.0Initial 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 →