
Singapore School Directory (MOE SchoolFinder)
hipersoft/sg-school-scraper
Every MOE school in Singapore (official data): name, level, nature, type, zone, address, postal code, contacts, email, principal, mother tongues, and SAP/IP/gifted flags. Filter by level, zone, nature. No setup.
Total users
5Monthly users
1Total runs
109Per school returned
$0.003Last rebuilt
Oct 28, 2026Overview
Every MOE school in Singapore as clean JSON, CSV or Excel — name, level, nature, type, zone, address, postal code, phone, email, website, principal & vice-principals, mother tongues offered, and SAP / Integrated Programme / Gifted flags. Filter by level, zone, nature or programme. Built on Singapore's official MOE open data, commercial-reuse licensed. No key, no login.
Great for parent & relocation apps, education lead generation, tuition/edtech targeting and analytics.

What you get
- 🎓 ~340 schools — the full official MOE list, primary through junior college
- 🏷️ Rich attributes — level, nature (co-ed/boys/girls), type, zone, session
- 📞 Contacts — phone(s), fax, email, website, principal & vice-principals
- 🧭 Getting there — nearest MRT and bus services
- 🌏 Programmes — mother tongues offered, and SAP / IP / Gifted indicators
- 🔎 Filters — name, level, zone, nature, postal code, gifted-only, IP-only, SAP-only
- 🧾 Provenance — stable
id,sourceUrl,collectedAt
Example input
All co-ed secondary schools in the East offering the Integrated Programme:
{ "level": "SECONDARY", "zone": "EAST", "nature": "CO-ED", "ipOnly": true }
Output

