UniApplyForMe Data
Documentation
GET/v1/high-schools

Browse 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

MethodPathDescription
GET/v1/high-schoolsList and search all schools
GET/v1/high-schools/{natEmisOrId}Get one school by nat_emis (9-digit) or numeric id
GET/v1/high-schools/provincesList provinces with school counts
GET/v1/high-schools/districtsList districts with school counts; filter by ?province=

Query Parameters — /v1/high-schools

ParameterTypeDescriptionExample
searchstringSchool name search. Full-text (≥3 chars) or ILIKE (1–2 chars). Case-insensitive.Westville
provincestringFilter by province. Case-insensitive.KwaZulu-Natal
districtstringFilter by district. Case-insensitive.eThekwini
sectorstringPublic or Private.Public
quintilestringQuintile 1–5. Accepts 3 or Q3.Q5
no_feebooleanFilter no-fee schools.true
urban_ruralstringUrban or Rural.Urban
pageintegerPage number (default: 1).2
per_pageintegerResults 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&sector=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

  • id is a bigint integer, not a UUID.
  • quintile is returned as a string ("Q1""Q5"). The filter accepts both 3 and Q3.
  • Name search uses a trigram index (GIN) — fast even on the full 26 000-school dataset.
  • All string filters are case-insensitive.
  • The /districts endpoint accepts an optional ?province= query parameter.