Documentation
GET
/v1/high-schoolsBrowse and search South Africa's complete EMIS high school directory — over 26,000 schools with full contact details, geolocation, quintile, and enrolment data.
Authentication
API key required. Scope: high_schools:read
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /v1/high-schools | List and search all schools |
| GET | /v1/high-schools/{natEmisOrId} | Get one school by nat_emis (9-digit) or numeric id |
| GET | /v1/high-schools/provinces | List provinces with school counts |
| GET | /v1/high-schools/districts | List districts with school counts; filter by ?province= |
Query Parameters — /v1/high-schools
| Parameter | Type | Description | Example |
|---|---|---|---|
search | string | School name search. Full-text (≥3 chars) or ILIKE (1–2 chars). Case-insensitive. | Westville |
province | string | Filter by province. Case-insensitive. | KwaZulu-Natal |
district | string | Filter by district. Case-insensitive. | eThekwini |
sector | string | Public or Private. | Public |
quintile | string | Quintile 1–5. Accepts 3 or Q3. | Q5 |
no_fee | boolean | Filter no-fee schools. | true |
urban_rural | string | Urban or Rural. | Urban |
page | integer | Page number (default: 1). | 2 |
per_page | integer | Results per page (default: 20, max: 100). | 50 |
Code Examples
# Search schools in KwaZulu-Natal
curl "https://api.apply.org.za/v1/high-schools?province=KwaZulu-Natal§or=Public&urban_rural=Urban" \
-H "X-API-Key: uafm_live_your_token"
# Get a specific school by nat_emis
curl "https://api.apply.org.za/v1/high-schools/700110001" \
-H "X-API-Key: uafm_live_your_token"
# List provinces with counts
curl "https://api.apply.org.za/v1/high-schools/provinces" \
-H "X-API-Key: uafm_live_your_token"Response — GET /v1/high-schools
{
"data": [
{
"id": 14823,
"nat_emis": "700110001",
"name": "Westville Boys' High School",
"phase": "Secondary",
"sector": "Public",
"province": "KwaZulu-Natal",
"district": "eThekwini",
"circuit": "Westville",
"town": "Westville",
"street_address": "2 Glenluce Drive, Westville",
"postal_address": "Private Bag X10, Westville, 3630",
"email": "admin@westvilleboyshigh.co.za",
"telephone": "031 266 0270",
"latitude": -29.8368,
"longitude": 30.9282,
"quintile": "Q5",
"no_fee_school": false,
"urban_rural": "Urban",
"learner_count": 1240,
"educator_count": 68,
"exam_number": null,
"exam_centre": null,
"created_at": "2024-01-15T08:00:00Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 26043
}
}Response — GET /v1/high-schools/provinces
{
"data": [
{ "province": "Eastern Cape", "school_count": 5842 },
{ "province": "Free State", "school_count": 1523 },
{ "province": "Gauteng", "school_count": 3291 },
{ "province": "KwaZulu-Natal", "school_count": 6104 },
{ "province": "Limpopo", "school_count": 3997 },
{ "province": "Mpumalanga", "school_count": 1844 },
{ "province": "North West", "school_count": 1612 },
{ "province": "Northern Cape", "school_count": 602 },
{ "province": "Western Cape", "school_count": 1228 }
]
}Notes
idis a bigint integer, not a UUID.quintileis returned as a string ("Q1"–"Q5"). The filter accepts both3andQ3.- Name search uses a trigram index (GIN) — fast even on the full 26 000-school dataset.
- All string filters are case-insensitive.
- The
/districtsendpoint accepts an optional?province=query parameter.