{
"id": "sgsch-admiralty-primary-school",
"schoolName": "ADMIRALTY PRIMARY SCHOOL",
"level": "PRIMARY",
"nature": "CO-ED SCHOOL",
"type": "GOVERNMENT SCHOOL",
"zone": "NORTH",
"address": "11 WOODLANDS CIRCLE",
"postalCode": "738907",
"email": "admiralty_ps@moe.edu.sg",
"website": "https://admiraltypri.moe.edu.sg",
"nearestMrt": "Admiralty Station",
"principalName": "…",
"motherTongues": ["CHINESE", "MALAY", "TAMIL"],
"isSap": false, "isGifted": false, "isIP": false,
"sourceUrl": "https://data.gov.sg/datasets/…/view",
"collectedAt": "2026-07-30T08:14:00.000Z"
}
Output schema
| Field | Type | Description |
|---|---|---|
id |
string | Stable record ID for the school. |
schoolName |
string | Official school name. |
level |
string | School level (Primary, Secondary, Junior College, etc.). |
nature |
string | Nature of the school (co-ed, boys, girls). |
type |
string | School type (e.g. Government, Government-Aided). |
zone |
string | Geographic zone (North, South, East, West). |
session |
string | Session type (single or double session). |
address |
string | Street address. |
postalCode |
string | Postal code. |
telephone |
string | Primary phone number. |
telephone2 |
string | Secondary phone number. |
fax |
string | Fax number. |
email |
string | Contact email. |
website |
string | School website URL. |
nearestMrt |
string | Nearest MRT station. |
busServices |
string | Bus services serving the school. |
principalName |
string | Name of the principal. |
vicePrincipals |
array | Names of vice-principals. |
motherTongues |
array | Mother-tongue languages offered. |
isSap |
boolean | Whether it is a Special Assistance Plan (SAP) school. |
isAutonomous |
boolean | Whether it is an autonomous school. |
isGifted |
boolean | Whether it offers the Gifted Education Programme. |
isIP |
boolean | Whether it offers the Integrated Programme. |
sourceUrl |
string (URL) | Source dataset URL. |
collectedAt |
string (ISO date) | When the record was collected. |
Input fields
| Field | Description |
|---|---|
nameQuery |
Keyword in name/address. |
level / zone / nature |
Filter by level, zone or nature. |
giftedOnly / ipOnly / sapOnly |
Programme filters. |
postalCode |
Postal-code prefix. |
maxItems |
Max schools (0 = all). |
FAQ
Where does the data come from? Singapore's official MOE "General Information of Schools" dataset on data.gov.sg, reused under the Singapore Open Data Licence.
Can I find schools with a specific programme?
Yes — use giftedOnly, ipOnly or sapOnly, and combine with level/zone/nature.
How does billing work? A tiny per-run dataset charge plus pay per school returned.
Can I connect this to other apps? The Singapore School Directory can be connected with almost any cloud service or web app thanks to integrations on the Apify platform. It works with Make, Zapier, Slack, Airbyte, GitHub, Google Drive and many more, plus the Apify API, JavaScript/Python clients and MCP. Or use webhooks to trigger an action whenever a run finishes.
Notes
Original clean-room implementation using Singapore's official MOE open data (data.gov.sg), reused under the Singapore Open Data Licence. Not affiliated with or endorsed by MOE or the Singapore Government.
Input
| Field | Type | Description |
|---|---|---|
nameQueryName / address keyword | string | Filter by keyword in school name or address. Empty = all. |
levelLevel | string | e.g. PRIMARY, SECONDARY, JUNIOR COLLEGE, MIXED LEVEL. Empty = all. |
zoneZone | string | NORTH, SOUTH, EAST or WEST. Empty = all. |
natureNature | string | CO-ED, BOYS or GIRLS. Empty = all. |
giftedOnlyGifted programme only | boolean | Only schools offering the Gifted Education Programme. Default: false |
ipOnlyIntegrated Programme only | boolean | Only schools offering the Integrated Programme (IP). Default: false |
sapOnlySAP schools only | boolean | Only Special Assistance Plan (SAP) schools. Default: false |
postalCodePostal code prefix | string | Filter by postal code / prefix. Empty = all. |
maxItemsMax schools | integer | Maximum schools to return. 0 = all (~340). Default: 0 |
API
curl -X POST "https://api.apify.com/v2/acts/hipersoft~sg-school-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{}'from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("hipersoft/sg-school-scraper").call(run_input={})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('hipersoft/sg-school-scraper').call({});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Pricing
| Event | Price | Paid plans from |
|---|---|---|
| School returned One school record returned. | $0.003 | $0.0015 |
| Dataset fetch One fetch of the official MOE dataset. | $0.005 | $0.005 |
You pay only for what the run returns. Set a maximum cost per run and it stops cleanly at that limit.
Related scrapers
North Data Scraper
Look up European companies on North Data: legal name, former names, register number, address, founding date, LEI, business purpose, managing directors and officers, and recent register publications. Germany, UK, France, Austria and 20+ countries. Bulk lookups.
2,467 runs · 5 users · $0.004 / companyWebsite Content Crawler
Extract clean, readable content from any list of websites: page title, meta description, headings, main body text, word count and link/image counts. Optional same-domain crawl. Bulk-ready. Great for LLM/RAG ingestion, content audits and research.
206 runs · 20 users · $0.0024 / page scrapedSpyFu Domain Scraper
Bulk SEO and PPC reports for any domain from SpyFu: organic keywords, monthly SEO clicks and value, Google Ads budget, paid keywords, top keywords, competitors, top countries and monthly history. Competitor research for agencies. Export CSV/JSON.
185 runs · 7 users · $0.008 / domain reportTrustpilot Reviews Scraper
Scrape Trustpilot reviews and company ratings by company domain or Trustpilot URL: star rating, title, text, reviewer name & country, verification, date, company reply, plus company TrustScore and total reviews.
146 runs · 4 users · $0.0006 / review scrapedACRA Singapore Company Registry Scraper
Search and export Singapore's full ACRA corporate registry: UEN, entity name, status, incorporation date, address, SSIC industry codes, officers, former names and audit firms. Filter by name, status, entity type or industry. Public open data, no setup.
138 runs · 10 users · $0.01 / company scrapedWayback Machine Scraper
List every Internet Archive (Wayback Machine) snapshot of a URL or whole domain: timestamp, snapshot URL, status code, MIME type and content digest. Filter by date, status and dedupe. For SEO, OSINT and historical research. No setup.
135 runs · 15 users · $0.002 / snapshot scrapedSend the site and the fields. We build it and you get it first.