Docs
Every dataset, field by field
Every dataset is built to be read by people and by systems: free tool pages for everyone, and an API, CSV files and spreadsheet links behind them. Each record names its source, and each numbered release says what changed.
Open now: the free tools and their spreadsheet templates, with no sign-up. Not open yet: accounts and API keys, while we finish the datasets. These docs show what every call returns. Nothing is for sale.
Datasets
The live datasets. Each one’s records, source, freshness target and tool are on the datasets page; its last check and last change on the status page.
UM-001 Municipal electricity tariffs
One record per tariff, per distributor, per financial year. Updated annual. NERSA approves municipal tariffs from about April to June each year and they take effect on 1 July. Coverage: 2,222 tariffs from 175 distributors: every tariff in NERSA’s FY2026/27 decisions for every licensed distributor that has one published (175 of 176; City Power, Johannesburg’s, isn’t yet, and its gazetted 2026/27 notice wasn’t found on GPW by 12 Nov 2026), among them seven of the eight metros and the Nelson Mandela Bay domestic amendment. Eskom’s own tariffs aren’t included: Eskom’s terms don’t allow republishing its price schedule. Next: City Power when its 2026/27 decision (or, until then, its gazetted notice on GPW) is published, Nelson Mandela Bay’s original decision, and the 2027/28 decisions.
/v1/datasets/electricity-tariffs/records · /latest gives the newest financial year of every tariff, for each distributor
| Filter | Example | Meaning |
|---|---|---|
distributor | CPT | Municipal Demarcation Board code of the distributor |
category | residential | Tariff category: residential, commercial, large_power, embedded_generation, wheeling, generator or public_lighting |
financial_year | 2026/27 | Municipal financial year |
from, to | 2026-01-01 | Dates, on effective_from |
Fields (13)
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id: country, distributor, tariff and financial year |
distributor | string | Licensed distributor: Eskom or the municipality |
distributor_code | string | Municipal Demarcation Board code of the municipality (CPT, ETH) |
tariff | string | Tariff name as the decision gives it |
category | enum | residential, commercial, large_power, agricultural, embedded_generation, wheeling, generator, public_lighting or other |
financial_year | string | Municipal financial year, July to June |
effective_from | date | Date the tariff takes effect |
status | enum | Where the tariff is in NERSA's approval process |
charges | array | 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 | enum | Whether the charges include VAT, as the source states it |
source | object | Publisher, document, decision date, page and link |
flags | array | Machine-readable notes from checking: summary_rate_differs, suspect_value_in_source, obsolete_tariff, unit_not_stated |
notes | array | What each flag means for this record, in words |
curl "https://api.unmapped.co.za/v1/datasets/electricity-tariffs/records?distributor=CPT" \
-H "Authorization: Bearer um_live_your_key"
UM-007 Fuel prices by zone and grade
One record per zone (or national, for paraffin), per product, per monthly price adjustment. Updated monthly. Prices change on the first Wednesday of each month; the regulations with every zone's prices appear in the Government Gazette a day or so before. The daily check adds the month from the Government Printing Works' site as soon as the gazette is there (node scripts/datasets/fuel-prices.mjs --latest); the cloud job is paused. Coverage: 16,641 regulated prices from the monthly fuel price regulations in the Government Gazette: petrol (93 and 95, unleaded and lead replacement) and LPG in all 54 Magisterial District Zones, LPG imported through Saldanha Bay from January 2026, and illuminating paraffin's single maximum national retail price, for 61 monthly adjustments from 3 February 2021 to 4 November 2026. Not on the Government Printing Works' site: March to October 2021 and February 2022. Diesel and the price build-up (list price, zone differential, dealer margin) aren't gazetted, so they aren't included.
/v1/datasets/fuel-prices/records · /latest gives the current price of every product in every zone
| Filter | Example | Meaning |
|---|---|---|
zone | 9C | Magisterial District Zone (fuel-pricing zone) code, as the schedules print it; fuel-zone-lookup finds a town's zone |
product | diesel_50ppm | petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, diesel_500ppm, diesel_50ppm, illuminating_paraffin, lpg or lpg_saldanha_bay |
province | ZA-GP | Province code, ISO 3166-2 |
from, to | 2026-01-01 | Dates, on effective_from |
Fields (16)
| Field | Type | Meaning |
|---|---|---|
id | string | Zone (ZA for a national price), product and effective date (9C-petrol-95-ulp-2026-11-04) |
product | enum | petrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, lpg, lpg_saldanha_bay, illuminating_paraffin_retail |
product_name | string | The product in words |
price_type | enum | retail (petrol: the regulated pump price) or maximum_retail (LPG, and illuminating paraffin's single national maximum) |
unit | string | c/l (cents per litre), or c/kg for LPG; LPG includes VAT, petrol carries none |
zone | string | Magisterial District Zone as the gazette prints it (1A, 9C, 31J); null for paraffin, priced nationally |
zone_name | string | 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 | enum | coast (zone 1A) or inland (zone 9C, Gauteng): the two zones the department quotes its headline prices and changes for |
provinces | array | 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 | date | Date the price came into operation (00h01), from the regulations |
price | number | The regulated price, as the gazette prints it |
previous | number | The price a month earlier (same zone and product), if we have that month's gazette |
change | number | price minus previous |
flags | array | 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 | string | 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 | object | The Government Gazette issue and notice (gazette, notice, published) and the Government Printing Works' copy (url) |
curl "https://api.unmapped.co.za/v1/datasets/fuel-prices/records?zone=9C" \
-H "Authorization: Bearer um_live_your_key"
UM-016 Town to fuel-pricing zone lookup
One record per magisterial district. Updated monthly. Checked with each monthly fuel price release; the list itself changes rarely (last 8 November 2021). Coverage: 385 places: 378 magisterial districts with their codes, and 7 Namakwaland areas the list defines by coordinates, each with the fuel-pricing zone it's in (52 of the 54 zones; no district is listed for 10A and 60C), from National Treasury's list. Next: confirm against the department's own zone list, which isn't online.
/v1/datasets/fuel-zone-lookup/records · /latest gives every magisterial district and its zone
| Filter | Example | Meaning |
|---|---|---|
zone | 1A | Magisterial District Zone (fuel-pricing zone) code |
province | ZA-WC | Province code, ISO 3166-2 |
code | BV050 | Magisterial district code |
Fields (11)
| Field | Type | Meaning |
|---|---|---|
id | string | Magisterial district code (BV050), or for a Namakwaland area its name (NAMAKWALAND-PORT-NOLLOTH) |
magisterial_code | string | Magisterial district code as listed; null for the Namakwaland areas |
district | string | Magisterial district as listed (mostly named after its main town) |
names | array | Names to match a place on: the district name, and any other name given in brackets (Bathurst (Port Alfred) → Bathurst, Port Alfred) |
area_note | string | Where a district is split between zones, which part this is (east of 20° longitude) |
zone | string | Fuel price zone, written as the monthly schedules write it (9B), to join to fuel-prices |
zone_as_published | string | Zone as the list writes it (09B) |
province | string | Province as listed |
province_code | string | Province code, ISO 3166-2 (ZA-WC) |
flags | array | 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 | object | Publisher, list and its address |
curl "https://api.unmapped.co.za/v1/datasets/fuel-zone-lookup/records?zone=1A" \
-H "Authorization: Bearer um_live_your_key"
UM-003 Bargaining-council minimum wages
One record per minimum wage or levy: per instrument, wage table, area, occupation or grade, step and period. Updated as published. The Minister extends council agreements in the Government Gazette (about three a month across councils, some three months after the agreement); the National Minimum Wage changes on 1 March each year. Coverage: 1,047 minimum wages and levies from gazetted instruments: the National Minimum Wage (R30.23 an hour from 1 March 2026, with farm, domestic, public works and learnership rates), the contract cleaning (SD1) and wholesale and retail (SD9) sectoral determinations, and the agreements extended to non-parties of MIBCO (motor industry, to August 2028), NBCRFLI (road freight), NBCPSS (private security), BCCEI (civil engineering), the two contract cleaning councils (BCCCI in KwaZulu-Natal, the rates SD1 leaves to it; RBCCS in Gauteng, Gqeberha and Cape Town/Stellenbosch), NBCCI (chemical industry: its glass and fast-moving consumer goods sectors), the building councils of the Cape of Good Hope (BIBC) and North and West Boland, and the furniture council for Gauteng, North West, Mpumalanga, Limpopo and the Free State, with each agreement's levies where it prints them. Next: clothing (NBCCMI's gazetted tables ran to 31 August 2026; waiting for its next wage notice), the chemical industry's pharmaceutical sector (its agreement prints only the minimum before the agreed increases), hospitality, allowances and guaranteed increases, and a weekly scan of new gazettes.
/v1/datasets/wage-tables/records · /latest gives the newest period printed for every wage and levy (it may start later: check status and effective_from)
| Filter | Example | Meaning |
|---|---|---|
council | MIBCO | MIBCO, NBCRFLI, NBCPSS, BCCEI, or NMW and SD1/SD9 for the national minimum wage and sectoral determinations |
instrument | bargaining_council_agreement | bargaining_council_agreement, sectoral_determination or national_minimum_wage |
type | wage | wage or levy |
status | in_force | in_force, expired or upcoming on the release date |
area | Area 1 | Area as the gazette names it |
from, to | 2026-01-01 | Dates, on effective_from |
Fields (29)
| Field | Type | Meaning |
|---|---|---|
id | string | Stable id: council or instrument, notice number, table, occupation and step |
council | string | Bargaining council, or the statute for the national minimum wage and sectoral determinations |
council_code | string | 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 | enum | bargaining_council_agreement, national_minimum_wage or sectoral_determination |
agreement | string | The agreement or schedule the figure is in, as the gazette names it |
record_type | enum | wage (a minimum wage) or levy (a council levy) |
sector | string | The wage table's own heading: sector, division, chapter or schedule |
area | string | Area the figure applies in, as the gazette names it; National where the table has no areas |
area_definition | string | The places the area covers, in the gazette's words, where it defines them |
occupation | string | Job, class or grade as printed (for a levy, who it applies to) |
step | string | Experience step, year of training or learnership level, where the table has one |
job_titles | array | Job titles the gazette lists under a grade, where one grade covers several jobs |
amount | number | The figure as printed, in rand (or a percentage for a levy charged as a share of wages) |
unit | enum | hour, day, week or month for wages; day, week, month, percent_of_weekly_wage or percent_of_monthly_wage for levies |
also_printed | array | The same wage printed in other units on the same row ({amount, unit}), as the gazette prints them |
hours_basis | string | Hours and weeks the gazette uses to turn one unit into another (checked against every row) |
payer | enum | For levies: employee or employer |
effective_from | date | First day the figure binds every employer in scope, non-parties included |
effective_from_parties | date | 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 | date | Last day of the period the figure is for |
period_as_printed | string | The table's period in the gazette's words |
extended_to_non_parties | boolean | Whether the Minister extended the agreement to non-parties (null for statutory wages) |
non_parties_from | date | Date the extension binds non-parties, from the notice (often the second Monday after publication) |
non_parties_to | date | Date the extension ends |
status | enum | in_force, expired or upcoming on the version date |
gazette | object | 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 | array | 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 | array | What the flags mean for this record, and anything else the gazette says about the figure |
source | object | Publisher, gazette and notice, link to the gazette file, and page |
curl "https://api.unmapped.co.za/v1/datasets/wage-tables/records?council=MIBCO" \
-H "Authorization: Bearer um_live_your_key"
UM-006 Water quality by treatment works
One record per water supply system, wastewater system or (No Drop) water services authority, per assessment. Updated annual. DWS publishes Blue, Green and No Drop reports roughly yearly, alternating full audits and risk or progress assessments; check the IRIS releases folder each quarter. Coverage: 3,103 records: every system in the Department of Water and Sanitation's Green Drop 2024 audit (998 wastewater works: 848 municipal, 114 run by the Department of Public Works and Infrastructure, such as prisons, police stations, border posts and military bases, and 36 by Eskom, SANParks, Sasol, Sun City and Nedbank), Blue Drop 2023 full audit (958 water supply systems) and Blue Drop 2024 risk assessment (1,003 systems), each with its score or risk rating, compliance, capacity and flow, and the No Drop 2025 water-loss assessment of 144 water services authorities. Every municipality's record carries its Demarcation Board code. Next: links between the same system across assessments, the Green Drop Watch Report's flow watch lists, and earlier audit years beyond the history fields.
/v1/datasets/water-quality/records · /latest gives every system in each assessment
| Filter | Example | Meaning |
|---|---|---|
municipality | BUF | MDB code of the water services authority (a municipality, metro or district) |
province | ZA-EC | Province code, ISO 3166-2 |
programme | blue_drop | blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses) |
assessment | green_drop_2024 | blue_drop_2023, blue_drop_risk_2024, green_drop_2024 or no_drop_risk_2025 |
risk | critical | low, medium, high or critical |
Fields (39)
| Field | Type | Meaning |
|---|---|---|
id | string | 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 | enum | blue_drop (drinking water), green_drop (wastewater) or no_drop (water losses) |
assessment | enum | 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 | integer | The year DWS labels the result with (the "2024 Green Drop Score") |
unit | enum | 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 | string | 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 | string | Green Drop only: the system's name in the scorecard heading, where it differs from the works' |
water_services_provider | string | The bulk supplier or water services provider named on the scorecard, if any |
water_services_authority | string | 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 | string | 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 | string | The municipality's name as the Municipal Demarcation Board gives it |
province | string | 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 | number | 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 | object | Earlier Blue, Green or No Drop scores printed beside this one, % by year |
risk_rating | number | Risk as a % of the maximum: BDRR (Blue Drop), CRR (Green Drop) or NDRr (No Drop) for this assessment's year |
risk_category | enum | 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 | object | Earlier risk ratings printed beside this one, % by year |
design_capacity | number | Design capacity, kilolitres a day |
available_capacity | number | Available capacity, kilolitres a day (full audits) |
operational_flow | number | 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 | number | Flow as a % of capacity, as printed |
microbiological_compliance | number | Microbiological compliance, %: of drinking water with SANS 241 (Blue Drop), of final effluent with its authorisation (Green Drop) |
chemical_compliance | number | Chemical compliance, % (Blue Drop: chemical health compliance) |
physical_compliance | number | Green Drop only: physical effluent compliance, % |
risk_defined_compliance | number | Blue Drop 2023 only: risk-defined compliance, % |
microbiological_monitoring_compliance | number | Blue Drop 2024 only: microbiological monitoring compliance, % |
chemical_monitoring_compliance | number | Blue Drop 2024 only: chemical monitoring compliance, % |
technical_skills | number | Blue Drop 2024 only: technical skills (process controllers, supervisors, maintenance), % |
water_safety_plan | number | Blue Drop 2024 only: water safety plan, % |
average_daily_consumption | number | Blue Drop: average daily consumption, litres per person |
kpa_scores | object | Full audits only: each key performance area's score, % (bonus and penalties included) |
disqualifiers | string | Full audits only: disqualifiers applied, as printed (None, Disqualified) |
site_assessment_score | number | Green Drop only: technical site assessment score, % (for the works inspected) |
refurbishment_estimate | number | VROOM estimate of the cost to restore the works, rand (where estimated) |
water_resource | string | Where water is abstracted from (Blue Drop 2023) or effluent discharged to (Green Drop), as printed |
no_drop | object | 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 | object | 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 | array | 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 | object | 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 |
curl "https://api.unmapped.co.za/v1/datasets/water-quality/records?municipality=BUF" \
-H "Authorization: Bearer um_live_your_key"
UM-028 Dam levels with full history
One record per dam, per weekly State of Dams report. Updated weekly. DWS publishes the State of Dams every Monday, dated that Monday. Coverage: All 227 dams in the Department of Water and Sanitation's weekly State of Dams: 224 in South Africa, Katse and Mohale in Lesotho and Maguga in Eswatini, in every weekly report from 26 October 2026 (latest 9 November 2026), each with last week's and last year's level; and before that every week back to 26 April 2021 that DWS's dated Weekly State of the Reservoirs copies hold (190 reports, 42,137 dam-weeks; 114 weeks have no copy on DWS's site and stay empty; 230 stations, three no longer reported). History grows week by week.
/v1/datasets/dam-levels/records · /latest gives the latest weekly reading of every dam
| Filter | Example | Meaning |
|---|---|---|
station | D3R002 | DWS station code of a dam |
province | ZA-WC | Province code, ISO 3166-2 |
country | ZA | ZA, or LS and SZ for the Lesotho and Eswatini dams |
river | Orange River | River, as DWS names it |
from, to | 2026-01-01 | Dates, on report_date |
Fields (14)
| Field | Type | Meaning |
|---|---|---|
id | string | Station code and report date (D3R002-2026-10-26) |
station | string | The Department of Water and Sanitation's station code for the dam; stable from week to week |
dam | string | Dam name as DWS gives it |
river | string | River the dam is on |
country | string | ZA, or LS and SZ for the Lesotho and Eswatini dams that supply South Africa |
provinces | array | Province codes, ISO 3166-2 (ZA-FS); two where a dam sits on a provincial border |
report_date | date | Date of the weekly report |
full_supply_capacity | number | Full supply capacity, in million cubic metres |
percent_full | number | Storage as a % of full supply capacity this week; above 100 when the dam is over full supply |
percent_full_last_week | number | The same, a week earlier |
percent_full_last_year | number | The same, a year earlier |
volume | number | Water stored, in million cubic metres: capacity × % full, worked out by us |
flags | array | not_this_week (DWS shows its latest available reading, not this week's) and above_full_supply |
source | object | Publisher, report and the DWS page the figures come from |
curl "https://api.unmapped.co.za/v1/datasets/dam-levels/records?station=D3R002" \
-H "Authorization: Bearer um_live_your_key"
UM-142 Reference interest rates and legal limits
One record per rate, per date it took a new value. Updated monthly. The MPC announces its decision six times a year (January, March, May, July, September, November; dates in data/mpc-dates.json); a change takes effect the next day or so. The daily check records each decision from its announcement (data/repo-decisions.json) and releases. The next is on 19 November 2026. Coverage: The repo rate at every Monetary Policy Committee decision that changed it since November 2015 (30), recorded from the announcement, and prime as repo plus 3.5 points (the banks' convention). With them, the legal limits that follow the repo rate: the prescribed rate of interest, every rate since 8 January 2016 with the decision it follows and the Minister's Gazette notice, if any; and the National Credit Act's maximum interest rates for each of Table A's credit types since 6 May 2016. Next: repo decisions before 2015 from their announcements; the PFMA and SARS interest rates (set by notice).
/v1/datasets/reference-rates/records · /latest gives the current value of each rate
| Filter | Example | Meaning |
|---|---|---|
rate | prime_lending_rate | policy_rate (the repo rate), prime_lending_rate, prescribed_rate, or a National Credit Act maximum (nca_max_…) |
from, to | 2026-01-01 | Dates, on effective_from |
Fields (20)
| Field | Type | Meaning |
|---|---|---|
id | string | Rate and effective date (prescribed-rate-2026-11-01, nca-max-unsecured-2026-09-25) |
rate | enum | 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 | string | The rate in words |
effective_from | date | 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 | number | The rate, % a year (% a month where unit says so) |
previous | number | The value before this one (null for the first) |
change | number | value minus previous, in percentage points |
series_code | string | Always null (kept for older clients) |
flags | array | 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 | object | 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 | string | Legal limits and prime: % a year, or % a month (the NCA caps on short-term and incidental credit) |
formula | string | Legal limits and prime: how the value follows from the repo rate (Repo rate 7.25% + 3.5 points) |
repo_rate | number | Legal limits and prime: the policy rate the value follows, % a year (null for a fixed cap) |
based_on | string | 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 | date | Repo rate and prescribed rate: the day the Reserve Bank announced the repo decision it follows (the Act counts from this month) |
decision_source | string | Repo rate and prescribed rate: a public report of the decision (date and rate) |
gazette_notice | object | 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 | enum | Prescribed rate only: gazetted, gazetted_late, gazetted_different_date or not_gazetted |
credit_type | string | NCA caps only: the credit type in the words of Table A |
note | string | Legal limits and prime: what to know about this value |
curl "https://api.unmapped.co.za/v1/datasets/reference-rates/records?rate=prime_lending_rate" \
-H "Authorization: Bearer um_live_your_key"
UM-316 Rand exchange rates
One record per currency per business day. Kept current automatically. ECB reference rates: the daily job reads the ECB's last 90 days and releases any new or changed business day. Coverage: The rand against the US dollar, British pound, euro and Japanese yen on every TARGET business day from 4 January 1999 (7,132 days to 9 November 2026), from the European Central Bank's euro foreign exchange reference rates. The rand per euro is the ECB's own figure; the dollar, pound and yen are worked out through the euro, and each record says so. More currencies from the same table can follow.
/v1/datasets/exchange-rates/records · /latest gives the latest business day of each currency
| Filter | Example | Meaning |
|---|---|---|
currency | USD | USD, GBP, EUR or JPY |
from, to | 2026-01-01 | Dates, on date |
Fields (11)
| Field | Type | Meaning |
|---|---|---|
id | string | Currency and date (usd-2026-11-09) |
currency | enum | USD, GBP, EUR or JPY |
name | string | The currency in words |
date | date | 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 | number | Rand per unit of the currency (per yen for JPY) |
unit | string | Rand per US dollar, and so on |
basis | enum | 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 | number | The ECB's rand per euro that day |
currency_per_eur | number | The ECB's units of the currency per euro that day (null for the euro) |
flags | array | large_move: the rand moved more than 4% against this currency since the business day before |
source | object | The ECB's reference rates for the day, and how the value was worked out |
curl "https://api.unmapped.co.za/v1/datasets/exchange-rates/records?currency=USD" \
-H "Authorization: Bearer um_live_your_key"
UM-214 Ward and municipal boundaries with history
One record per ward, municipality or district, per demarcation cycle. Updated as published. The MDB redetermines municipal boundaries and delimits wards before each local government election (every five years); it can correct a layer between elections. Check its Spatial Knowledge Hub each quarter and after any redetermination notice. Coverage: Every ward, local and metropolitan municipality and district in the Municipal Demarcation Board's boundaries for the 2021 local government elections (4,468 wards, 213 municipalities, 52 districts and metros) and for the 2026 elections (4,485 wards, 213 municipalities, 52 districts and metros), with codes, names, areas, label points and the dates each cycle is in force. Shapes simplified with shared borders kept shared (wards to 5 m, municipalities and districts to 20 m). Next: the 2016 and 2011 cycles, then crosswalks to suburbs, police precincts and postal codes.
/v1/datasets/ward-boundaries/records · /latest gives the newest cycle of every ward, municipality and district
| Filter | Example | Meaning |
|---|---|---|
level | ward | ward, municipality or district |
cycle | 2026 | Demarcation cycle: the local government election the boundaries were drawn for |
province | ZA-WC | Province code, ISO 3166-2 |
municipality | CPT | MDB code of the local or metropolitan municipality |
district | DC12 | MDB code of the district (or metro) |
code | 19100001 | MDB code of one ward, municipality or district |
from, to | 2026-01-01 | Dates, on in_force_from |
Fields (18)
| Field | Type | Meaning |
|---|---|---|
id | string | Level, cycle and code (ward-2026-19100001, municipality-2026-CPT, district-2026-DC12) |
level | enum | ward, municipality (a local or metropolitan municipality) or district (a district municipality, or a metro, which is its own district) |
cycle | string | The demarcation cycle: the local government election the boundaries were drawn for (2021, 2026) |
code | string | The MDB code: an 8-digit ward id, a municipal code (CPT, EC124) or a district code (DC12, or the metro’s code) |
name | string | Name: the municipality’s or district’s, or "Ward n, Municipality" for a ward |
category | enum | Municipal category: A (metropolitan), B (local) or C (district); null for wards |
category_name | string | The category in words |
province | string | Province, ISO 3166-2 (ZA-WC) |
district_code | string | The district (or metro) it falls in |
district | string | The district’s name |
municipality_code | string | The local or metropolitan municipality it falls in (for wards and municipalities) |
municipality | string | The municipality’s name |
ward_number | integer | The ward’s number within its municipality |
area_km2 | number | Area in square kilometres, worked out from the shape |
label_point | array | A point inside the shape, [longitude, latitude], for a label or a quick map |
in_force_from | date | The date these boundaries took (or take) effect: the election they were drawn for |
in_force_to | date | The last day before the next cycle took effect; null while current |
source | object | Publisher, layer, the MDB service it comes from, and its licence |
curl "https://api.unmapped.co.za/v1/datasets/ward-boundaries/records?level=ward" \
-H "Authorization: Bearer um_live_your_key"
UM-108 Toll plazas and tariffs
One record per toll plaza point (mainline or ramp) per tariff year. Updated annual. The Minister determines new toll tariffs each year; the notices appear in the Government Gazette in early February and take effect on 1 March (2018: gazetted 28 March, effective 12 April). Check GPW's eGazettes from the first week of February. Coverage: 598 plaza tariffs: every toll plaza on the national toll roads, mainline and ramp (59 plazas and 75 points in 2026/27): SANRAL's ten toll roads (Huguenot, Vaal River, Great North, Tsitsikamma, South Coast, North Coast, Mariannhill, Magalies, N17, R30/R730/R34) and the Platinum (Bakwena), N3 Cedara to Heidelberg (N3TC) and N4 east (TRAC) concessions, with classes 1 to 4 including VAT and the year before beside each, for 2018/19, 2019/20 and 2021/22 to 2026/27. Positions and provinces from OpenStreetMap for 58 plazas (since 13 Nov 2026 Cullinan, Valtaki and Ekandustria from the unnamed booths on their signed ramps; K99 has none). Gauteng's e-toll gantries are not plazas and are left out: their toll declarations were withdrawn from 11 April 2024 at 23:59:59 (Notice 4587). Next: the 2020/21 notices and years before 2018 if a library holds them; the local user, public transport and frequent user tariffs the same notices publish.
/v1/datasets/toll-tariffs/records · /latest gives the newest tariff year of every plaza, mainline and ramp
| Filter | Example | Meaning |
|---|---|---|
route | N3 | National route: N1, N2, N3, N4, N17, or R30/R730/R34 |
plaza | Mooi | Toll plaza, as the gazette names it |
point | mainline | mainline, or a ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w |
operator | N3TC | SANRAL, or the concessionaire: Bakwena, N3TC or TRAC |
province | KwaZulu-Natal | Province, by name (from OpenStreetMap) |
tariff_year | 2026/27 | Tariff year, from 1 March |
from, to | 2026-01-01 | Dates, on effective_from |
Fields (23)
| Field | Type | Meaning |
|---|---|---|
id | string | Route, plaza, point and tariff year (za-n3-mooi-mainline-2026-27) |
plaza | string | Toll plaza as the 2026 gazette names it |
point | enum | 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 | string | The point as the gazette prints it |
route | string | National route (N1, N2, N3, N4, N17) or R30/R730/R34 |
toll_road | string | 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 | enum | SANRAL for its own toll roads, or the concessionaire: Bakwena (Platinum), N3TC (N3), TRAC (N4 east) |
operator_name | string | Operator in full |
province | string | Province the plaza is in, from OpenStreetMap (ODbL); null where no OSM toll booth carries its name |
latitude | number | Middle of the plaza's OpenStreetMap toll booths (ODbL), 4 decimals; ramps share their plaza's |
longitude | number | The same |
tariff_year | string | Year the tariffs apply, from 1 March (1 April in 2018) to the next adjustment: 2026/27 |
effective_from | date | Date and time from which the toll is payable, as the notice states (00:00 that day) |
class_1 | number | Light vehicles, in rand including VAT: motor cars, motorcycles and motor tricycles, with or without a trailer |
class_2 | number | Medium heavy vehicles (two axles), rand including VAT |
class_3 | number | Large heavy vehicles (three or four axles), rand including VAT |
class_4 | number | Extra large heavy vehicles (five or more axles), rand including VAT |
previous | object | 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 | enum | included: every notice states the tariffs include VAT |
source | object | Gazette, notice, date, English and Afrikaans table pages, the Government Printing Works link and the rights basis |
location_source | object | OpenStreetMap toll booths and province boundary the position and province come from (ODbL 1.0, (c) OpenStreetMap contributors) |
flags | array | 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 | array | What each flag means for this record, in words |
curl "https://api.unmapped.co.za/v1/datasets/toll-tariffs/records?route=N3" \
-H "Authorization: Bearer um_live_your_key"
UM-317 Rainfall and temperature by ward
One record per place (2026 ward, municipality, district or province) and year, month (its days) or the 1991 to 2020 normals. Updated weekly. Weekly (Tuesdays) from the Mac: ERA5-Land runs about 5 days behind the weather (RUNBOOK, weather-by-ward). Coverage: 296,774 records: every 2026 ward, municipality, district and province, every month since 1950, every day since 2025, to 2026-11-05 (a ward's months from 1991); normals 1991 to 2020.
/v1/datasets/weather-by-ward/records · /latest gives for every place, its newest year, newest month of days and its normals
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
kind | normals | year (twelve months), days (a month day by day) or normals (1991 to 2020) |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
year | 2025 | year records: the calendar year |
month | 2026-10 | days records: yyyy-mm |
Fields (20)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-period: ward-83204017-2026 (a year), ward-83204017-2026-11 (a month's days), ward-83204017-normals |
kind | string | year (12 monthly figures), days (one figure a day of the month) or normals (1991 to 2020, by month) |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
year | integer | year records: the calendar year |
month | string | days records: yyyy-mm |
period | string | normals records: 1991-2020 |
rain_mm | array | 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 | array | 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 | array | C: the coldest night's low in each month (year), each day's low (days) or the mean coldest night (normals) |
hot_days | array | 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 | array | C: mean temperature at 2 m, from ERA5-Land's monthly means (year, normals) |
basis | array or string | 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 | integer | normals: how many of the 30 years are loaded day by day (hottest day, coldest night and hot days need all 30) |
years | integer | normals: years in the mean |
source | string | 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 |
curl "https://api.unmapped.co.za/v1/datasets/weather-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-318 Dams from space
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. Updated monthly. Monthly from the Mac, after the month's Sentinel-2 scenes are in (RUNBOOK, dam-surface-from-space). Coverage: 189 of DWS's 227 dam stations (those with a full-supply outline from OpenStreetMap): the water surface each month from Sentinel-2 since January 2017, the year's average water surface from Landsat (Digital Earth Africa) since 1984, true-colour pictures a season since 2017 and a year 1984 to 2016, and a comparison with DWS's weekly level; since 12 Nov 2026 each dam's footprint from Digital Earth Africa's all-time water, Sentinel-1 radar for cloudy weeks, and an estimated % full from space with a band for 97 dams calibrated on DWS. 38 stations have no clean outline yet.
/v1/datasets/dam-surface-from-space/records · /latest gives every dam station: its outline, months, years and pictures (one record per station)
| Filter | Example | Meaning |
|---|---|---|
station | H6R001 | DWS station code of a dam (as dam-levels) |
province | ZA-WC | Province code, ISO 3166-2 |
Fields (23)
| Field | Type | Meaning |
|---|---|---|
id | string | The DWS station code (as dam-levels): one record per station |
station | string | DWS station code |
dam | string | The dam's name as DWS prints it |
river | string | The river, as DWS prints it |
country | string | ZA, LS (Lesotho) or SZ (Eswatini) |
provinces | array | ISO 3166-2 province codes, as dam-levels |
outline | object or null | 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 | string | Only where outline is null: why the dam has no outline (outside the extract, a reach of river, no name in OpenStreetMap) |
frame | object | 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 | object or null | 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 | array | 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 | array | 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 | array | 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 | array | 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 | object or null | 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 | object | 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 | object | 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 | array | 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 | object or null | 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 | object or null | 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 | object or null | 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 | object or null | 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 | object | 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) |
curl "https://api.unmapped.co.za/v1/datasets/dam-surface-from-space/records?station=H6R001" \
-H "Authorization: Bearer um_live_your_key"
UM-319 Land cover, built-up area and population by ward
One record per 2026 place and kind (profile, built-up, population). Updated yearly. Yearly: a new WorldPop year or GHSL release is read when its publisher puts it out (no forecasts or projections are used). Coverage: 14,277 records: every 2026 ward, municipality, district and province; land cover 2021, built-up area every five years 1975 to 2020, people (modelled) each year 2015 to 2026.
/v1/datasets/land-and-population-by-ward/records · /latest gives for every place, its land cover profile, built-up area and population records
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
kind | population | profile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled) |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
Fields (21)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-kind: ward-19100001-profile, municipality-CPT-built-up, province-ZA-WC-population |
kind | string | 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 | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
area_km2 | number | The place's area from its MDB boundary, km2 |
year | integer | profile: 2021, the year of ESA WorldCover |
mapped_km2 | number | profile: the area ESA WorldCover classes, km2 |
cover_pct | object | 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 | object | profile: each class's area, km2 |
years | array | built-up: 1975 to 2020 in five-year steps; population: 2015 to 2026 |
built_km2 | array | built-up: built-up surface (roofs and paved ground as GHSL sees them), km2, for each year |
built_pct | array | built-up: built-up surface as a share of the place's area, % |
modelled | boolean | population: always true. A modelled estimate, not the census |
people | array | population: people (WorldPop, modelled) for each year |
per_km2 | array | population: people per km2 of the place |
second | object | 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 | string | The source grid and licence (CC BY 4.0), summed over the place |
curl "https://api.unmapped.co.za/v1/datasets/land-and-population-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-320 Greenness by ward
One record per 2026 place and year, or its normals. Updated monthly. Monthly: Digital Earth Africa publishes a month's NDVI a few weeks after it ends; CLMS within days. Coverage: 52,349 records: every 2026 ward, municipality, district and province, monthly from January 2017 to 2026-10; normals 1984 to 2020.
/v1/datasets/greenness-by-ward/records · /latest gives for every place, its newest year and its normals
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
kind | normals | year (twelve months) or normals (1984 to 2020) |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
year | 2026 | year records: the calendar year |
Fields (15)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-period: ward-19100001-2026 (a year), municipality-CPT-normals |
kind | string | year (twelve months) or normals (1984 to 2020, by month) |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
year | integer | year records: the calendar year |
period | string | normals records: 1984-2020 |
ndvi | array | 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 | array | 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 | array | The share of the place seen (0 to 1) each month: pixels with a value through the clouds |
clms_ndvi | array | year records: the second reading, CLMS NDVI 300 m (version 3), the month's three 10-day images averaged, then over the place |
source | string | The products and licences, averaged over the place |
curl "https://api.unmapped.co.za/v1/datasets/greenness-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-034 Drought monitor by ward and municipality
One record per 2026 place and year. Updated monthly. Monthly: ERA5-Drought publishes a month within days of its end (the intermediate dataset, consolidated later); greenness a few weeks after. Coverage: 74,610 records: every 2026 ward (monthly from 2015) and municipality, district and province (from 1951), to 2026-10.
/v1/datasets/drought-index/records · /latest gives for every place, its newest year
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
year | 2017 | The calendar year |
Fields (18)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-year: ward-19100001-2026, municipality-CPT-2017 |
kind | string | year (twelve months) |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
year | integer | The calendar year |
index | array | 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 | array | 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 | array | Standardised precipitation index over 3 months, ours from ERA5-Land monthly rain (gamma distribution per calendar month, 1991 to 2020) |
spi12 | array | The same over 12 months |
spei12 | array | 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 | array | 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 | array | Rain over the 3 months to the month as a percentage of its 1991 to 2020 mean (ERA5-Land) |
era5_spi12 | array | The second reading: ERA5-Drought's own 12-month SPI, averaged over the place; not part of the index |
source | string | The products and licences |
curl "https://api.unmapped.co.za/v1/datasets/drought-index/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-045 Burnt area and fire by ward
One record per 2026 place and year. Updated monthly. Monthly: FIRMS within days of a month's end; CLMS publishes a month's burnt area some weeks after. Coverage: 71,385 records: every 2026 ward, municipality, district and province, fire detections monthly from February 2012 and burnt area from July 2018, to 2026-10.
/v1/datasets/wildfire-history/records · /latest gives for every place, its newest year
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | WC048 | MDB ward, municipality or district code, or ISO 3166-2 province code |
municipality | WC048 | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
year | 2017 | The calendar year |
Fields (17)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-year: ward-10408005-2017, municipality-WC048-2017 |
kind | string | year (twelve months) |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
area_km2 | number | The place's area (2026 MDB boundary), the base of burnt_pct |
year | integer | The calendar year |
fires | array | 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 | array | The same, nominal or high confidence only |
fires_n20 | array | The second reading: the same count from VIIRS on NOAA-20, from April 2018 |
burnt_ha | array | 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 | array | burnt_ha as a percentage of the place's area |
seen | array | 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 | string | The products and licences |
curl "https://api.unmapped.co.za/v1/datasets/wildfire-history/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-322 Surface water by ward
One record per 2026 place, every year 1984 to 2025. Updated yearly. Yearly: Digital Earth Africa publishes a year's WOfS summary early in the next year. Coverage: 4,759 records: every 2026 ward, municipality, district and province, each year from 1984 to 2025.
/v1/datasets/surface-water-by-ward/records · /latest gives for every place, its one record (a value a year from 1984)
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
Fields (15)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code: ward-19100001, municipality-CPT, province-ZA-WC |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
first_year | integer | The first year of the arrays (1984) |
last_year | integer | The last year of the arrays (2025) |
water_km2 | array | 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 | array | Each year's area wet in over 80% of its clear looks, km2 |
ever_km2 | array | Each year's area seen wet at least once, km2 |
seen | array | The share of the place (0 to 1) with at least one clear look that year |
area_km2 | number | The place's area as counted in 30 m pixels |
source | string | The products and licences, counted over the place |
curl "https://api.unmapped.co.za/v1/datasets/surface-water-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-321 Air quality by municipality
One record per 2026 place and year. Updated yearly. Yearly: CAMS adds a year of the EAC4 reanalysis in the following year; the newest months (CAMS global analyses) and Sentinel-5P's observed columns come later. Coverage: 6,302 records: every 2026 municipality, district and province, monthly from 2003 to 2025-12.
/v1/datasets/air-quality/records · /latest gives for every place, its newest year
| Filter | Example | Meaning |
|---|---|---|
level | municipality | municipality, district or province (2026 boundaries; no wards) |
code | JHB | MDB municipality or district code, or ISO 3166-2 province code |
district | DC31 | A municipality's district (MDB code) |
province | ZA-MP | Province code, ISO 3166-2 |
year | 2024 | The calendar year |
Fields (16)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code-year: municipality-MP312-2024, province-ZA-GP-2010 |
kind | string | year (twelve months) |
level | string | municipality, district or province (2026 MDB boundaries); no wards: the model's cells are about 80 km |
code | string | MDB municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
district_code | string | A municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
year | integer | The calendar year |
no2 | array | 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 | array | The same for ozone |
no2_col | array | 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 | array | The same for sulphur dioxide |
annual_no2 | number | The year's mean NO2 near the ground (only when all twelve months are there) |
who_no2_times | number | 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 | boolean | Always true: these are model figures, not ground measurements |
source | string | The product and licence |
curl "https://api.unmapped.co.za/v1/datasets/air-quality/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-323 Income tax tables, with history
One record per year of assessment (1 March to the end of February), named by the year it ends, as the Acts do. Updated annual. Watch GPW's Acts library for the Rates and Monetary Amounts and Amendment of Revenue Laws Act after each February Budget; the Budget day drill (3.15) uses the Act, never the speech or SARS's tables. Coverage: 13 years of assessment, 2014 to 2026 (1 March 2013 to the end of February 2026): the income tax table for natural persons, the three rebates, the s6A medical scheme fees tax credits and the retirement fund lump sum withdrawal and retirement tables. Not held: , whose fixing Act is not in GPW's online library; years before 2014 need GPW back issues.
/v1/datasets/tax-tables/records
Fields (14)
| Field | Type | Meaning |
|---|---|---|
id | string | tax-year-<the year it ends> (tax-year-2026 is 1 March 2025 to 28 February 2026) |
year | string | The year of assessment, named by the year it ends, as the Acts and payslips do |
starts | date | First day of the year of assessment (1 March) |
ends | date | Last day (28 or 29 February) |
status | enum | held (figures from the Act) or not_held (no Act fixing this year's rates is held; no figures) |
brackets | object | 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 | object | 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 | object | 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 | object | 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 | object | The retirement fund lump sum withdrawal benefit table (Schedule I of the Rates Act): brackets and cite |
lump_sum_retirement | object | The retirement fund lump sum benefit (retirement, death, retrenchment) table: brackets and cite |
sources | array | The Gazettes the record rests on: gazette, published, url (GPW's copy), sha256 of the file we read |
note | string | Why a year is not held, or null |
cite | object | 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 |
UM-324 Land surface temperature by ward
One record per 2026 place. Updated yearly. Yearly after summer (the owner's report: heat once a year, after summer); Landsat 8 and 9 scenes reach Digital Earth Africa's copy within weeks. Coverage: 4,759 records: every 2026 ward, municipality, district and province, monthly from January 1984 to 2026-10, with each summer and each ward against its municipality.
/v1/datasets/heat-by-ward/records · /latest gives for every place, its one record (a value a month from January 1984)
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
Fields (16)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code: ward-19100077, municipality-CPT, province-ZA-WC |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
first_month | string | The month of the first value in lst and looks (1984-01) |
last_month | string | The month of the last value in lst and looks |
lst | array | 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 | array | How many clear looks the average 240 m cell of the place had that month (0 = none) |
first_summer | integer | The year of the first value in summer_lst (a summer is December to February, named by the year it ends) |
summer_lst | array | 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 | array | Wards only: the ward's summer against its municipality's, degrees C (above 0 = hotter), over the months both have |
cells | integer | The place's 240 m cells (EPSG:6933), the base of looks |
source | string | The product and its credit |
curl "https://api.unmapped.co.za/v1/datasets/heat-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-306 Government Gazette notice index, national
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). Updated daily. Read GPW's national listing again (node scripts/datasets/gazette-index-fetch.mjs), read any newly held Gazettes (gazette-index-held.mjs --known, or a full scan after new downloads), build (gazette-index.mjs) and cut; downloads only within the shared 30 a day. Coverage: Every national Government Gazette in GPW's online libraries, 2016-05-20 to 2026-11-13 (7,719 Gazettes), with number, date, publisher and GPW's link. Notices (number, title, kind, page, closing date for comment) are listed for the 439 Gazettes we hold as GPW's own copy; the rest are listed as issues whose notices are not read yet. Gazettes before May 2016 are not online at GPW.
/v1/datasets/gazette-index/records · /latest gives every record (the index has one version of each)
| Filter | Example | Meaning |
|---|---|---|
gazette | 55679 | Government Gazette number |
department | Forestry, Fisheries and the Environment | Who published it: a notice's printed heading, else GPW's file label read into a department's name |
kind | draft for comment | act, regulation, notice, draft for comment, proclamation, board notice, or not read |
notice | R. 8127 | The notice number as printed |
from, to | 2026-01-01 | Dates, on date |
Fields (22)
| Field | Type | Meaning |
|---|---|---|
id | string | gg-<Gazette number> for a Gazette whose notices are not listed yet; gg-<number>-<notice number> for a notice |
gazette | string | The Government Gazette number |
date | date | The Gazette's date (GPW's listing; the cover where a held copy disagrees and a person has read it, see date_note) |
department | string | 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 | string | For a notice: the Gazette's publisher as GPW names the file |
gpw_name | string | GPW's own label in the file name, as typed |
kind | string | act, regulation, notice, draft for comment, proclamation, board notice, or not read (a Gazette whose notices are not listed yet) |
notice | string | The notice number as printed (R. 8127 for a regulation), or null |
title | string | 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 | boolean | True when the title is withheld because the notice names a private person; the Gazette itself is at GPW's link |
page | integer | The page the notice starts on, in the Gazette |
comment_closes | date | For a draft: the date comments close, printed or counted (see comment_rule) |
comment_rule | string | "printed", or how the date was counted from the notice's period |
comment_earliest | boolean | True when the period runs from the Gazette or a newspaper, whichever is later: the date is the earliest close |
comment_words | string | The notice's own words the closing date was read from |
read | string | "two readings" when the notice number is on its page in both text readings; "contents only" otherwise |
extraordinary | boolean | GPW files it as a separate (extraordinary) issue |
withdrawn | boolean | GPW marks its only file withdrawn |
gpw | string | GPW's own download link for the Gazette |
gpw_bytes | integer | The size of GPW's file |
held | string | The sha256 of our stored copy (GPW's file, byte for byte), when we hold it |
notice_page | string | The slug of its page at /notice/<slug>, when one exists |
curl "https://api.unmapped.co.za/v1/datasets/gazette-index/records?gazette=55679" \
-H "Authorization: Bearer um_live_your_key"
UM-325 Night light by ward
One record per 2026 place. Updated monthly. Monthly, some weeks after the month (NASA posts the monthly composite once its nights are processed); the yearly composite early the next year. Coverage: 4,759 records: every 2026 ward, municipality, district and province, monthly from January 2012 to October 2026 and yearly from 2012 to 2025.
/v1/datasets/night-light-by-ward/records · /latest gives for every place, its one record (a value a month from January 2012 and a value a year from 2012)
| Filter | Example | Meaning |
|---|---|---|
level | municipality | ward, municipality, district or province (2026 boundaries) |
code | CPT | MDB ward, municipality or district code, or ISO 3166-2 province code |
municipality | CPT | A ward's municipality (MDB code) |
province | ZA-WC | Province code, ISO 3166-2 |
Fields (25)
| Field | Type | Meaning |
|---|---|---|
id | string | level-code: ward-19100077, municipality-CPT, province-ZA-WC |
level | string | ward, municipality, district or province (2026 MDB boundaries) |
code | string | MDB ward code, municipality or district code, or ISO 3166-2 province code |
name | string | The place's name |
municipality_code | string | A ward's municipality |
district_code | string | A ward's or municipality's district (a metro is its own district) |
province | string | ISO 3166-2 province code |
area_km2 | number | The place's area on the Black Marble grid (km2) |
first_month | string | The month of the first value in the monthly arrays (2012-01) |
last_month | string | The month of the last value in the monthly arrays |
rad | array | 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 | array | 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 | array | Each month's share of the place with a value (%) |
gap | array | Each month's share of the seen area that NASA filled from earlier months because no clear night was seen (%) |
nights | array | Each month's mean number of clear nights behind a pixel |
first_year | integer | The year of the first value in the yearly arrays (2012) |
last_year | integer | The year of the last value in the yearly arrays |
year_rad | array | 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 | array | Each year's lit share of the area seen (%), yearly product |
year_bright | array | Each year's bright share of the area seen (%): radiance 5 nW/cm2/sr or more, yearly product |
year_seen | array | Each year's share of the place with a value (%) |
year_gap | array | Each year's gap-filled share of the seen area (%) |
year_total | array | Each year's total light: radiance times area, summed over the place (nW/cm2/sr x km2), yearly product |
wards_year | array | Municipalities only: each ward's newest year as [ward code, mean radiance, lit share %], by ward code |
source | string | The product and its credit |
curl "https://api.unmapped.co.za/v1/datasets/night-light-by-ward/records?level=municipality" \
-H "Authorization: Bearer um_live_your_key"
UM-326 Social grant amounts, with history
One record per grant, with every amount held in date order. Updated annual. The nightly GPW queue reads the year's Social Development and Regulation Gazettes from March; the Budget day drill (3.15) uses the gazetted notice, never the speech or SASSA's site. Coverage: The nine grants of the Social Assistance Act (older person's, 75 and older, war veteran's, disability, care dependency, foster child, child support and its top-up, grant-in-aid): the amounts from 2026-04-01 and the amounts in force before, as the notice print them (GG 54397 (2026-03-23)). Earlier years: GPW's online archive goes back to 2018; their notices are queued (scripts/datasets/w1b-gpw-queue.mjs).
/v1/datasets/social-grants/records
Fields (11)
| Field | Type | Meaning |
|---|---|---|
id | string | The grant: older-persons, older-persons-75, war-veterans, disability, care-dependency, foster-child, child-support, child-support-top-up, grant-in-aid |
name | string | The grant's name in plain words |
unit | string | Rand a month: the maximum the notice sets (the means test can pay less) |
amount | number | The maximum a month in force on as_on, in rand: base plus additional |
base | number | 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 | number | 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 | date | 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 | date | The day the release was cut, for amount and in_force_from |
history | array | 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 | array | The Gazettes the record rests on: gazette, notice, page, published, url (GPW's copy), sha256 of the file we read |
cite | object | In every amount: gazette, notice (No. R. 7287), notice_date, page (the Gazette page), published, url, sha256, title |
UM-328 School terms, from the Gazette
One record per school year: its four terms for public schools. Updated annual. The nightly GPW queue reads Basic Education Gazettes from September to December; an amended calendar is its own notice, never written over the earlier one. Coverage: The four terms for public schools in every province, school years 2028, as the gazetted calendar's summary prints them (GG 55619 (2026-10-23)), with its special school holidays and the public holidays it lists. Other years: the Minister gazettes each calendar about a year ahead; GPW's online archive goes back to 2018, and those notices are queued (scripts/datasets/w1b-gpw-queue.mjs).
/v1/datasets/school-terms/records
Fields (8)
| Field | Type | Meaning |
|---|---|---|
id | string | school-year-<year> |
year | number | The school year (a calendar year) |
terms | array | 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 | object | The summary's own Total row: weeks, days, school_days (the terms add up to it: checked) |
special_school_holidays | array | Dates the calendar marks as special school holidays |
public_holidays | array | The public holidays the notice lists beside the calendar, { date, name } as printed (checked against the public holidays tool: the same days) |
cite | object | gazette, notice (No. 8081), notice_page, summary_page (the Gazette page of the summary table), published, url (GPW's copy), sha256, title |
note | string | What the record does not say |