{"openapi":"3.1.0","info":{"title":"Unmapped Dataworks API","version":"v1","description":"South African datasets, checked against their sources. Records come a page at a time, within a daily records limit per account (see the X-Daily-* headers). Changes within v1 only add things: fields and endpoints aren't removed or renamed without notice. Docs: https://unmapped.co.za/docs","contact":{"email":"hello@unmapped.co.za","url":"https://unmapped.co.za/docs"},"termsOfService":"https://unmapped.co.za/terms"},"servers":[{"url":"https://api.unmapped.co.za/v1"}],"security":[{"bearer":[]}],"paths":{"/datasets":{"get":{"summary":"Every dataset, and whether it's switched on and available","operationId":"listDatasets","responses":{"200":{"description":"The datasets"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}":{"get":{"summary":"One dataset: its fields, filters and live release","operationId":"getDataset","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}}],"responses":{"200":{"description":"The dataset"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/records":{"get":{"summary":"Records, filtered and a page at a time","operationId":"listRecords","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}},{"name":"from","in":"query","required":false,"description":"Only records on or after this date (the dataset's own date field)","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Only records on or before this date","schema":{"type":"string","format":"date"}},{"name":"level","in":"query","required":false,"description":"Filter, for air-quality: municipality, district or province (2026 boundaries; no wards) (e.g. municipality); drought-index: ward, municipality, district or province (2026 boundaries) (e.g. municipality); greenness-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); heat-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); land-and-population-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); night-light-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); surface-water-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); ward-boundaries: ward, municipality or district (e.g. ward); weather-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); wildfire-history: ward, municipality, district or province (2026 boundaries) (e.g. municipality)","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"Filter, for air-quality: MDB municipality or district code, or ISO 3166-2 province code (e.g. JHB); drought-index: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); fuel-zone-lookup: Magisterial district code (e.g. BV050); greenness-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); heat-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); land-and-population-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); night-light-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); surface-water-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); ward-boundaries: MDB code of one ward, municipality or district (e.g. 19100001); weather-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); wildfire-history: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. WC048)","schema":{"type":"string"}},{"name":"district","in":"query","required":false,"description":"Filter, for air-quality: A municipality's district (MDB code) (e.g. DC31); ward-boundaries: MDB code of the district (or metro) (e.g. DC12)","schema":{"type":"string"}},{"name":"province","in":"query","required":false,"description":"Filter, for air-quality: Province code, ISO 3166-2 (e.g. ZA-MP); dam-levels: Province code, ISO 3166-2 (e.g. ZA-WC); dam-surface-from-space: Province code, ISO 3166-2 (e.g. ZA-WC); drought-index: Province code, ISO 3166-2 (e.g. ZA-WC); fuel-prices: Province code, ISO 3166-2 (e.g. ZA-GP); fuel-zone-lookup: Province code, ISO 3166-2 (e.g. ZA-WC); greenness-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); heat-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); land-and-population-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); night-light-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); surface-water-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); toll-tariffs: Province, by name (from OpenStreetMap) (e.g. KwaZulu-Natal); ward-boundaries: Province code, ISO 3166-2 (e.g. ZA-WC); water-quality: Province code, ISO 3166-2 (e.g. ZA-EC); weather-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); wildfire-history: Province code, ISO 3166-2 (e.g. ZA-WC)","schema":{"type":"string"}},{"name":"year","in":"query","required":false,"description":"Filter, for air-quality: The calendar year (e.g. 2024); drought-index: The calendar year (e.g. 2017); greenness-by-ward: year records: the calendar year (e.g. 2026); weather-by-ward: year records: the calendar year (e.g. 2025); wildfire-history: The calendar year (e.g. 2017)","schema":{"type":"string"}},{"name":"station","in":"query","required":false,"description":"Filter, for dam-levels: DWS station code of a dam (e.g. D3R002); dam-surface-from-space: DWS station code of a dam (as dam-levels) (e.g. H6R001)","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Filter, for dam-levels: ZA, or LS and SZ for the Lesotho and Eswatini dams (e.g. ZA)","schema":{"type":"string"}},{"name":"river","in":"query","required":false,"description":"Filter, for dam-levels: River, as DWS names it (e.g. Orange River)","schema":{"type":"string"}},{"name":"municipality","in":"query","required":false,"description":"Filter, for drought-index: A ward's municipality (MDB code) (e.g. CPT); greenness-by-ward: A ward's municipality (MDB code) (e.g. CPT); heat-by-ward: A ward's municipality (MDB code) (e.g. CPT); land-and-population-by-ward: A ward's municipality (MDB code) (e.g. CPT); night-light-by-ward: A ward's municipality (MDB code) (e.g. CPT); surface-water-by-ward: A ward's municipality (MDB code) (e.g. CPT); ward-boundaries: MDB code of the local or metropolitan municipality (e.g. CPT); water-quality: MDB code of the water services authority (a municipality, metro or district) (e.g. BUF); weather-by-ward: A ward's municipality (MDB code) (e.g. CPT); wildfire-history: A ward's municipality (MDB code) (e.g. WC048)","schema":{"type":"string"}},{"name":"distributor","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal Demarcation Board code of the distributor (e.g. CPT)","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Filter, for electricity-tariffs: Tariff category: residential, commercial, large_power, embedded_generation, wheeling, generator or public_lighting (e.g. residential)","schema":{"type":"string"}},{"name":"financial_year","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal financial year (e.g. 2026/27)","schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"description":"Filter, for exchange-rates: USD, GBP, EUR or JPY (e.g. USD)","schema":{"type":"string"}},{"name":"zone","in":"query","required":false,"description":"Filter, for fuel-prices: Magisterial District Zone (fuel-pricing zone) code, as the schedules print it; fuel-zone-lookup finds a town's zone (e.g. 9C); fuel-zone-lookup: Magisterial District Zone (fuel-pricing zone) code (e.g. 1A)","schema":{"type":"string"}},{"name":"product","in":"query","required":false,"description":"Filter, for fuel-prices: petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, diesel_500ppm, diesel_50ppm, illuminating_paraffin, lpg or lpg_saldanha_bay (e.g. diesel_50ppm)","schema":{"type":"string"}},{"name":"gazette","in":"query","required":false,"description":"Filter, for gazette-index: Government Gazette number (e.g. 55679)","schema":{"type":"string"}},{"name":"department","in":"query","required":false,"description":"Filter, for gazette-index: Who published it: a notice's printed heading, else GPW's file label read into a department's name (e.g. Forestry, Fisheries and the Environment)","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"Filter, for gazette-index: act, regulation, notice, draft for comment, proclamation, board notice, or not read (e.g. draft for comment); greenness-by-ward: year (twelve months) or normals (1984 to 2020) (e.g. normals); land-and-population-by-ward: profile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled) (e.g. population); weather-by-ward: year (twelve months), days (a month day by day) or normals (1991 to 2020) (e.g. normals)","schema":{"type":"string"}},{"name":"notice","in":"query","required":false,"description":"Filter, for gazette-index: The notice number as printed (e.g. R. 8127)","schema":{"type":"string"}},{"name":"rate","in":"query","required":false,"description":"Filter, for reference-rates: policy_rate (the repo rate), prime_lending_rate, prescribed_rate, or a National Credit Act maximum (nca_max_…) (e.g. prime_lending_rate)","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Filter, for toll-tariffs: National route: N1, N2, N3, N4, N17, or R30/R730/R34 (e.g. N3)","schema":{"type":"string"}},{"name":"plaza","in":"query","required":false,"description":"Filter, for toll-tariffs: Toll plaza, as the gazette names it (e.g. Mooi)","schema":{"type":"string"}},{"name":"point","in":"query","required":false,"description":"Filter, for toll-tariffs: mainline, or a ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w (e.g. mainline)","schema":{"type":"string"}},{"name":"operator","in":"query","required":false,"description":"Filter, for toll-tariffs: SANRAL, or the concessionaire: Bakwena, N3TC or TRAC (e.g. N3TC)","schema":{"type":"string"}},{"name":"tariff_year","in":"query","required":false,"description":"Filter, for toll-tariffs: Tariff year, from 1 March (e.g. 2026/27)","schema":{"type":"string"}},{"name":"council","in":"query","required":false,"description":"Filter, for wage-tables: MIBCO, NBCRFLI, NBCPSS, BCCEI, or NMW and SD1/SD9 for the national minimum wage and sectoral determinations (e.g. MIBCO)","schema":{"type":"string"}},{"name":"instrument","in":"query","required":false,"description":"Filter, for wage-tables: bargaining_council_agreement, sectoral_determination or national_minimum_wage (e.g. bargaining_council_agreement)","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter, for wage-tables: wage or levy (e.g. wage)","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter, for wage-tables: in_force, expired or upcoming on the release date (e.g. in_force)","schema":{"type":"string"}},{"name":"area","in":"query","required":false,"description":"Filter, for wage-tables: Area as the gazette names it (e.g. Area 1)","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Filter, for ward-boundaries: Demarcation cycle: the local government election the boundaries were drawn for (e.g. 2026)","schema":{"type":"string"}},{"name":"programme","in":"query","required":false,"description":"Filter, for water-quality: blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses) (e.g. blue_drop)","schema":{"type":"string"}},{"name":"assessment","in":"query","required":false,"description":"Filter, for water-quality: blue_drop_2023, blue_drop_risk_2024, green_drop_2024 or no_drop_risk_2025 (e.g. green_drop_2024)","schema":{"type":"string"}},{"name":"risk","in":"query","required":false,"description":"Filter, for water-quality: low, medium, high or critical (e.g. critical)","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"Filter, for weather-by-ward: days records: yyyy-mm (e.g. 2026-10)","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"json (the default), csv, or xlsx (an Excel workbook with a Read me sheet); or add .csv or .xlsx to the path","schema":{"type":"string","enum":["json","csv","xlsx"]}},{"name":"changed_in","in":"query","required":false,"description":"Only the records this release added or changed, as they were in it (a version from /releases)","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Records per page (JSON up to 100, CSV up to 1,000)","schema":{"type":"integer","minimum":1}},{"name":"cursor","in":"query","required":false,"description":"From the previous page's next link; stays on the release it started on","schema":{"type":"string"}},{"name":"key","in":"query","required":false,"description":"Your key, for CSV only (spreadsheets that can't send headers)","schema":{"type":"string"}},{"name":"as_at","in":"query","required":false,"description":"What we published then: a date (YYYY-MM-DD, the end of that day in South Africa) or a time; the release live at that moment answers. Not with changed_in","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"include=facts: each record gains _facts, the facts behind it (address, value, unit, when it applied, when we knew it). JSON only","schema":{"type":"string","enum":["facts"]}}],"security":[{"bearer":[]},{"keyInQuery":[]}],"responses":{"200":{"description":"A page of records","headers":{"X-Daily-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","properties":{"dataset":{"type":"string"},"version":{"type":"string"},"count":{"type":"integer"},"offset":{"type":"integer"},"returned":{"type":"integer"},"records":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/AirQuality"},{"$ref":"#/components/schemas/DamLevels"},{"$ref":"#/components/schemas/DamSurfaceFromSpace"},{"$ref":"#/components/schemas/DroughtIndex"},{"$ref":"#/components/schemas/ElectricityTariffs"},{"$ref":"#/components/schemas/ExchangeRates"},{"$ref":"#/components/schemas/FuelPrices"},{"$ref":"#/components/schemas/FuelZoneLookup"},{"$ref":"#/components/schemas/GazetteIndex"},{"$ref":"#/components/schemas/GreennessByWard"},{"$ref":"#/components/schemas/HeatByWard"},{"$ref":"#/components/schemas/LandAndPopulationByWard"},{"$ref":"#/components/schemas/NightLightByWard"},{"$ref":"#/components/schemas/ReferenceRates"},{"$ref":"#/components/schemas/SchoolTerms"},{"$ref":"#/components/schemas/SocialGrants"},{"$ref":"#/components/schemas/SurfaceWaterByWard"},{"$ref":"#/components/schemas/TaxTables"},{"$ref":"#/components/schemas/TollTariffs"},{"$ref":"#/components/schemas/WageTables"},{"$ref":"#/components/schemas/WardBoundaries"},{"$ref":"#/components/schemas/WaterQuality"},{"$ref":"#/components/schemas/WeatherByWard"},{"$ref":"#/components/schemas/WildfireHistory"}]}},"next":{"type":["string","null"]}}}},"text/csv":{"schema":{"type":"string"}},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/latest":{"get":{"summary":"The newest record for each currency, rate, dam or tariff","operationId":"latestRecords","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}},{"name":"from","in":"query","required":false,"description":"Only records on or after this date (the dataset's own date field)","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Only records on or before this date","schema":{"type":"string","format":"date"}},{"name":"level","in":"query","required":false,"description":"Filter, for air-quality: municipality, district or province (2026 boundaries; no wards) (e.g. municipality); drought-index: ward, municipality, district or province (2026 boundaries) (e.g. municipality); greenness-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); heat-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); land-and-population-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); night-light-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); surface-water-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); ward-boundaries: ward, municipality or district (e.g. ward); weather-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); wildfire-history: ward, municipality, district or province (2026 boundaries) (e.g. municipality)","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"Filter, for air-quality: MDB municipality or district code, or ISO 3166-2 province code (e.g. JHB); drought-index: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); fuel-zone-lookup: Magisterial district code (e.g. BV050); greenness-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); heat-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); land-and-population-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); night-light-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); surface-water-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); ward-boundaries: MDB code of one ward, municipality or district (e.g. 19100001); weather-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); wildfire-history: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. WC048)","schema":{"type":"string"}},{"name":"district","in":"query","required":false,"description":"Filter, for air-quality: A municipality's district (MDB code) (e.g. DC31); ward-boundaries: MDB code of the district (or metro) (e.g. DC12)","schema":{"type":"string"}},{"name":"province","in":"query","required":false,"description":"Filter, for air-quality: Province code, ISO 3166-2 (e.g. ZA-MP); dam-levels: Province code, ISO 3166-2 (e.g. ZA-WC); dam-surface-from-space: Province code, ISO 3166-2 (e.g. ZA-WC); drought-index: Province code, ISO 3166-2 (e.g. ZA-WC); fuel-prices: Province code, ISO 3166-2 (e.g. ZA-GP); fuel-zone-lookup: Province code, ISO 3166-2 (e.g. ZA-WC); greenness-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); heat-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); land-and-population-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); night-light-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); surface-water-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); toll-tariffs: Province, by name (from OpenStreetMap) (e.g. KwaZulu-Natal); ward-boundaries: Province code, ISO 3166-2 (e.g. ZA-WC); water-quality: Province code, ISO 3166-2 (e.g. ZA-EC); weather-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); wildfire-history: Province code, ISO 3166-2 (e.g. ZA-WC)","schema":{"type":"string"}},{"name":"year","in":"query","required":false,"description":"Filter, for air-quality: The calendar year (e.g. 2024); drought-index: The calendar year (e.g. 2017); greenness-by-ward: year records: the calendar year (e.g. 2026); weather-by-ward: year records: the calendar year (e.g. 2025); wildfire-history: The calendar year (e.g. 2017)","schema":{"type":"string"}},{"name":"station","in":"query","required":false,"description":"Filter, for dam-levels: DWS station code of a dam (e.g. D3R002); dam-surface-from-space: DWS station code of a dam (as dam-levels) (e.g. H6R001)","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Filter, for dam-levels: ZA, or LS and SZ for the Lesotho and Eswatini dams (e.g. ZA)","schema":{"type":"string"}},{"name":"river","in":"query","required":false,"description":"Filter, for dam-levels: River, as DWS names it (e.g. Orange River)","schema":{"type":"string"}},{"name":"municipality","in":"query","required":false,"description":"Filter, for drought-index: A ward's municipality (MDB code) (e.g. CPT); greenness-by-ward: A ward's municipality (MDB code) (e.g. CPT); heat-by-ward: A ward's municipality (MDB code) (e.g. CPT); land-and-population-by-ward: A ward's municipality (MDB code) (e.g. CPT); night-light-by-ward: A ward's municipality (MDB code) (e.g. CPT); surface-water-by-ward: A ward's municipality (MDB code) (e.g. CPT); ward-boundaries: MDB code of the local or metropolitan municipality (e.g. CPT); water-quality: MDB code of the water services authority (a municipality, metro or district) (e.g. BUF); weather-by-ward: A ward's municipality (MDB code) (e.g. CPT); wildfire-history: A ward's municipality (MDB code) (e.g. WC048)","schema":{"type":"string"}},{"name":"distributor","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal Demarcation Board code of the distributor (e.g. CPT)","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Filter, for electricity-tariffs: Tariff category: residential, commercial, large_power, embedded_generation, wheeling, generator or public_lighting (e.g. residential)","schema":{"type":"string"}},{"name":"financial_year","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal financial year (e.g. 2026/27)","schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"description":"Filter, for exchange-rates: USD, GBP, EUR or JPY (e.g. USD)","schema":{"type":"string"}},{"name":"zone","in":"query","required":false,"description":"Filter, for fuel-prices: Magisterial District Zone (fuel-pricing zone) code, as the schedules print it; fuel-zone-lookup finds a town's zone (e.g. 9C); fuel-zone-lookup: Magisterial District Zone (fuel-pricing zone) code (e.g. 1A)","schema":{"type":"string"}},{"name":"product","in":"query","required":false,"description":"Filter, for fuel-prices: petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, diesel_500ppm, diesel_50ppm, illuminating_paraffin, lpg or lpg_saldanha_bay (e.g. diesel_50ppm)","schema":{"type":"string"}},{"name":"gazette","in":"query","required":false,"description":"Filter, for gazette-index: Government Gazette number (e.g. 55679)","schema":{"type":"string"}},{"name":"department","in":"query","required":false,"description":"Filter, for gazette-index: Who published it: a notice's printed heading, else GPW's file label read into a department's name (e.g. Forestry, Fisheries and the Environment)","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"Filter, for gazette-index: act, regulation, notice, draft for comment, proclamation, board notice, or not read (e.g. draft for comment); greenness-by-ward: year (twelve months) or normals (1984 to 2020) (e.g. normals); land-and-population-by-ward: profile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled) (e.g. population); weather-by-ward: year (twelve months), days (a month day by day) or normals (1991 to 2020) (e.g. normals)","schema":{"type":"string"}},{"name":"notice","in":"query","required":false,"description":"Filter, for gazette-index: The notice number as printed (e.g. R. 8127)","schema":{"type":"string"}},{"name":"rate","in":"query","required":false,"description":"Filter, for reference-rates: policy_rate (the repo rate), prime_lending_rate, prescribed_rate, or a National Credit Act maximum (nca_max_…) (e.g. prime_lending_rate)","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Filter, for toll-tariffs: National route: N1, N2, N3, N4, N17, or R30/R730/R34 (e.g. N3)","schema":{"type":"string"}},{"name":"plaza","in":"query","required":false,"description":"Filter, for toll-tariffs: Toll plaza, as the gazette names it (e.g. Mooi)","schema":{"type":"string"}},{"name":"point","in":"query","required":false,"description":"Filter, for toll-tariffs: mainline, or a ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w (e.g. mainline)","schema":{"type":"string"}},{"name":"operator","in":"query","required":false,"description":"Filter, for toll-tariffs: SANRAL, or the concessionaire: Bakwena, N3TC or TRAC (e.g. N3TC)","schema":{"type":"string"}},{"name":"tariff_year","in":"query","required":false,"description":"Filter, for toll-tariffs: Tariff year, from 1 March (e.g. 2026/27)","schema":{"type":"string"}},{"name":"council","in":"query","required":false,"description":"Filter, for wage-tables: MIBCO, NBCRFLI, NBCPSS, BCCEI, or NMW and SD1/SD9 for the national minimum wage and sectoral determinations (e.g. MIBCO)","schema":{"type":"string"}},{"name":"instrument","in":"query","required":false,"description":"Filter, for wage-tables: bargaining_council_agreement, sectoral_determination or national_minimum_wage (e.g. bargaining_council_agreement)","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter, for wage-tables: wage or levy (e.g. wage)","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter, for wage-tables: in_force, expired or upcoming on the release date (e.g. in_force)","schema":{"type":"string"}},{"name":"area","in":"query","required":false,"description":"Filter, for wage-tables: Area as the gazette names it (e.g. Area 1)","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Filter, for ward-boundaries: Demarcation cycle: the local government election the boundaries were drawn for (e.g. 2026)","schema":{"type":"string"}},{"name":"programme","in":"query","required":false,"description":"Filter, for water-quality: blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses) (e.g. blue_drop)","schema":{"type":"string"}},{"name":"assessment","in":"query","required":false,"description":"Filter, for water-quality: blue_drop_2023, blue_drop_risk_2024, green_drop_2024 or no_drop_risk_2025 (e.g. green_drop_2024)","schema":{"type":"string"}},{"name":"risk","in":"query","required":false,"description":"Filter, for water-quality: low, medium, high or critical (e.g. critical)","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"Filter, for weather-by-ward: days records: yyyy-mm (e.g. 2026-10)","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"json (the default), csv, or xlsx (an Excel workbook with a Read me sheet); or add .csv or .xlsx to the path","schema":{"type":"string","enum":["json","csv","xlsx"]}},{"name":"limit","in":"query","required":false,"description":"At most this many records (up to 500)","schema":{"type":"integer","minimum":1,"maximum":500}},{"name":"key","in":"query","required":false,"description":"Your key, for CSV only","schema":{"type":"string"}},{"name":"as_at","in":"query","required":false,"description":"What we published then: a date (YYYY-MM-DD, the end of that day in South Africa) or a time; the release live at that moment answers. Not with changed_in","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"include=facts: each record gains _facts, the facts behind it (address, value, unit, when it applied, when we knew it). JSON only","schema":{"type":"string","enum":["facts"]}}],"security":[{"bearer":[]},{"keyInQuery":[]}],"responses":{"200":{"description":"The latest records","content":{"application/json":{"schema":{"type":"object","properties":{"records":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/AirQuality"},{"$ref":"#/components/schemas/DamLevels"},{"$ref":"#/components/schemas/DamSurfaceFromSpace"},{"$ref":"#/components/schemas/DroughtIndex"},{"$ref":"#/components/schemas/ElectricityTariffs"},{"$ref":"#/components/schemas/ExchangeRates"},{"$ref":"#/components/schemas/FuelPrices"},{"$ref":"#/components/schemas/FuelZoneLookup"},{"$ref":"#/components/schemas/GazetteIndex"},{"$ref":"#/components/schemas/GreennessByWard"},{"$ref":"#/components/schemas/HeatByWard"},{"$ref":"#/components/schemas/LandAndPopulationByWard"},{"$ref":"#/components/schemas/NightLightByWard"},{"$ref":"#/components/schemas/ReferenceRates"},{"$ref":"#/components/schemas/SchoolTerms"},{"$ref":"#/components/schemas/SocialGrants"},{"$ref":"#/components/schemas/SurfaceWaterByWard"},{"$ref":"#/components/schemas/TaxTables"},{"$ref":"#/components/schemas/TollTariffs"},{"$ref":"#/components/schemas/WageTables"},{"$ref":"#/components/schemas/WardBoundaries"},{"$ref":"#/components/schemas/WaterQuality"},{"$ref":"#/components/schemas/WeatherByWard"},{"$ref":"#/components/schemas/WildfireHistory"}]}}}}},"text/csv":{"schema":{"type":"string"}}}},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/facts/{uid}":{"get":{"summary":"One fact by its permanent address (um:fact:{uid}): the figure, its unit, when it applied and when we knew it, its instrument and place, its document and page, how it was read or worked out, and what replaced it","operationId":"getFact","parameters":[{"name":"uid","in":"path","required":true,"description":"The fact's uid, or its whole address um:fact:{uid}","schema":{"type":"string"}}],"responses":{"200":{"description":"The fact","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such fact","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"410":{"description":"The fact is no longer published; the message says why","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/releases":{"get":{"summary":"What changed in each release: the changelog, with each release's SHA-256 fingerprint","operationId":"listReleases","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}}],"responses":{"200":{"description":"Releases, newest first. sha256 is one SHA-256 over every record of the release in order, a line each: the record id, a tab, the record as compact JSON, a newline (null until it is taken); sealed_at is when it was taken"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/snapshots":{"get":{"summary":"The Parquet snapshots of the dataset's full history: every record each release held (with the releases it ran between) and the facts they cite, each with its size, sha256 and licence","operationId":"listSnapshots","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}}],"responses":{"200":{"description":"The files. The same list, without download addresses, is public at https://unmapped.co.za/open/snapshots.json"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/snapshots/{file}":{"get":{"summary":"One snapshot file (Parquet, zstd). Check it against the public sha256 at https://unmapped.co.za/open/snapshots/{file}.sha256","operationId":"getSnapshot","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}},{"name":"file","in":"path","required":true,"description":"A file name from /snapshots, such as fuel-prices-2026-11-04-records.parquet","schema":{"type":"string"}}],"responses":{"200":{"description":"The file","content":{"application/vnd.apache.parquet":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/datasets/{id}/records.geojson":{"get":{"summary":"Records with their shapes, as a GeoJSON FeatureCollection (datasets with shapes: ward-boundaries)","operationId":"listRecordsGeoJSON","parameters":[{"name":"id","in":"path","required":true,"description":"Dataset id","schema":{"type":"string","enum":["air-quality","dam-levels","dam-surface-from-space","drought-index","electricity-tariffs","exchange-rates","fuel-prices","fuel-zone-lookup","gazette-index","greenness-by-ward","heat-by-ward","land-and-population-by-ward","night-light-by-ward","reference-rates","school-terms","social-grants","surface-water-by-ward","tax-tables","toll-tariffs","wage-tables","ward-boundaries","water-quality","weather-by-ward","wildfire-history"]}},{"name":"from","in":"query","required":false,"description":"Only records on or after this date (the dataset's own date field)","schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":false,"description":"Only records on or before this date","schema":{"type":"string","format":"date"}},{"name":"level","in":"query","required":false,"description":"Filter, for air-quality: municipality, district or province (2026 boundaries; no wards) (e.g. municipality); drought-index: ward, municipality, district or province (2026 boundaries) (e.g. municipality); greenness-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); heat-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); land-and-population-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); night-light-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); surface-water-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); ward-boundaries: ward, municipality or district (e.g. ward); weather-by-ward: ward, municipality, district or province (2026 boundaries) (e.g. municipality); wildfire-history: ward, municipality, district or province (2026 boundaries) (e.g. municipality)","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"Filter, for air-quality: MDB municipality or district code, or ISO 3166-2 province code (e.g. JHB); drought-index: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); fuel-zone-lookup: Magisterial district code (e.g. BV050); greenness-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); heat-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); land-and-population-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); night-light-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); surface-water-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); ward-boundaries: MDB code of one ward, municipality or district (e.g. 19100001); weather-by-ward: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. CPT); wildfire-history: MDB ward, municipality or district code, or ISO 3166-2 province code (e.g. WC048)","schema":{"type":"string"}},{"name":"district","in":"query","required":false,"description":"Filter, for air-quality: A municipality's district (MDB code) (e.g. DC31); ward-boundaries: MDB code of the district (or metro) (e.g. DC12)","schema":{"type":"string"}},{"name":"province","in":"query","required":false,"description":"Filter, for air-quality: Province code, ISO 3166-2 (e.g. ZA-MP); dam-levels: Province code, ISO 3166-2 (e.g. ZA-WC); dam-surface-from-space: Province code, ISO 3166-2 (e.g. ZA-WC); drought-index: Province code, ISO 3166-2 (e.g. ZA-WC); fuel-prices: Province code, ISO 3166-2 (e.g. ZA-GP); fuel-zone-lookup: Province code, ISO 3166-2 (e.g. ZA-WC); greenness-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); heat-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); land-and-population-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); night-light-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); surface-water-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); toll-tariffs: Province, by name (from OpenStreetMap) (e.g. KwaZulu-Natal); ward-boundaries: Province code, ISO 3166-2 (e.g. ZA-WC); water-quality: Province code, ISO 3166-2 (e.g. ZA-EC); weather-by-ward: Province code, ISO 3166-2 (e.g. ZA-WC); wildfire-history: Province code, ISO 3166-2 (e.g. ZA-WC)","schema":{"type":"string"}},{"name":"year","in":"query","required":false,"description":"Filter, for air-quality: The calendar year (e.g. 2024); drought-index: The calendar year (e.g. 2017); greenness-by-ward: year records: the calendar year (e.g. 2026); weather-by-ward: year records: the calendar year (e.g. 2025); wildfire-history: The calendar year (e.g. 2017)","schema":{"type":"string"}},{"name":"station","in":"query","required":false,"description":"Filter, for dam-levels: DWS station code of a dam (e.g. D3R002); dam-surface-from-space: DWS station code of a dam (as dam-levels) (e.g. H6R001)","schema":{"type":"string"}},{"name":"country","in":"query","required":false,"description":"Filter, for dam-levels: ZA, or LS and SZ for the Lesotho and Eswatini dams (e.g. ZA)","schema":{"type":"string"}},{"name":"river","in":"query","required":false,"description":"Filter, for dam-levels: River, as DWS names it (e.g. Orange River)","schema":{"type":"string"}},{"name":"municipality","in":"query","required":false,"description":"Filter, for drought-index: A ward's municipality (MDB code) (e.g. CPT); greenness-by-ward: A ward's municipality (MDB code) (e.g. CPT); heat-by-ward: A ward's municipality (MDB code) (e.g. CPT); land-and-population-by-ward: A ward's municipality (MDB code) (e.g. CPT); night-light-by-ward: A ward's municipality (MDB code) (e.g. CPT); surface-water-by-ward: A ward's municipality (MDB code) (e.g. CPT); ward-boundaries: MDB code of the local or metropolitan municipality (e.g. CPT); water-quality: MDB code of the water services authority (a municipality, metro or district) (e.g. BUF); weather-by-ward: A ward's municipality (MDB code) (e.g. CPT); wildfire-history: A ward's municipality (MDB code) (e.g. WC048)","schema":{"type":"string"}},{"name":"distributor","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal Demarcation Board code of the distributor (e.g. CPT)","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Filter, for electricity-tariffs: Tariff category: residential, commercial, large_power, embedded_generation, wheeling, generator or public_lighting (e.g. residential)","schema":{"type":"string"}},{"name":"financial_year","in":"query","required":false,"description":"Filter, for electricity-tariffs: Municipal financial year (e.g. 2026/27)","schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"description":"Filter, for exchange-rates: USD, GBP, EUR or JPY (e.g. USD)","schema":{"type":"string"}},{"name":"zone","in":"query","required":false,"description":"Filter, for fuel-prices: Magisterial District Zone (fuel-pricing zone) code, as the schedules print it; fuel-zone-lookup finds a town's zone (e.g. 9C); fuel-zone-lookup: Magisterial District Zone (fuel-pricing zone) code (e.g. 1A)","schema":{"type":"string"}},{"name":"product","in":"query","required":false,"description":"Filter, for fuel-prices: petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, diesel_500ppm, diesel_50ppm, illuminating_paraffin, lpg or lpg_saldanha_bay (e.g. diesel_50ppm)","schema":{"type":"string"}},{"name":"gazette","in":"query","required":false,"description":"Filter, for gazette-index: Government Gazette number (e.g. 55679)","schema":{"type":"string"}},{"name":"department","in":"query","required":false,"description":"Filter, for gazette-index: Who published it: a notice's printed heading, else GPW's file label read into a department's name (e.g. Forestry, Fisheries and the Environment)","schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"description":"Filter, for gazette-index: act, regulation, notice, draft for comment, proclamation, board notice, or not read (e.g. draft for comment); greenness-by-ward: year (twelve months) or normals (1984 to 2020) (e.g. normals); land-and-population-by-ward: profile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled) (e.g. population); weather-by-ward: year (twelve months), days (a month day by day) or normals (1991 to 2020) (e.g. normals)","schema":{"type":"string"}},{"name":"notice","in":"query","required":false,"description":"Filter, for gazette-index: The notice number as printed (e.g. R. 8127)","schema":{"type":"string"}},{"name":"rate","in":"query","required":false,"description":"Filter, for reference-rates: policy_rate (the repo rate), prime_lending_rate, prescribed_rate, or a National Credit Act maximum (nca_max_…) (e.g. prime_lending_rate)","schema":{"type":"string"}},{"name":"route","in":"query","required":false,"description":"Filter, for toll-tariffs: National route: N1, N2, N3, N4, N17, or R30/R730/R34 (e.g. N3)","schema":{"type":"string"}},{"name":"plaza","in":"query","required":false,"description":"Filter, for toll-tariffs: Toll plaza, as the gazette names it (e.g. Mooi)","schema":{"type":"string"}},{"name":"point","in":"query","required":false,"description":"Filter, for toll-tariffs: mainline, or a ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w (e.g. mainline)","schema":{"type":"string"}},{"name":"operator","in":"query","required":false,"description":"Filter, for toll-tariffs: SANRAL, or the concessionaire: Bakwena, N3TC or TRAC (e.g. N3TC)","schema":{"type":"string"}},{"name":"tariff_year","in":"query","required":false,"description":"Filter, for toll-tariffs: Tariff year, from 1 March (e.g. 2026/27)","schema":{"type":"string"}},{"name":"council","in":"query","required":false,"description":"Filter, for wage-tables: MIBCO, NBCRFLI, NBCPSS, BCCEI, or NMW and SD1/SD9 for the national minimum wage and sectoral determinations (e.g. MIBCO)","schema":{"type":"string"}},{"name":"instrument","in":"query","required":false,"description":"Filter, for wage-tables: bargaining_council_agreement, sectoral_determination or national_minimum_wage (e.g. bargaining_council_agreement)","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Filter, for wage-tables: wage or levy (e.g. wage)","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Filter, for wage-tables: in_force, expired or upcoming on the release date (e.g. in_force)","schema":{"type":"string"}},{"name":"area","in":"query","required":false,"description":"Filter, for wage-tables: Area as the gazette names it (e.g. Area 1)","schema":{"type":"string"}},{"name":"cycle","in":"query","required":false,"description":"Filter, for ward-boundaries: Demarcation cycle: the local government election the boundaries were drawn for (e.g. 2026)","schema":{"type":"string"}},{"name":"programme","in":"query","required":false,"description":"Filter, for water-quality: blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses) (e.g. blue_drop)","schema":{"type":"string"}},{"name":"assessment","in":"query","required":false,"description":"Filter, for water-quality: blue_drop_2023, blue_drop_risk_2024, green_drop_2024 or no_drop_risk_2025 (e.g. green_drop_2024)","schema":{"type":"string"}},{"name":"risk","in":"query","required":false,"description":"Filter, for water-quality: low, medium, high or critical (e.g. critical)","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"Filter, for weather-by-ward: days records: yyyy-mm (e.g. 2026-10)","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Features per page (up to 25)","schema":{"type":"integer","minimum":1,"maximum":25}},{"name":"cursor","in":"query","required":false,"description":"From the previous page's next link","schema":{"type":"string"}},{"name":"key","in":"query","required":false,"description":"Your key, in the address, for web maps that can't send headers","schema":{"type":"string"}}],"security":[{"bearer":[]},{"keyInQuery":[]}],"responses":{"200":{"description":"A page of features","content":{"application/geo+json":{"schema":{"type":"object"}}}},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/lookup":{"get":{"summary":"The ward, municipality, district and province at a point","operationId":"lookup","description":"From the Municipal Demarcation Board's boundaries (ward-boundaries, which must be switched on): for the boundaries in force on the date, and before an election that brings in new wards, the ward under those too (next). Free to use with acknowledgement of the MDB; not to be sold.","parameters":[{"name":"lat","in":"query","required":false,"description":"Latitude, decimal degrees (negative: south)","schema":{"type":"number","minimum":-35,"maximum":-22}},{"name":"lon","in":"query","required":false,"description":"Longitude, decimal degrees","schema":{"type":"number","minimum":16,"maximum":33.5}},{"name":"date","in":"query","required":false,"description":"The boundaries in force on this date; today if left out","schema":{"type":"string","format":"date"}},{"name":"cycle","in":"query","required":false,"description":"One demarcation cycle instead of a date","schema":{"type":"string","enum":["2021","2026"]}}],"responses":{"200":{"description":"Where the point is"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"The point isn't in a South African ward (at sea, or across a border)"},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/here":{"get":{"summary":"Everything at a point: the Here page in one call","operationId":"here","description":"For a point (lat and lon) or an address (found in OpenStreetMap as the site's search finds it): the ward and municipality (and the ward before the boundaries changed), weather (with how coarse its 9 km grid is here), the fuel zone and petrol prices, who sells electricity and a typical bill, tap water systems, the nearest dams and toll plazas, what changes next, and the municipality's other figures, each with its source and release. Needs ward-boundaries switched on; counts as one record.","parameters":[{"name":"lat","in":"query","required":false,"description":"Latitude in decimal degrees, e.g. -33.9249","schema":{"type":"number"}},{"name":"lon","in":"query","required":false,"description":"Longitude in decimal degrees, e.g. 18.4241 (lng also works)","schema":{"type":"number"}},{"name":"address","in":"query","required":false,"description":"Instead of lat and lon: a street address or place, e.g. \"12 Plattekloof Road, Plattekloof\"","schema":{"type":"string"}}],"responses":{"200":{"description":"The point, its ward, and each section with source and release"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such address, or a point in no ward"},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/conditions":{"get":{"summary":"A place's conditions sheet for a month","operationId":"conditions","description":"For a 2026 ward, municipality, district or province: the month's rain and hottest day against normal (weather-by-ward), greenness against normal (greenness-by-ward), the drought class (drought-index), fire detections and hectares burnt (wildfire-history) and the year's surface water against its 1991 to 2020 average (surface-water-by-ward), built only from live releases. Each figure carries its record (dataset, record id, release and its API address); a field we do not hold (the dams that supply the place, air) is a gap with the reason. The month defaults to the newest whole month of rain. Needs ward-boundaries switched on; counts as one record.","parameters":[{"name":"level","in":"query","required":false,"description":"ward (default), municipality, district or province","schema":{"type":"string"}},{"name":"code","in":"query","required":false,"description":"MDB ward, municipality or district code, or ISO 3166-2 province code, e.g. 19100057, CPT, ZA-WC","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"yyyy-mm, e.g. 2026-10","schema":{"type":"string"}}],"responses":{"200":{"description":"The place, the month, a one-line summary and each field with its record or its gap"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such place, or no weather for that month"},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/bill":{"get":{"summary":"A month's electricity bill on a tariff, or on each of a distributor's tariffs","operationId":"bill","description":"Prices every charge of a tariff in the electricity-tariffs dataset (which must be switched on): blocks, time-of-use periods by season, fixed and demand charges, and VAT where the decision excludes it. Where a decision or gazette doesn't say whether its rates include VAT, the default (vat=source) assumes they exclude it and adds 15%, and the bill says so in vat_flag (\"VAT not stated by the source: assumed excluded and added at 15%\") and vat_basis. Charges it can't price from the usage given are listed under skipped, not guessed. With distributor instead of tariff, every tariff in the category is priced, cheapest complete bill first; household tariffs only some households qualify for (indigent, lifeline, pensioners and the like) come after the rest, marked qualifying, and are never the cheapest. POST takes the same fields as JSON, plus hourly profiles and solar.","parameters":[{"name":"tariff","in":"query","required":false,"description":"A tariff id, e.g. za-cpt-residential-domestic-2026-27","schema":{"type":"string"}},{"name":"distributor","in":"query","required":false,"description":"Instead of tariff: a distributor code (CPT, WC043…)","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"With distributor: residential (default), commercial, large_power, agricultural, embedded_generation, other","schema":{"type":"string"}},{"name":"month","in":"query","required":false,"description":"The month to price, YYYY-MM (sets the season); this month if left out","schema":{"type":"string"}},{"name":"kwh","in":"query","required":false,"description":"kWh used in the month","schema":{"type":"number","minimum":0}},{"name":"peak","in":"query","required":false,"description":"kWh in peak hours, for time-of-use tariffs","schema":{"type":"number","minimum":0}},{"name":"standard","in":"query","required":false,"description":"kWh in standard hours","schema":{"type":"number","minimum":0}},{"name":"off_peak","in":"query","required":false,"description":"kWh in off-peak hours","schema":{"type":"number","minimum":0}},{"name":"demand_kva","in":"query","required":false,"description":"Maximum demand in the month (kVA)","schema":{"type":"number","minimum":0}},{"name":"nmd_kva","in":"query","required":false,"description":"Notified maximum demand (kVA)","schema":{"type":"number","minimum":0}},{"name":"amps","in":"query","required":false,"description":"Supply size (A per phase), for charges per amp","schema":{"type":"number","minimum":0}},{"name":"phases","in":"query","required":false,"description":"Phases (1 or 3), for charges per phase","schema":{"type":"integer","enum":[1,3]}},{"name":"export_kwh","in":"query","required":false,"description":"kWh exported, credited at feed-in rates","schema":{"type":"number","minimum":0}},{"name":"meter","in":"query","required":false,"description":"prepaid or conventional (default conventional)","schema":{"type":"string","enum":["prepaid","conventional"]}},{"name":"vat","in":"query","required":false,"description":"source (default): follow the decision, assuming VAT excluded where it doesn't say (flagged in vat_flag); included or excluded: treat the printed rates that way; true is the same as source; false leaves VAT out","schema":{"type":"string","enum":["source","included","excluded","true","false"]}}],"responses":{"200":{"description":"The bill, line by line, with totals before and after VAT"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No such tariff, or no tariffs for the distributor in that category"},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"summary":"A month's electricity bill from hourly profiles, with or without solar","operationId":"billFromProfiles","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"tariff":{"type":"string"},"export_tariff":{"type":"string","description":"An embedded generation tariff whose feed-in rates credit exports"},"distributor":{"type":"string"},"category":{"type":"string"},"month":{"type":"string","pattern":"^20\\d\\d-\\d\\d$"},"meter":{"type":"string","enum":["prepaid","conventional"]},"vat":{"description":"source (default), included, excluded, true (= source) or false (VAT left out)","oneOf":[{"type":"string","enum":["source","included","excluded"]},{"type":"boolean"}]},"usage":{"type":"object","description":"kwh, by_period {peak, standard, off_peak}, profile (24 hourly kWh, or {weekday, saturday, sunday}), demand_kva, nmd_kva, amps, kvarh, export_kwh"},"solar":{"description":"Hourly solar generation, shaped like usage.profile; the answer has the bill before and after, and the saving"}}}}}},"responses":{"200":{"description":"The bill, or the bills before and after solar"},"400":{"description":"A parameter isn't valid; the message says which","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No key, or not a valid one","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"A paid dataset not bought","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The dataset isn't switched on for the account, or the terms aren't accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"The dataset has no records yet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests a minute, or the daily records limit is used up","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/status":{"get":{"summary":"Each live dataset's freshness: target, last check, last change, release, records, on time or late","operationId":"siteStatus","servers":[{"url":"https://unmapped.co.za/api","description":"The site, no key"}],"security":[],"responses":{"200":{"description":"{ at, datasets: [...] }"}}}},"/search":{"get":{"summary":"The answer to a question about a place, an address or a number, with its source, release, history and its own address (/answer/...)","operationId":"siteSearch","servers":[{"url":"https://unmapped.co.za/api","description":"The site, no key"}],"security":[],"parameters":[{"name":"q","in":"query","required":true,"description":"The question, e.g. petrol 95 cape town","schema":{"type":"string"}},{"name":"on","in":"query","required":false,"description":"The answer as at this date (YYYY-MM-DD)","schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"{ q, on, read, answer, also, others, which_one, held }"}}}},"/search/suggest":{"get":{"summary":"While typing: numbers with their figures, places, and streets and towns from OpenStreetMap (ODbL, with attribution)","operationId":"siteSuggest","servers":[{"url":"https://unmapped.co.za/api","description":"The site, no key"}],"security":[],"parameters":[{"name":"q","in":"query","required":true,"description":"What has been typed","schema":{"type":"string"}}],"responses":{"200":{"description":"{ q, numbers, streets, attribution, places }"},"429":{"description":"Too many a minute from one address"}}}},"/take-home-pay":{"get":{"summary":"Take-home pay for a tax year: PAYE, UIF and net pay, every step with the Act, section and Gazette page of its figures (our calculation from the gazetted tables, not SARS's)","operationId":"siteTakeHomePay","servers":[{"url":"https://unmapped.co.za/api","description":"The site, no key"}],"security":[],"parameters":[{"name":"pay","in":"query","required":true,"description":"Gross pay in rand","schema":{"type":"number"}},{"name":"period","in":"query","required":false,"description":"month (default) or year","schema":{"type":"string"}},{"name":"age","in":"query","required":false,"description":"under65 (default), 65to74 or 75plus","schema":{"type":"string"}},{"name":"medical","in":"query","required":false,"description":"People on the medical scheme, the employee included (default 0)","schema":{"type":"integer"}},{"name":"year","in":"query","required":false,"description":"The tax year, named by the year it ends (2026 is 1 March 2025 to 28 February 2026); default the newest held","schema":{"type":"string"}}],"responses":{"200":{"description":"{ dataset, release, year, starts, ends, input, steps, monthly, annual, incomplete, address, note }"},"400":{"description":"A value it cannot use, said in words"},"404":{"description":"A tax year not held"}}}},"/search/documents":{"get":{"summary":"Full-text search of the Government Gazette issues and NERSA decisions we hold, to the page","operationId":"siteDocumentSearch","servers":[{"url":"https://unmapped.co.za/api","description":"The site, no key"}],"security":[],"parameters":[{"name":"q","in":"query","required":true,"description":"A phrase, or words with mode=words","schema":{"type":"string"}},{"name":"mode","in":"query","required":false,"description":"words: the words in any order","schema":{"type":"string","enum":["words"]}},{"name":"offset","in":"query","required":false,"description":"Skip this many results (10 a page)","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"{ q, mode, total, offset, per_page, results: [{ document, page, snippet, ... }] }"}}}}},"webhooks":{"datasetReleased":{"post":{"summary":"A dataset you chose has a new release","description":"Signed: Unmapped-Signature is t=<unix time>,v1=<HMAC-SHA256 of \"t.body\" with your secret, hex>. Answer 2xx within 10 seconds; failures are retried for about two days. https://unmapped.co.za/docs/staying-current#webhooks","parameters":[{"name":"Unmapped-Event","in":"header","required":true,"schema":{"type":"string"}},{"name":"Unmapped-Event-Id","in":"header","required":true,"schema":{"type":"string"}},{"name":"Unmapped-Delivery","in":"header","required":true,"schema":{"type":"string"}},{"name":"Unmapped-Signature","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseEvent"}}}},"responses":{"200":{"description":"Any 2xx: received"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Your key from app.unmapped.co.za: Authorization: Bearer um_live_…"},"keyInQuery":{"type":"apiKey","in":"query","name":"key","description":"CSV only, for spreadsheets. Use a key made for the purpose; revoke it if the link is shared."}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}},"ReleaseEvent":{"type":"object","properties":{"id":{"type":"string","description":"The event: the same on every retry"},"type":{"type":"string","enum":["dataset.released","ping"]},"created_at":{"type":"string","format":"date-time"},"data":{"type":"object","properties":{"dataset":{"type":"string"},"name":{"type":"string"},"version":{"type":"string"},"previous_version":{"type":["string","null"]},"released_at":{"type":"string","format":"date-time"},"note":{"type":["string","null"]},"record_count":{"type":"integer"},"added":{"type":"integer"},"changed":{"type":"integer"},"removed":{"type":"integer"},"changed_ids":{"type":"array","items":{"type":"string"},"description":"Up to 1,000"},"removed_ids":{"type":"array","items":{"type":"string"},"description":"Up to 1,000"},"ids_truncated":{"type":"boolean"},"changes_url":{"type":"string","format":"uri","description":"The records this release added or changed"},"releases_url":{"type":"string","format":"uri"}}}}},"AirQuality":{"type":"object","title":"Air quality by municipality","description":"One record per 2026 place (municipality, district or province) and year (twelve months)","properties":{"id":{"type":"string","description":"level-code-year: municipality-MP312-2024, province-ZA-GP-2010"},"kind":{"type":"string","description":"year (twelve months)"},"level":{"type":"string","description":"municipality, district or province (2026 MDB boundaries); no wards: the model's cells are about 80 km"},"code":{"type":"string","description":"MDB municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"district_code":{"type":"string","description":"A municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"year":{"type":"integer","description":"The calendar year"},"no2":{"type":"array","description":"Each month's mean nitrogen dioxide near the ground (the model's lowest level, about 10 m up), micrograms per m3, modelled (CAMS EAC4), averaged over the place by area"},"o3":{"type":"array","description":"The same for ozone"},"no2_col":{"type":"array","description":"Each month's nitrogen dioxide in the whole column of air above the ground, micromol per m2, modelled (the quantity Sentinel-5P observes); not what you breathe"},"so2_col":{"type":"array","description":"The same for sulphur dioxide"},"annual_no2":{"type":"number","description":"The year's mean NO2 near the ground (only when all twelve months are there)"},"who_no2_times":{"type":"number","description":"annual_no2 as a multiple of WHO's 2021 annual guideline value for NO2 (10 micrograms per m3); a modelled regional mean, not a reading at any address"},"modelled":{"type":"boolean","description":"Always true: these are model figures, not ground measurements"},"source":{"type":"string","description":"The product and licence"}}},"DamLevels":{"type":"object","title":"Dam levels with full history","description":"One record per dam, per weekly State of Dams report","properties":{"id":{"type":"string","description":"Station code and report date (D3R002-2026-10-26)"},"station":{"type":"string","description":"The Department of Water and Sanitation's station code for the dam; stable from week to week"},"dam":{"type":"string","description":"Dam name as DWS gives it"},"river":{"type":"string","description":"River the dam is on"},"country":{"type":"string","description":"ZA, or LS and SZ for the Lesotho and Eswatini dams that supply South Africa"},"provinces":{"type":"array","description":"Province codes, ISO 3166-2 (ZA-FS); two where a dam sits on a provincial border"},"report_date":{"type":"string","format":"date","description":"Date of the weekly report"},"full_supply_capacity":{"type":"number","description":"Full supply capacity, in million cubic metres"},"percent_full":{"type":"number","description":"Storage as a % of full supply capacity this week; above 100 when the dam is over full supply"},"percent_full_last_week":{"type":"number","description":"The same, a week earlier"},"percent_full_last_year":{"type":"number","description":"The same, a year earlier"},"volume":{"type":"number","description":"Water stored, in million cubic metres: capacity × % full, worked out by us"},"flags":{"type":"array","description":"not_this_week (DWS shows its latest available reading, not this week's) and above_full_supply"},"source":{"type":"object","description":"Publisher, report and the DWS page the figures come from"}}},"DamSurfaceFromSpace":{"type":"object","title":"Dams from space","description":"One record per DWS dam station: its full-supply outline, each month's water area seen from space, its crops and the comparison with DWS","properties":{"id":{"type":"string","description":"The DWS station code (as dam-levels): one record per station"},"station":{"type":"string","description":"DWS station code"},"dam":{"type":"string","description":"The dam's name as DWS prints it"},"river":{"type":"string","description":"The river, as DWS prints it"},"country":{"type":"string","description":"ZA, LS (Lesotho) or SZ (Eswatini)"},"provinces":{"type":"array","description":"ISO 3166-2 province codes, as dam-levels"},"outline":{"description":"The full area and the outline: km2 (the full area every % is measured against), source 'deafrica' (since 12 Nov 2026: Digital Earth Africa's Water Observations from Space all-time summary, the ground seen under water in at least 10% of clear Landsat looks 1984 to 2025 and joined to the OpenStreetMap outline; CC BY 4.0, modified) with osm_km2 the OpenStreetMap outline's own area, or no source (the OpenStreetMap outline), how (how the outline was matched), osm (OpenStreetMap way or relation ids), osm_name, centre [lon, lat] and bbox [west, south, east, north]. (c) OpenStreetMap contributors, ODbL 1.0; the outlines with the method are offered on /open. null where no clean outline was found (why_none says why)"},"why_none":{"type":"string","description":"Only where outline is null: why the dam has no outline (outside the extract, a reach of river, no name in OpenStreetMap)"},"frame":{"type":"object","description":"The fixed frame every crop and measurement uses: epsg (the UTM zone), utm [xmin, ymin, xmax, ymax] in metres, res_m (the scene classification's pixel, 20 m, coarser for frames over 20 km) and crop_res_m (the crops' pixel)"},"latest":{"description":"The newest good month: date (the scene's day), water_km2 and pct_of_outline (water area as % of the full-supply outline's area; area, not volume)"},"months":{"type":"array","description":"One row a month from January 2017: [month yyyy-mm, scene date, water area km2, unseen % (cloud, cloud shadow, cirrus or no data over the full area), quality good (5% or less unseen) | fair (20% or less) | poor, scene ids...]. Water is the count of Sentinel-2 L2A scene-classification pixels of class 6 (water) inside the full area (outline.source says which) widened by 40 m, times the pixel's area. Measured from space, not a DWS reading"},"crops":{"type":"array","description":"True-colour crops (WebP) of the frame: [scene date, why (the season and year it is the clearest of, newest, or driest same month), sha256 (served at /dams-from-space/img/<sha256>.webp), scene ids...]"},"years":{"type":"array","description":"One row a year from 1984 (Digital Earth Africa, Water Observations from Space annual summary, from Landsat 5, 7, 8 and 9 at 30 m): [year, average water area km2 (each observed pixel inside the widened outline counted by the share of the year's clear looks it was water), observed % of the outline, median clear looks per pixel, quality good (95% of the share of the outline this dam is ever observed in, and a median of 4 clear looks or more) | fair (80% and 2) | poor, DE Africa tiles...]. Landsat imagery courtesy of the U.S. Geological Survey; Digital Earth Africa, CC BY 4.0 In a year with Landsat looks set aside as likely muddy water read as land (history.set_aside, 13 Nov 2026), the average area leaves them out: (clear looks x the year's area minus the set-aside looks' water) / (clear looks minus set-aside looks)."},"landsat":{"type":"array","description":"One true-colour picture a year 1984 to 2016, the same frame as the Sentinel-2 crops, from Digital Earth Africa's Landsat annual geomedian (a cloud-free composite of the whole year): [year, sha256 (served at /dams-from-space/img/<sha256>.webp), product, tiles...]"},"driest":{"description":"The good Digital Earth Africa year with the least water, counted from the year the dam existed (since): year, since, since_how, built, water_km2, pct_of_outline. since_how osm: built is the year it was completed, from OpenStreetMap's start_date on the reservoir or wall (ODbL); completed by the first good year, every year counts, completed later, from the first year after that held half its largest yearly area. full: no date, but its first good year already held half its largest yearly area, so every year counts. half: neither, from the first year it held half its largest yearly area. Years with Landsat looks set aside as muddy water (history.set_aside) are counted without them; there set_aside (how many) and water_km2_as_read (the year as Digital Earth Africa gives it)"},"compare":{"type":"object","description":"DWS against space: pairs [DWS date, DWS % full, scene date, water area % of outline] (each DWS reading held, and the year-ago level it prints dated 364 days before, with the good scene nearest in time, at most 10 days away), r (Pearson's r with four pairs or more), rho (Spearman's rank correlation, the same pairs; under 0.7 is listed in the report, without judging), dws_change and space_change (points over the year), disagree (true when they move opposite ways by 5 points or more each, or differ by 30 points or more). deafrica: the cross-check of the two satellite measures, years 2017 on with a good DE Africa year and six good Sentinel-2 months: years, r (four years or more), ratio (median of DE Africa's area over the Sentinel-2 months' mean). Not a judgement of either: area and volume differ"},"volume":{"type":"object","description":"Our estimate of % full by volume from the water area (12 Nov 2026): the area-elevation curve fitted to Sentinel-2 water extents and the Copernicus DEM GLO-30 height of their shorelines, anchored at full with the full-supply capacity in our dam-levels records. fit (R2, root mean square residual in km2, months, heights), estimate (the newest good month: date, pct, area_pct), curve ([% of the full area, % full by volume]), readings ([date, % area, % volume]), dws (pairs with DWS % full: [DWS date, DWS %, satellite date, our %], mean difference, listed not judged); or none: why there is not enough range yet. Produced using Copernicus WorldDEM-30 (c) DLR e.V. 2010-2014 and (c) Airbus Defence and Space GmbH 2014-2018 provided under COPERNICUS by the European Union and ESA; all rights reserved"},"mixed":{"type":"array","description":"One row a month where the footprint is used: [scene date, shoreline km2 (water pixels with a dry neighbour, each partly water and partly land, counted whole; half of it is the most mixed pixels can move the area either way), water outside km2 (water from 40 m to 500 m outside the footprint: a flood, a footprint too small there, or a river or pond nearby; not counted in the area)]"},"calibrated":{"description":"Our estimate of % full by volume, calibrated on DWS's own weekly % full (12 Nov 2026, scripts/datasets/dam-calibrate.mjs): pairs (good months with DWS's figure for the same day, read between the weekly reports either side), years, dws_range (10th to 90th percentile of DWS's figure), curve (power: % full = c x (% of area)^k; or dem: p + q x the Copernicus DEM curve's own estimate), area_range used, held_out (each calendar year left out in turn: n, mae, rmse, bias, p90 in points), band (the 90th percentile of held-out errors, rounded up, at least 2), forward (fitted before the newest six months, tested on them), tried (both curves' held-out errors), estimate (the newest good month: date, pct, low, high, area_pct), points ([date, DWS %, our estimate, % of area]); or none: why there is no estimate (too few pairs, one year only, a dam that stayed near one level, or a band wider than 15 points). Ours, not DWS's"},"flag":{"description":"Where DWS's figure and our estimate differ by more than the band at the newest reading within 45 days of DWS's newest report: date, dws, estimate, diff (DWS minus ours), band, month_before_too, dws_same_reports (DWS's figure unchanged in that many reports in a row, when 4 or more), source (s2 or s1). It says the two differ beyond the usual error, never which is right: a late, repeated or mistyped reading, or on our side cloud shadow, haze, wind, a changed shoreline or a curve that does not hold at that level"},"radar":{"description":"Copernicus Sentinel-1 radar (Digital Earth Africa s1_rtc, VV, 20 m) from 2025-01-01: passes read, usable (the whole footprint seen and a clear water and land split that day), scale (median Sentinel-2 area over radar area on days both saw the dam, at most 3 days apart; null with fewer than 4 such days, radar then not used), weeks (DWS reports since: with a Sentinel-2 view within 3 days, with radar only, with neither), error_s2 and error_s1 (our estimate against DWS on those weeks), weekly ([DWS date, DWS %, s2 | s1 | null, % of area, our estimate]). Contains modified Copernicus Sentinel data 2025-2026 (Sentinel-1 radar, processed by Digital Earth Africa)"},"validation":{"description":"How well the measurement holds for this dam: outline (footprint_km2, osm_km2, iou: intersection over union of the two, footprint_only_km2, osm_only_km2, filled_unseen_km2: ground inside the outline Landsat never saw clearly, counted in), months_good, clear_pct_median and clear_pct_min (share of the full area clear in the months used), shoreline_share_median (% of the water area in shoreline pixels), water_outside (months with water outside the footprint, the newest month's km2 and a note), dws (held-out mae, band, forward mae)"},"history":{"type":"object","description":"Since 13 Nov 2026 (step 3.S2, dams back to 1984): the water area in every clear Landsat look since 1984, measured the way Digital Earth Africa's Waterbodies does it, from Water Observations from Space per look (wofs_ls 1-0-0, Landsat 5, 7, 8 and 9 at 30 m; CC BY 4.0, Landsat courtesy of the U.S. Geological Survey). source; outline 'waterbodies' (the dam's Digital Earth Africa Waterbodies v0.0.3 polygons, uids, where their union overlaps our footprint by IoU 0.5 or more; iou says how much) or 'footprint' (our footprint, where they don't match); outline_km2 (the full area of that outline); looks_read (every look that held the dam), valid (looks with at least 90% of the outline seen clearly, one a day), first and last (dates), years (calendar years with a valid look); points [[date, water km2]] for each valid look; vs_s2, the check against Sentinel-2: pairs (good Sentinel-2 months with a valid Landsat look within days days, both inside our footprint), median_pts and p90_pts (absolute difference in points of the full footprint), within (pairs within margin points), bias_pts (median of Landsat minus Sentinel-2); set_aside (since 13 Nov 2026, muddy lake readings): why, rule (in plain words), n, and looks [[date, water km2, % of full, median % of the looks before, median % of the looks after]] for each look set aside as likely muddy water read as land, kept here and left out of points, years and driest. Absent where the dam is not held whole by one Landsat look (Bloemhof Dam)"}}},"DroughtIndex":{"type":"object","title":"Drought monitor by ward and municipality","description":"One record per 2026 place (ward, municipality, district or province) and year (twelve months)","properties":{"id":{"type":"string","description":"level-code-year: ward-19100001-2026, municipality-CPT-2017"},"kind":{"type":"string","description":"year (twelve months)"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"year":{"type":"integer","description":"The calendar year"},"index":{"type":"array","description":"Each month's drought index: the mean of spi3, spi12, spei12 and ndvi where the month has them (at least two), in standard deviations from the 1991 to 2020 normal; minus is drier"},"class":{"type":"array","description":"Each month's class from the index: 0 none (above -0.5), 1 dry (-0.5 or below), 2 moderate (-1 or below), 3 severe (-1.5 or below), 4 extreme (-2 or below)"},"spi3":{"type":"array","description":"Standardised precipitation index over 3 months, ours from ERA5-Land monthly rain (gamma distribution per calendar month, 1991 to 2020)"},"spi12":{"type":"array","description":"The same over 12 months"},"spei12":{"type":"array","description":"Standardised precipitation-evapotranspiration index over 12 months, from Copernicus ERA5-Drought (0.25 degree, reference 1991 to 2020), averaged over the place by area"},"ndvi":{"type":"array","description":"Greenness against normal (Digital Earth Africa's standardised NDVI anomaly, from greenness-by-ward), from 2017, in months seen over half the place"},"rain3_pct":{"type":"array","description":"Rain over the 3 months to the month as a percentage of its 1991 to 2020 mean (ERA5-Land)"},"era5_spi12":{"type":"array","description":"The second reading: ERA5-Drought's own 12-month SPI, averaged over the place; not part of the index"},"source":{"type":"string","description":"The products and licences"}}},"ElectricityTariffs":{"type":"object","title":"Municipal electricity tariffs","description":"One record per tariff, per distributor, per financial year","properties":{"id":{"type":"string","description":"Stable id: country, distributor, tariff and financial year"},"distributor":{"type":"string","description":"Licensed distributor: Eskom or the municipality"},"distributor_code":{"type":"string","description":"Municipal Demarcation Board code of the municipality (CPT, ETH)"},"tariff":{"type":"string","description":"Tariff name as the decision gives it"},"category":{"type":"string","description":"residential, commercial, large_power, agricultural, embedded_generation, wheeling, generator, public_lighting or other"},"financial_year":{"type":"string","description":"Municipal financial year, July to June"},"effective_from":{"type":"string","format":"date","description":"Date the tariff takes effect"},"status":{"type":"string","description":"Where the tariff is in NERSA's approval process"},"charges":{"type":"array","description":"Each charge: name, season (high_demand is winter, usually June to August), time-of-use period, meter, kWh block, unit, the approved value, last year's approved value (previous) and, where the decision shows it, what was actually charged last year (previous_charged); and, where its row is printed on a later page than the tariff's source page (a table running over), that page (page)"},"vat":{"type":"string","description":"Whether the charges include VAT, as the source states it"},"source":{"type":"object","description":"Publisher, document, decision date, page and link"},"flags":{"type":"array","description":"Machine-readable notes from checking: summary_rate_differs, suspect_value_in_source, obsolete_tariff, unit_not_stated"},"notes":{"type":"array","description":"What each flag means for this record, in words"}}},"ExchangeRates":{"type":"object","title":"Rand exchange rates","description":"One record per currency per business day","properties":{"id":{"type":"string","description":"Currency and date (usd-2026-11-09)"},"currency":{"type":"string","description":"USD, GBP, EUR or JPY"},"name":{"type":"string","description":"The currency in words"},"date":{"type":"string","format":"date","description":"The business day of the ECB reference rate (TARGET days: no rates on weekends, New Year, Good Friday, Easter Monday, 1 May, Christmas and 26 December)"},"value":{"type":"number","description":"Rand per unit of the currency (per yen for JPY)"},"unit":{"type":"string","description":"Rand per US dollar, and so on"},"basis":{"type":"string","description":"ecb (the rand per euro, the ECB's own figure) or cross_via_euro (worked out by us: zar_per_eur divided by currency_per_eur)"},"zar_per_eur":{"type":"number","description":"The ECB's rand per euro that day"},"currency_per_eur":{"type":"number","description":"The ECB's units of the currency per euro that day (null for the euro)"},"flags":{"type":"array","description":"large_move: the rand moved more than 4% against this currency since the business day before"},"source":{"type":"object","description":"The ECB's reference rates for the day, and how the value was worked out"}}},"FuelPrices":{"type":"object","title":"Fuel prices by zone and grade","description":"One record per zone (or national, for paraffin), per product, per monthly price adjustment","properties":{"id":{"type":"string","description":"Zone (ZA for a national price), product and effective date (9C-petrol-95-ulp-2026-11-04)"},"product":{"type":"string","description":"petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, lpg, lpg_saldanha_bay, illuminating_paraffin_retail"},"product_name":{"type":"string","description":"The product in words"},"price_type":{"type":"string","description":"retail (petrol: the regulated pump price) or maximum_retail (LPG, and illuminating paraffin's single national maximum)"},"unit":{"type":"string","description":"c/l (cents per litre), or c/kg for LPG; LPG includes VAT, petrol carries none"},"zone":{"type":"string","description":"Magisterial District Zone as the gazette prints it (1A, 9C, 31J); null for paraffin, priced nationally"},"zone_name":{"type":"string","description":"9C Gauteng (the inland zone the department quotes), National for paraffin; the gazette names no other zone: see provinces, and fuel-zone-lookup for the districts in each"},"reference_area":{"type":"string","description":"coast (zone 1A) or inland (zone 9C, Gauteng): the two zones the department quotes its headline prices and changes for"},"provinces":{"type":"array","description":"Province codes (ISO 3166-2) of the magisterial districts in the zone, from fuel-zone-lookup; empty for zones it lists no district in, and for paraffin"},"effective_from":{"type":"string","format":"date","description":"Date the price came into operation (00h01), from the regulations"},"price":{"type":"number","description":"The regulated price, as the gazette prints it"},"previous":{"type":"number","description":"The price a month earlier (same zone and product), if we have that month's gazette"},"change":{"type":"number","description":"price minus previous"},"flags":{"type":"array","description":"previous_month_missing (no gazette for the month before), change_differs_from_most_zones (the zone moved by a different amount from most zones: usually a change in its transport differential), suspect_value_in_source (the gazette looks misprinted here: see note), corrected (from a correction notice), read_by_eye (the notice is printed as a picture: see note), zone_new, product_new"},"note":{"type":"string","description":"What to know about this price, where there is something: a misprint, with the figure the gazette itself implies, or the correction it came from"},"source":{"type":"object","description":"The Government Gazette issue and notice (gazette, notice, published) and the Government Printing Works' copy (url)"}}},"FuelZoneLookup":{"type":"object","title":"Town to fuel-pricing zone lookup","description":"One record per magisterial district","properties":{"id":{"type":"string","description":"Magisterial district code (BV050), or for a Namakwaland area its name (NAMAKWALAND-PORT-NOLLOTH)"},"magisterial_code":{"type":"string","description":"Magisterial district code as listed; null for the Namakwaland areas"},"district":{"type":"string","description":"Magisterial district as listed (mostly named after its main town)"},"names":{"type":"array","description":"Names to match a place on: the district name, and any other name given in brackets (Bathurst (Port Alfred) → Bathurst, Port Alfred)"},"area_note":{"type":"string","description":"Where a district is split between zones, which part this is (east of 20° longitude)"},"zone":{"type":"string","description":"Fuel price zone, written as the monthly schedules write it (9B), to join to fuel-prices"},"zone_as_published":{"type":"string","description":"Zone as the list writes it (09B)"},"province":{"type":"string","description":"Province as listed"},"province_code":{"type":"string","description":"Province code, ISO 3166-2 (ZA-WC)"},"flags":{"type":"array","description":"no_magisterial_code: one of the Namakwaland areas (zones 31J to 37J), which the list defines by latitude and longitude instead of a magisterial district"},"source":{"type":"object","description":"Publisher, list and its address"}}},"GazetteIndex":{"type":"object","title":"Government Gazette notice index, national","description":"One record per notice where we hold GPW's copy of its Gazette and read its contents page; one record per Gazette otherwise (its notices not listed yet)","properties":{"id":{"type":"string","description":"gg-<Gazette number> for a Gazette whose notices are not listed yet; gg-<number>-<notice number> for a notice"},"gazette":{"type":"string","description":"The Government Gazette number"},"date":{"type":"string","format":"date","description":"The Gazette's date (GPW's listing; the cover where a held copy disagrees and a person has read it, see date_note)"},"department":{"type":"string","description":"Who published it: for a notice, the heading it is printed under; otherwise GPW's file label, read into a department's name"},"gazette_department":{"type":"string","description":"For a notice: the Gazette's publisher as GPW names the file"},"gpw_name":{"type":"string","description":"GPW's own label in the file name, as typed"},"kind":{"type":"string","description":"act, regulation, notice, draft for comment, proclamation, board notice, or not read (a Gazette whose notices are not listed yet)"},"notice":{"type":"string","description":"The notice number as printed (R. 8127 for a regulation), or null"},"title":{"type":"string","description":"The notice's title from the Gazette's contents page, or null when not read. ID and passport numbers are masked; a notice that names a private person (forfeiture, sequestration, estates, name changes, permits) reads 'Notice concerning a private person' (see withheld)"},"withheld":{"type":"boolean","description":"True when the title is withheld because the notice names a private person; the Gazette itself is at GPW's link"},"page":{"type":"integer","description":"The page the notice starts on, in the Gazette"},"comment_closes":{"type":"string","format":"date","description":"For a draft: the date comments close, printed or counted (see comment_rule)"},"comment_rule":{"type":"string","description":"\"printed\", or how the date was counted from the notice's period"},"comment_earliest":{"type":"boolean","description":"True when the period runs from the Gazette or a newspaper, whichever is later: the date is the earliest close"},"comment_words":{"type":"string","description":"The notice's own words the closing date was read from"},"read":{"type":"string","description":"\"two readings\" when the notice number is on its page in both text readings; \"contents only\" otherwise"},"extraordinary":{"type":"boolean","description":"GPW files it as a separate (extraordinary) issue"},"withdrawn":{"type":"boolean","description":"GPW marks its only file withdrawn"},"gpw":{"type":"string","description":"GPW's own download link for the Gazette"},"gpw_bytes":{"type":"integer","description":"The size of GPW's file"},"held":{"type":"string","description":"The sha256 of our stored copy (GPW's file, byte for byte), when we hold it"},"notice_page":{"type":"string","description":"The slug of its page at /notice/<slug>, when one exists"}}},"GreennessByWard":{"type":"object","title":"Greenness by ward","description":"One record per 2026 place (ward, municipality, district or province) and year (twelve months) or the 1984 to 2020 normals","properties":{"id":{"type":"string","description":"level-code-period: ward-19100001-2026 (a year), municipality-CPT-normals"},"kind":{"type":"string","description":"year (twelve months) or normals (1984 to 2020, by month)"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"year":{"type":"integer","description":"year records: the calendar year"},"period":{"type":"string","description":"normals records: 1984-2020"},"ndvi":{"type":"array","description":"Mean NDVI of the place each month (year: Digital Earth Africa's monthly mean, from Landsat and Sentinel-2; normals: its 1984 to 2020 Landsat climatology); null where nothing was seen"},"anomaly":{"type":"array","description":"year records: Digital Earth Africa's standardised anomaly averaged over the place (standard deviations from the month's normal; above 0 is greener than normal)"},"seen":{"type":"array","description":"The share of the place seen (0 to 1) each month: pixels with a value through the clouds"},"clms_ndvi":{"type":"array","description":"year records: the second reading, CLMS NDVI 300 m (version 3), the month's three 10-day images averaged, then over the place"},"source":{"type":"string","description":"The products and licences, averaged over the place"}}},"HeatByWard":{"type":"object","title":"Land surface temperature by ward","description":"One record per 2026 place (ward, municipality, district or province), every month from January 1984","properties":{"id":{"type":"string","description":"level-code: ward-19100077, municipality-CPT, province-ZA-WC"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"first_month":{"type":"string","description":"The month of the first value in lst and looks (1984-01)"},"last_month":{"type":"string","description":"The month of the last value in lst and looks"},"lst":{"type":"array","description":"Each month's land surface temperature in degrees C: the mean of the clear 240 m land cells Landsat saw over the place that month (about 10 in the morning, clear days only); null where the place was seen under a quarter of one clear look. The temperature of the ground's skin, not of the air"},"looks":{"type":"array","description":"How many clear looks the average 240 m cell of the place had that month (0 = none)"},"first_summer":{"type":"integer","description":"The year of the first value in summer_lst (a summer is December to February, named by the year it ends)"},"summer_lst":{"type":"array","description":"Each summer's land surface temperature: the mean of its months with a value, when at least two of the three have one"},"summer_vs_municipality":{"type":"array","description":"Wards only: the ward's summer against its municipality's, degrees C (above 0 = hotter), over the months both have"},"cells":{"type":"integer","description":"The place's 240 m cells (EPSG:6933), the base of looks"},"source":{"type":"string","description":"The product and its credit"}}},"LandAndPopulationByWard":{"type":"object","title":"Land cover, built-up area and population by ward","description":"One record per 2026 place (ward, municipality, district or province) and kind: profile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled)","properties":{"id":{"type":"string","description":"level-code-kind: ward-19100001-profile, municipality-CPT-built-up, province-ZA-WC-population"},"kind":{"type":"string","description":"profile (land cover in 2021), built-up (built-up surface every five years 1975 to 2020) or population (people, modelled, each year 2015 to 2026)"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"area_km2":{"type":"number","description":"The place's area from its MDB boundary, km2"},"year":{"type":"integer","description":"profile: 2021, the year of ESA WorldCover"},"mapped_km2":{"type":"number","description":"profile: the area ESA WorldCover classes, km2"},"cover_pct":{"type":"object","description":"profile: each land cover class's share of the mapped area, % to one decimal, adding up to exactly 100 (tree, shrub, grass, crop, built, bare, snow, water, wetland, mangrove, moss; classes absent from the place are left out)"},"cover_km2":{"type":"object","description":"profile: each class's area, km2"},"years":{"type":"array","description":"built-up: 1975 to 2020 in five-year steps; population: 2015 to 2026"},"built_km2":{"type":"array","description":"built-up: built-up surface (roofs and paved ground as GHSL sees them), km2, for each year"},"built_pct":{"type":"array","description":"built-up: built-up surface as a share of the place's area, %"},"modelled":{"type":"boolean","description":"population: always true. A modelled estimate, not the census"},"people":{"type":"array","description":"population: people (WorldPop, modelled) for each year"},"per_km2":{"type":"array","description":"population: people per km2 of the place"},"second":{"type":"object","description":"population: the second reading, GHSL GHS-POP: years (2015, 2020), people, differs_pct (WorldPop against GHS-POP, as % of their mean) and flagged (true where they differ by more than 20%)"},"source":{"type":"string","description":"The source grid and licence (CC BY 4.0), summed over the place"}}},"NightLightByWard":{"type":"object","title":"Night light by ward","description":"One record per 2026 place (ward, municipality, district or province), every month from January 2012 and every year from 2012","properties":{"id":{"type":"string","description":"level-code: ward-19100077, municipality-CPT, province-ZA-WC"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"area_km2":{"type":"number","description":"The place's area on the Black Marble grid (km2)"},"first_month":{"type":"string","description":"The month of the first value in the monthly arrays (2012-01)"},"last_month":{"type":"string","description":"The month of the last value in the monthly arrays"},"rad":{"type":"array","description":"Each month's mean night-time radiance over the part of the place seen, in nW/cm2/sr (nanowatts per square centimetre per steradian), from NASA Black Marble VNP46A3 (all-angle, snow-free composite: moonlight, atmosphere and stray light corrected, cloudy nights dropped, under 0.5 set to zero by NASA); null where under half the place had a value. Light seen from space at about 1:30 in the morning"},"lit":{"type":"array","description":"Each month's lit share of the area seen (%): 1 nW/cm2/sr or more, twice NASA's 0.5 noise floor (the faint band just above the floor grew across the country from 2022 while brighter light did not, so the share is counted from 1)"},"seen":{"type":"array","description":"Each month's share of the place with a value (%)"},"gap":{"type":"array","description":"Each month's share of the seen area that NASA filled from earlier months because no clear night was seen (%)"},"nights":{"type":"array","description":"Each month's mean number of clear nights behind a pixel"},"first_year":{"type":"integer","description":"The year of the first value in the yearly arrays (2012)"},"last_year":{"type":"integer","description":"The year of the last value in the yearly arrays"},"year_rad":{"type":"array","description":"Each year's mean night-time radiance (nW/cm2/sr) from NASA's yearly product VNP46A4 (NASA's own mean of the year's clear nights, outliers dropped)"},"year_lit":{"type":"array","description":"Each year's lit share of the area seen (%), yearly product"},"year_bright":{"type":"array","description":"Each year's bright share of the area seen (%): radiance 5 nW/cm2/sr or more, yearly product"},"year_seen":{"type":"array","description":"Each year's share of the place with a value (%)"},"year_gap":{"type":"array","description":"Each year's gap-filled share of the seen area (%)"},"year_total":{"type":"array","description":"Each year's total light: radiance times area, summed over the place (nW/cm2/sr x km2), yearly product"},"wards_year":{"type":"array","description":"Municipalities only: each ward's newest year as [ward code, mean radiance, lit share %], by ward code"},"source":{"type":"string","description":"The product and its credit"}}},"ReferenceRates":{"type":"object","title":"Reference interest rates and legal limits","description":"One record per rate, per date it took a new value","properties":{"id":{"type":"string","description":"Rate and effective date (prescribed-rate-2026-11-01, nca-max-unsecured-2026-09-25)"},"rate":{"type":"string","description":"policy_rate (the repo rate), prime_lending_rate (repo plus 3.5, the banks' convention), prescribed_rate, and the NCA caps nca_max_mortgage, nca_max_credit_facility, nca_max_unsecured, nca_max_developmental, nca_max_short_term_first, nca_max_short_term_later, nca_max_other and nca_max_incidental"},"name":{"type":"string","description":"The rate in words"},"effective_from":{"type":"string","format":"date","description":"First day the rate had this value: for repo and prime, the day the decision took effect; for a legal limit, the day the law gives"},"value":{"type":"number","description":"The rate, % a year (% a month where unit says so)"},"previous":{"type":"number","description":"The value before this one (null for the first)"},"change":{"type":"number","description":"value minus previous, in percentage points"},"series_code":{"type":"string","description":"Always null (kept for older clients)"},"flags":{"type":"array","description":"first_in_series; by_convention (prime, worked out as repo plus 3.5); for the prescribed rate, commencement (8 January 2016), decision_month_differs (decided in the month before the repo rate changed) and two_decisions_in_month"},"source":{"type":"object","description":"For a legal limit, the law it follows (url null where the gazette is older than the Government Printing Works’ online archive); for the repo rate, a public report of the announcement; for prime, how it was worked out"},"unit":{"type":"string","description":"Legal limits and prime: % a year, or % a month (the NCA caps on short-term and incidental credit)"},"formula":{"type":"string","description":"Legal limits and prime: how the value follows from the repo rate (Repo rate 7.25% + 3.5 points)"},"repo_rate":{"type":"number","description":"Legal limits and prime: the policy rate the value follows, % a year (null for a fixed cap)"},"based_on":{"type":"string","description":"Legal limits and prime: the repo change the value follows, as policy-rate-<the day it took effect> (null for a fixed cap)"},"decision_date":{"type":"string","format":"date","description":"Repo rate and prescribed rate: the day the Reserve Bank announced the repo decision it follows (the Act counts from this month)"},"decision_source":{"type":"string","description":"Repo rate and prescribed rate: a public report of the decision (date and rate)"},"gazette_notice":{"type":"object","description":"Prescribed rate only: the Minister’s notice (notice, gazette, published, date_in_notice, url: the Government Printing Works’ copy, null for gazettes before its online archive starts in 2018), or null if none was published"},"gazette_status":{"type":"string","description":"Prescribed rate only: gazetted, gazetted_late, gazetted_different_date or not_gazetted"},"credit_type":{"type":"string","description":"NCA caps only: the credit type in the words of Table A"},"note":{"type":"string","description":"Legal limits and prime: what to know about this value"}}},"SchoolTerms":{"type":"object","title":"School terms, from the Gazette","description":"One record per school year: its four terms for public schools","properties":{"id":{"type":"string","description":"school-year-<year>"},"year":{"type":"number","description":"The school year (a calendar year)"},"terms":{"type":"array","description":"The four terms for public schools in every province, as the notice's summary prints them: { term, opens, closes, weeks, days, public_holidays, public_holidays_plus, school_days }, and where the summary prints a second figure in brackets, opens_bracketed, closes_bracketed, days_bracketed, school_days_bracketed (kept as printed; the notice does not say in words what the brackets mean)"},"total":{"type":"object","description":"The summary's own Total row: weeks, days, school_days (the terms add up to it: checked)"},"special_school_holidays":{"type":"array","description":"Dates the calendar marks as special school holidays"},"public_holidays":{"type":"array","description":"The public holidays the notice lists beside the calendar, { date, name } as printed (checked against the public holidays tool: the same days)"},"cite":{"type":"object","description":"gazette, notice (No. 8081), notice_page, summary_page (the Gazette page of the summary table), published, url (GPW's copy), sha256, title"},"note":{"type":"string","description":"What the record does not say"}}},"SocialGrants":{"type":"object","title":"Social grant amounts, with history","description":"One record per grant, with every amount held in date order","properties":{"id":{"type":"string","description":"The grant: older-persons, older-persons-75, war-veterans, disability, care-dependency, foster-child, child-support, child-support-top-up, grant-in-aid"},"name":{"type":"string","description":"The grant's name in plain words"},"unit":{"type":"string","description":"Rand a month: the maximum the notice sets (the means test can pay less)"},"amount":{"type":"number","description":"The maximum a month in force on as_on, in rand: base plus additional"},"base":{"type":"number","description":"The amount the notice prints first (for older-persons-75 and war-veterans, the older person's amount; for child-support-top-up, the child support grant)"},"additional":{"type":"number","description":"The amount the notice prints after a plus sign: the additional payment for people 75 and older and for war veterans, and the top-up on the child support grant; null where there is none"},"in_force_from":{"type":"string","format":"date","description":"The day the amount in force on as_on took effect, as the notice prints it; null when only the notice that set it would say"},"as_on":{"type":"string","format":"date","description":"The day the release was cut, for amount and in_force_from"},"history":{"type":"array","description":"Every amount held, oldest first: { amount, base, additional, from, until (the day the next amount took effect, null for the newest), known_on, column (the notice's column it was read from), cite, read (how it was read), also_in (other notices that print the same), note }. A period with from null is the notice's 'Current Amount': in force when it was published, its start date in the notice before, not yet read"},"sources":{"type":"array","description":"The Gazettes the record rests on: gazette, notice, page, published, url (GPW's copy), sha256 of the file we read"},"cite":{"type":"object","description":"In every amount: gazette, notice (No. R. 7287), notice_date, page (the Gazette page), published, url, sha256, title"}}},"SurfaceWaterByWard":{"type":"object","title":"Surface water by ward","description":"One record per 2026 place (ward, municipality, district or province), with a value for each year from 1984 to 2025","properties":{"id":{"type":"string","description":"level-code: ward-19100001, municipality-CPT, province-ZA-WC"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"first_year":{"type":"integer","description":"The first year of the arrays (1984)"},"last_year":{"type":"integer","description":"The last year of the arrays (2025)"},"water_km2":{"type":"array","description":"Each year's average water area in km2: every 30 m pixel's share of clear Landsat looks that saw water, summed over the place (Digital Earth Africa WOfS); null where nothing was seen"},"permanent_km2":{"type":"array","description":"Each year's area wet in over 80% of its clear looks, km2"},"ever_km2":{"type":"array","description":"Each year's area seen wet at least once, km2"},"seen":{"type":"array","description":"The share of the place (0 to 1) with at least one clear look that year"},"area_km2":{"type":"number","description":"The place's area as counted in 30 m pixels"},"source":{"type":"string","description":"The products and licences, counted over the place"}}},"TaxTables":{"type":"object","title":"Income tax tables, with history","description":"One record per year of assessment (1 March to the end of February), named by the year it ends, as the Acts do","properties":{"id":{"type":"string","description":"tax-year-<the year it ends> (tax-year-2026 is 1 March 2025 to 28 February 2026)"},"year":{"type":"string","description":"The year of assessment, named by the year it ends, as the Acts and payslips do"},"starts":{"type":"string","format":"date","description":"First day of the year of assessment (1 March)"},"ends":{"type":"string","format":"date","description":"Last day (28 or 29 February)"},"status":{"type":"string","description":"held (figures from the Act) or not_held (no Act fixing this year's rates is held; no figures)"},"brackets":{"type":"object","description":"The rates table for natural persons, deceased and insolvent estates and special trusts (Schedule I paragraph 1 of the year's Rates and Monetary Amounts Act): brackets [{ over, up_to (null for the top), base, rate }] where tax is base plus rate times the amount above over; cite; words (how the Act names the year). A bracket whose printed base disagrees with the table's own arithmetic carries flag printed_base_disagrees_with_arithmetic, the arithmetic and a note: it is kept as printed"},"rebates":{"type":"object","description":"primary, secondary (65 and older on the last day of the year) and tertiary (75 and older) rebates, s6(2) of the Income Tax Act, each { value, cite, carried_from (when the Act that set it was for an earlier year), note }"},"thresholds":{"type":"object","description":"Our arithmetic, not printed in the Acts: the taxable income below which no tax is due, under65, 65to74 and 75plus, as the rebates the age band gets divided by the bottom rate"},"medical_credits":{"type":"object","description":"Medical scheme fees tax credit a month, s6A(2)(b) of the Income Tax Act: member (the person alone), member_and_one_dependant (the person and one dependant together: the whole credit for two, not an amount added) and additional (each dependant after that), each { value, cite, carried_from, note }"},"lump_sum_withdrawal":{"type":"object","description":"The retirement fund lump sum withdrawal benefit table (Schedule I of the Rates Act): brackets and cite"},"lump_sum_retirement":{"type":"object","description":"The retirement fund lump sum benefit (retirement, death, retrenchment) table: brackets and cite"},"sources":{"type":"array","description":"The Gazettes the record rests on: gazette, published, url (GPW's copy), sha256 of the file we read"},"note":{"type":"string","description":"Why a year is not held, or null"},"cite":{"type":"object","description":"In every figure: act (Act N of YYYY), title, section (the Act's section or Schedule paragraph, and what it substitutes in the Income Tax Act 58 of 1962), gazette, page (the Gazette page), url, published"}}},"TollTariffs":{"type":"object","title":"Toll plazas and tariffs","description":"One record per toll plaza point (mainline or ramp) per tariff year","properties":{"id":{"type":"string","description":"Route, plaza, point and tariff year (za-n3-mooi-mainline-2026-27)"},"plaza":{"type":"string","description":"Toll plaza as the 2026 gazette names it"},"point":{"type":"string","description":"mainline, or the ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w (the gazette's Ramp (N), (S), (E), (W))"},"point_label":{"type":"string","description":"The point as the gazette prints it"},"route":{"type":"string","description":"National route (N1, N2, N3, N4, N17) or R30/R730/R34"},"toll_road":{"type":"string","description":"Toll road the notice names: SANRAL's ten toll roads, Platinum, Cedara to Heidelberg Gauteng, or Hans Strydom Interchange (Pretoria) to the Gauteng/Mpumalanga Border and Maputo Development Corridor"},"operator":{"type":"string","description":"SANRAL for its own toll roads, or the concessionaire: Bakwena (Platinum), N3TC (N3), TRAC (N4 east)"},"operator_name":{"type":"string","description":"Operator in full"},"province":{"type":"string","description":"Province the plaza is in, from OpenStreetMap (ODbL); null where no OSM toll booth carries its name"},"latitude":{"type":"number","description":"Middle of the plaza's OpenStreetMap toll booths (ODbL), 4 decimals; ramps share their plaza's"},"longitude":{"type":"number","description":"The same"},"tariff_year":{"type":"string","description":"Year the tariffs apply, from 1 March (1 April in 2018) to the next adjustment: 2026/27"},"effective_from":{"type":"string","format":"date","description":"Date and time from which the toll is payable, as the notice states (00:00 that day)"},"class_1":{"type":"number","description":"Light vehicles, in rand including VAT: motor cars, motorcycles and motor tricycles, with or without a trailer"},"class_2":{"type":"number","description":"Medium heavy vehicles (two axles), rand including VAT"},"class_3":{"type":"number","description":"Large heavy vehicles (three or four axles), rand including VAT"},"class_4":{"type":"number","description":"Extra large heavy vehicles (five or more axles), rand including VAT"},"previous":{"type":"object","description":"The same plaza and point the tariff year before, from that year's notice; null where it wasn't tolled then or that notice isn't held"},"vat":{"type":"string","description":"included: every notice states the tariffs include VAT"},"source":{"type":"object","description":"Gazette, notice, date, English and Afrikaans table pages, the Government Printing Works link and the rights basis"},"location_source":{"type":"object","description":"OpenStreetMap toll booths and province boundary the position and province come from (ODbL 1.0, (c) OpenStreetMap contributors)"},"flags":{"type":"array","description":"change_differs (strays from the median change of its operator's tariffs that year), suspect_value_in_source (kept as printed, though it looks wrong), afrikaans_differs (the Afrikaans table prints another figure; the English one is kept), read_by_eye (checked against the page image where OCR lost a cell), asterisk_unexplained, class_order_unusual, location_not_found"},"notes":{"type":"array","description":"What each flag means for this record, in words"}}},"WageTables":{"type":"object","title":"Bargaining-council minimum wages","description":"One record per minimum wage or levy: per instrument, wage table, area, occupation or grade, step and period","properties":{"id":{"type":"string","description":"Stable id: council or instrument, notice number, table, occupation and step"},"council":{"type":"string","description":"Bargaining council, or the statute for the national minimum wage and sectoral determinations"},"council_code":{"type":"string","description":"Short code: MIBCO, NBCRFLI, NBCPSS, BCCEI, BCCCI (contract cleaning, KwaZulu-Natal), RBCCS (contract cleaning outside KwaZulu-Natal), NBCCI (chemical industry: its glass and fast-moving consumer goods sectors), BIBC (building, Cape of Good Hope), BBCNWB (building, North and West Boland), FBC (furniture, Gauteng, North West, Mpumalanga, Limpopo and Free State); NMW for the National Minimum Wage Act; SD1 and SD9 for sectoral determinations"},"instrument":{"type":"string","description":"bargaining_council_agreement, national_minimum_wage or sectoral_determination"},"agreement":{"type":"string","description":"The agreement or schedule the figure is in, as the gazette names it"},"record_type":{"type":"string","description":"wage (a minimum wage) or levy (a council levy)"},"sector":{"type":"string","description":"The wage table's own heading: sector, division, chapter or schedule"},"area":{"type":"string","description":"Area the figure applies in, as the gazette names it; National where the table has no areas"},"area_definition":{"type":"string","description":"The places the area covers, in the gazette's words, where it defines them"},"occupation":{"type":"string","description":"Job, class or grade as printed (for a levy, who it applies to)"},"step":{"type":"string","description":"Experience step, year of training or learnership level, where the table has one"},"job_titles":{"type":"array","description":"Job titles the gazette lists under a grade, where one grade covers several jobs"},"amount":{"type":"number","description":"The figure as printed, in rand (or a percentage for a levy charged as a share of wages)"},"unit":{"type":"string","description":"hour, day, week or month for wages; day, week, month, percent_of_weekly_wage or percent_of_monthly_wage for levies"},"also_printed":{"type":"array","description":"The same wage printed in other units on the same row ({amount, unit}), as the gazette prints them"},"hours_basis":{"type":"string","description":"Hours and weeks the gazette uses to turn one unit into another (checked against every row)"},"payer":{"type":"string","description":"For levies: employee or employer"},"effective_from":{"type":"string","format":"date","description":"First day the figure binds every employer in scope, non-parties included"},"effective_from_parties":{"type":"string","format":"date","description":"First day it binds the parties to the council, where the gazette gives a different date (a retrospective start can bind only the parties)"},"effective_to":{"type":"string","format":"date","description":"Last day of the period the figure is for"},"period_as_printed":{"type":"string","description":"The table's period in the gazette's words"},"extended_to_non_parties":{"type":"boolean","description":"Whether the Minister extended the agreement to non-parties (null for statutory wages)"},"non_parties_from":{"type":"string","format":"date","description":"Date the extension binds non-parties, from the notice (often the second Monday after publication)"},"non_parties_to":{"type":"string","format":"date","description":"Date the extension ends"},"status":{"type":"string","description":"in_force, expired or upcoming on the version date"},"gazette":{"type":"object","description":"Government Gazette number, Regulation Gazette number, notice number, date and page; correction, where a later correction notice fixed the date the extension binds non-parties"},"flags":{"type":"array","description":"Machine-readable notes: read_by_eye (a figure OCR misreads, checked against the page image), read_by_eye_only (every OCR reading misreads it; the note says what the page shows), units_disagree_in_source (the gazette prints hourly and weekly figures that disagree), source_disagrees (another part of the same agreement prints a different figure for the same period; the note says which), starts_first_full_pay_week (the gazette starts the rate with the first full pay week of a month; the 1st of the month stands in for it), below_national_minimum_wage (its hourly equivalent is below the National Minimum Wage in force on some of the same dates, so the National Minimum Wage applies; the note gives both), cpi_may_apply, basis_not_stated"},"notes":{"type":"array","description":"What the flags mean for this record, and anything else the gazette says about the figure"},"source":{"type":"object","description":"Publisher, gazette and notice, link to the gazette file, and page"}}},"WardBoundaries":{"type":"object","title":"Ward and municipal boundaries with history","description":"One record per ward, municipality or district, per demarcation cycle","properties":{"id":{"type":"string","description":"Level, cycle and code (ward-2026-19100001, municipality-2026-CPT, district-2026-DC12)"},"level":{"type":"string","description":"ward, municipality (a local or metropolitan municipality) or district (a district municipality, or a metro, which is its own district)"},"cycle":{"type":"string","description":"The demarcation cycle: the local government election the boundaries were drawn for (2021, 2026)"},"code":{"type":"string","description":"The MDB code: an 8-digit ward id, a municipal code (CPT, EC124) or a district code (DC12, or the metro’s code)"},"name":{"type":"string","description":"Name: the municipality’s or district’s, or \"Ward n, Municipality\" for a ward"},"category":{"type":"string","description":"Municipal category: A (metropolitan), B (local) or C (district); null for wards"},"category_name":{"type":"string","description":"The category in words"},"province":{"type":"string","description":"Province, ISO 3166-2 (ZA-WC)"},"district_code":{"type":"string","description":"The district (or metro) it falls in"},"district":{"type":"string","description":"The district’s name"},"municipality_code":{"type":"string","description":"The local or metropolitan municipality it falls in (for wards and municipalities)"},"municipality":{"type":"string","description":"The municipality’s name"},"ward_number":{"type":"integer","description":"The ward’s number within its municipality"},"area_km2":{"type":"number","description":"Area in square kilometres, worked out from the shape"},"label_point":{"type":"array","description":"A point inside the shape, [longitude, latitude], for a label or a quick map"},"in_force_from":{"type":"string","format":"date","description":"The date these boundaries took (or take) effect: the election they were drawn for"},"in_force_to":{"type":"string","format":"date","description":"The last day before the next cycle took effect; null while current"},"source":{"type":"object","description":"Publisher, layer, the MDB service it comes from, and its licence"}}},"WaterQuality":{"type":"object","title":"Water quality by treatment works","description":"One record per water supply system, wastewater system or (No Drop) water services authority, per assessment","properties":{"id":{"type":"string","description":"Assessment, municipality code and system (gd2024-wc053-beaufort-west; for works municipalities don't run, the institution: gd2024-dpw-ec-mthatha-cc, gd2024-eskom-arnot); stable from release to release"},"programme":{"type":"string","description":"blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses)"},"assessment":{"type":"string","description":"blue_drop_2023 (the full Blue Drop audit, Blue Drop Report 2023), blue_drop_risk_2024 (the Blue Drop risk assessment of 2024, Blue Drop Progress Assessment Report 2025), green_drop_2024 (the full Green Drop audit of 2023/24, Green Drop Report 2025) or no_drop_risk_2025 (No Drop Progress Assessment Report 2025, on 2023/24 data)"},"year":{"type":"integer","description":"The year DWS labels the result with (the \"2024 Green Drop Score\")"},"unit":{"type":"string","description":"What was assessed: water_supply_system (Blue Drop), wastewater_system (Green Drop) or water_services_authority (No Drop, which assesses a municipality as a whole)"},"name":{"type":"string","description":"The system or works as DWS names it (for Green Drop, the wastewater treatment works); the authority for No Drop. Null where the report prints a scorecard without names"},"system":{"type":"string","description":"Green Drop only: the system's name in the scorecard heading, where it differs from the works'"},"water_services_provider":{"type":"string","description":"The bulk supplier or water services provider named on the scorecard, if any"},"water_services_authority":{"type":"string","description":"The water services authority (municipality) as the report names it; for Green Drop works municipalities don't run, the water services institution that does: a Department of Public Works and Infrastructure regional office (prisons, police stations, border posts, military bases), a public entity (Eskom, SANParks) or a company (Sasol, Sun City, Nedbank)"},"municipality_code":{"type":"string","description":"Municipal Demarcation Board code of that municipality (CPT, WC053, DC44), matched by name within the province; null for an institution that isn't a municipality"},"municipality":{"type":"string","description":"The municipality's name as the Municipal Demarcation Board gives it"},"province":{"type":"string","description":"Province, ISO 3166-2 (ZA-WC); for Public Works works, the province of the regional office; null for the public entities' and companies' works (their report doesn't give one)"},"score":{"type":"number","description":"Blue or Green Drop score, % (a full audit's score; null for risk assessments). Green Drop scores of 90% or more whose effluent fell short are capped at 89% (flag score_capped)"},"score_history":{"type":"object","description":"Earlier Blue, Green or No Drop scores printed beside this one, % by year"},"risk_rating":{"type":"number","description":"Risk as a % of the maximum: BDRR (Blue Drop), CRR (Green Drop) or NDRr (No Drop) for this assessment's year"},"risk_category":{"type":"string","description":"low (<50%), medium (50 to <70%), high (70 to <90%) or critical (90% or more), DWS's bands applied by us to risk_rating"},"risk_history":{"type":"object","description":"Earlier risk ratings printed beside this one, % by year"},"design_capacity":{"type":"number","description":"Design capacity, kilolitres a day"},"available_capacity":{"type":"number","description":"Available capacity, kilolitres a day (full audits)"},"operational_flow":{"type":"number","description":"Flow in use, kilolitres a day: system input volume (Blue Drop 2023) or works input volume (Blue Drop 2024). Green Drop scorecards give utilisation only"},"capacity_utilisation":{"type":"number","description":"Flow as a % of capacity, as printed"},"microbiological_compliance":{"type":"number","description":"Microbiological compliance, %: of drinking water with SANS 241 (Blue Drop), of final effluent with its authorisation (Green Drop)"},"chemical_compliance":{"type":"number","description":"Chemical compliance, % (Blue Drop: chemical health compliance)"},"physical_compliance":{"type":"number","description":"Green Drop only: physical effluent compliance, %"},"risk_defined_compliance":{"type":"number","description":"Blue Drop 2023 only: risk-defined compliance, %"},"microbiological_monitoring_compliance":{"type":"number","description":"Blue Drop 2024 only: microbiological monitoring compliance, %"},"chemical_monitoring_compliance":{"type":"number","description":"Blue Drop 2024 only: chemical monitoring compliance, %"},"technical_skills":{"type":"number","description":"Blue Drop 2024 only: technical skills (process controllers, supervisors, maintenance), %"},"water_safety_plan":{"type":"number","description":"Blue Drop 2024 only: water safety plan, %"},"average_daily_consumption":{"type":"number","description":"Blue Drop: average daily consumption, litres per person"},"kpa_scores":{"type":"object","description":"Full audits only: each key performance area's score, % (bonus and penalties included)"},"disqualifiers":{"type":"string","description":"Full audits only: disqualifiers applied, as printed (None, Disqualified)"},"site_assessment_score":{"type":"number","description":"Green Drop only: technical site assessment score, % (for the works inspected)"},"refurbishment_estimate":{"type":"number","description":"VROOM estimate of the cost to restore the works, rand (where estimated)"},"water_resource":{"type":"string","description":"Where water is abstracted from (Blue Drop 2023) or effluent discharged to (Green Drop), as printed"},"no_drop":{"type":"object","description":"No Drop only: DWS's municipal category, risk points (of 120), population and households served, standalone systems, metered and unmetered connections, km of mains, % of time pressurised, authorised volume and system input volume (kl a year), use of available resource %, human resources risk %, and for 2022/23 and 2023/24 the infrastructure leakage index, commercial losses (% of water lost), non-revenue water and physical losses (% of system input) and water use efficiency (litres per person a day); the accuracy of the water balance and the demand management strategy risk %"},"as_printed":{"type":"object","description":"Where DWS printed something other than a plain figure, what it printed, by field (NI: no information; N/A; NMR, used for works that don't discharge; a capped score)"},"flags":{"type":"array","description":"split_over_pages (the scorecard runs onto the next page), year_misprinted (the report labels the risk rows with the wrong years, read by position), on_category_boundary (a rating printed exactly on 50%, 70% or 90%, which DWS may count in the band below), score_capped, name_not_printed, read_from_picture (a No Drop card printed as a picture, read by OCR at three resolutions and kept where two agree)"},"source":{"type":"object","description":"Publisher, report, its address, and the PDF page the scorecard starts on; field_pages, where the scorecard runs onto the next page, gives the page of each figure printed there, by field"}}},"WeatherByWard":{"type":"object","title":"Rainfall and temperature by ward","description":"One record per place (2026 ward, municipality, district or province) and year, month (days) or the 1991 to 2020 normals","properties":{"id":{"type":"string","description":"level-code-period: ward-83204017-2026 (a year), ward-83204017-2026-11 (a month's days), ward-83204017-normals"},"kind":{"type":"string","description":"year (12 monthly figures), days (one figure a day of the month) or normals (1991 to 2020, by month)"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"year":{"type":"integer","description":"year records: the calendar year"},"month":{"type":"string","description":"days records: yyyy-mm"},"period":{"type":"string","description":"normals records: 1991-2020"},"rain_mm":{"type":"array","description":"Rain in mm: each month's total (year), each day's (days, the UTC day: ERA5-Land's 24 hours to 00:00 UTC) or the mean monthly total (normals); null where missing"},"tmax_c":{"type":"array","description":"C: the hottest day's high in each month (year), each day's high (days; the South African day, from 16 hourly values) or the mean hottest day (normals)"},"tmin_c":{"type":"array","description":"C: the coldest night's low in each month (year), each day's low (days) or the mean coldest night (normals)"},"hot_days":{"type":"array","description":"Days with a high of 35 C or more, each month (year) or their mean (normals). tmax_c, tmin_c and hot_days are left out of a year with none (before the daily years)"},"tmean_c":{"type":"array","description":"C: mean temperature at 2 m, from ERA5-Land's monthly means (year, normals)"},"basis":{"description":"year records: daily (worked out from each day) or monthly (ERA5-Land's monthly means: rain and mean temperature only) for each month; one word when every month is the same"},"daily_years":{"type":"integer","description":"normals: how many of the 30 years are loaded day by day (hottest day, coldest night and hot days need all 30)"},"years":{"type":"integer","description":"normals: years in the mean"},"source":{"type":"string","description":"ERA5-Land, Copernicus Climate Change Service (CC BY 4.0): modelled grid estimates at about 9 km, area-weighted to the place, not station readings"}}},"WildfireHistory":{"type":"object","title":"Burnt area and fire by ward","description":"One record per 2026 place (ward, municipality, district or province) and year (twelve months)","properties":{"id":{"type":"string","description":"level-code-year: ward-10408005-2017, municipality-WC048-2017"},"kind":{"type":"string","description":"year (twelve months)"},"level":{"type":"string","description":"ward, municipality, district or province (2026 MDB boundaries)"},"code":{"type":"string","description":"MDB ward code, municipality or district code, or ISO 3166-2 province code"},"name":{"type":"string","description":"The place's name"},"municipality_code":{"type":"string","description":"A ward's municipality"},"district_code":{"type":"string","description":"A ward's or municipality's district (a metro is its own district)"},"province":{"type":"string","description":"ISO 3166-2 province code"},"area_km2":{"type":"number","description":"The place's area (2026 MDB boundary), the base of burnt_pct"},"year":{"type":"integer","description":"The calendar year"},"fires":{"type":"array","description":"Each month's fire detections: NASA FIRMS, VIIRS on S-NPP (375 m), presumed vegetation fires (type 0), counted where the detection's position falls in the place; from February 2012; null where the source has no month yet"},"fires_nh":{"type":"array","description":"The same, nominal or high confidence only"},"fires_n20":{"type":"array","description":"The second reading: the same count from VIIRS on NOAA-20, from April 2018"},"burnt_ha":{"type":"array","description":"Each month's hectares burnt: CLMS Burnt Area 300 m version 4 (Sentinel-3), each pixel's burned fraction times its area, summed over the place; from July 2018; null where the product has no month yet"},"burnt_pct":{"type":"array","description":"burnt_ha as a percentage of the place's area"},"seen":{"type":"array","description":"The share (0 to 1) of the place's land seen often enough that month for the burnt-area product to tell (its 'too few observations' flag excluded)"},"source":{"type":"string","description":"The products and licences"}}}}}}