● API Reference v1.0
Cape Town Open Data.
Ready for APIs and AI.
Clean, structured endpoints built on City of Cape Town municipal data. Designed for dashboards, AI assistants, civic tools, and MCP-compatible workflows.
8
Endpoints
100+
Suburbs
2.5M+
Records
MCP
AI Ready
Authentication
API Key
All requests require an API key in the x-api-key header. Contact GoLook to obtain your key and usage plan.
Header
x-api-key: your-api-key-here
No key yet? Contact GoLook →
MCP Protocol
JSON-RPC 2.0 over HTTP
GoLook uses the Model Context Protocol (MCP) — a JSON-RPC 2.0 standard designed for AI tool calling. All requests are POST to a single base URL.
Base URL
https://ko7resv8v7.execute-api.us-east-1.amazonaws.com/
Request Structure
{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get_latest_dam_levels", "arguments": {} } }
Endpoints
MCP
get_latest_dam_levels
Latest Cape Town dam levels — % capacity, storage (ML), and status for all 13 dams.
▼
Parameters
Example
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| dam_name | string | optional | Filter to one dam, e.g. Theewaterskloof, Wemmershoek |
JavaScript
const res = await fetch(MCP_URL, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": API_KEY }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "get_latest_dam_levels", arguments: {} } }) });
JSON — Live data 2026-01-29
{ "as_of_date": "2026-01-29", "summary": "13 records: 1 healthy, 8 watch, 4 low", "dams": [{ "dam_name": "Theewaterskloof", "current_level_pct": 56.52, "last_year_level_pct": 81.33, "storage_ml": 271411.0, "status": "watch" }] }
MCP
get_rainfall
Monthly rainfall totals (mm) per gauge station from 2000 to present. 20 stations across the Western Cape.
▼
Parameters
Stations
Example
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| station_name | string | required | Exact station name, e.g. Wemmershoek, Constantia Nek |
| period_from | string | optional | Start period YYYY-MM. Defaults to 24 months ago. |
| period_to | string | optional | End period YYYY-MM. Defaults to current month. |
| limit | integer | optional | Max records. Default 24, max 313. |
20 active gauge stations:
WemmershoekSteenbras
VoelvleiTheewaterskloof
WoodheadDe Villiers
NewlandsWynberg
Constantia NekPlattekloof
Blackheath UpperBlackheath Lower
Glen GarryTygerberg
FaureBrooklands
AtlantisMolteno
Kloof NekBerg River
JavaScript
const res = await fetch(MCP_URL, { method: "POST", headers: { "x-api-key": API_KEY }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "get_rainfall", arguments: { station_name: "Theewaterskloof", period_from: "2023-01" } } }) });
JSON — Live data
{ "station_name": "Theewaterskloof", "count": 2, "total_mm": 481.6, "avg_monthly_mm": 240.8, "records": [ { "Period": "2025-12", "Rainfall-mm": "465.45" }, { "Period": "2026-01", "Rainfall-mm": "16.1" } ] }
MCP
get_water_consumption
Median monthly residential water consumption (kl/month) by Cape Town suburb.
▼
Parameters
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| suburb | string | required | Suburb name, case-insensitive. e.g. Constantia, Khayelitsha |
| period_from | string | optional | Start period YYYY-MM |
| period_to | string | optional | End period YYYY-MM |
| limit | integer | optional | Max records. Default 50, max 200. |
JSON — Constantia live data
{ "found": true, "suburb": "CONSTANTIA", "count": 1, "avg_consumption_kl_month": 6.0, "records": [{ "Suburb": "CONSTANTIA", "Period": "2018-04", "Consumption-kl-month": "6" }] }
MCP
get_valuation_by_suburb
City of Cape Town general valuation roll — GV2012 through GV2022 median residential property values per suburb.
▼
Parameters
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| suburb | string | required | Suburb name, e.g. Sea Point, Constantia, Khayelitsha |
JSON — Sea Point live data
{ "found": true, "suburb": "SEA POINT", "num_residential_properties": 727, "median_land_extent_m2": 309, "valuations": { "gv2012": "R 3,485,000", "gv2015": "R 4,300,000", "gv2018": "R 7,400,000", "gv2022": "R 6,500,000" } }
MCP
get_valuations_by_range
Find all suburbs within a property valuation range for a given GV year. Ideal for affordability and market segmentation.
▼
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| gv_year | string | required | One of 2012, 2015, 2018, 2022 |
| min_value | integer | optional | Minimum valuation in rands, e.g. 500000 |
| max_value | integer | optional | Maximum valuation in rands, e.g. 2000000 |
| limit | integer | optional | Max results. Default 50, max 200. |
MCP
get_healthcare_facilities
Cape Town clinics, CDCs, district and private hospitals with lat/lon coordinates for proximity analysis.
▼
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| facility_class | string | optional | e.g. Clinic, District Hospital, Community Day Centre |
| facility_type | string | optional | CITY OF CAPE TOWN, PAWC, STATE, PRIVATE |
| name | string | optional | Partial name match, e.g. Mediclinic, Khayelitsha |
| limit | integer | optional | Max results. Default 100, max 500. |
MCP
get_schools
Western Cape schools dataset with optional filters by name, district, EMIS, and school type.
▼
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | optional | Partial school name match |
| district | string | optional | e.g. METRO CENTRAL, METRO EAST |
| school_type | string | optional | e.g. Primary School, High School |
| limit | integer | optional | Max results to return |
MCP
get_service_requests
Cape Town municipal service request complaints aggregated by suburb, complaint type, and month. Covers 2.5 million records including electricity outages, water supply issues, sewage blockages, and more.
▼
Parameters
Example
Response
| Parameter | Type | Required | Description |
|---|---|---|---|
| suburb | string | required | Suburb name in UPPERCASE, e.g. HOUT BAY, KHAYELITSHA, SEA POINT |
| start | string | required | Start date in YYYY-MM-DD format, e.g. 2024-01-01 |
| end | string | required | End date in YYYY-MM-DD format, e.g. 2024-12-31 |
⚡ Note: Large date ranges may take 2–5 seconds to respond. A 30-second timeout is applied.
JavaScript
const res = await fetch(MCP_URL, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": API_KEY }, body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "get_service_requests", arguments: { suburb: "PHILIPPI", start: "2024-01-01", end: "2024-12-31" } } }) });
JSON — Philippi 2024 live data
{ "found": true, "suburb": "PHILIPPI", "start": "2024-01-01", "end": "2024-12-31", "count": 48, "records": [ { "suburb": "PHILIPPI", "c3_complaint_type": "Electricity", "month": "2024-03", "complaint_count": 142 }, { "suburb": "PHILIPPI", "c3_complaint_type": "Water", "month": "2024-03", "complaint_count": 87 } ] }