Unmapped Dataworks

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

FilterExampleMeaning
distributorCPTMunicipal Demarcation Board code of the distributor
categoryresidentialTariff category: residential, commercial, large_power, embedded_generation, wheeling, generator or public_lighting
financial_year2026/27Municipal financial year
from, to2026-01-01Dates, on effective_from
Fields (13)
FieldTypeMeaning
idstringStable id: country, distributor, tariff and financial year
distributorstringLicensed distributor: Eskom or the municipality
distributor_codestringMunicipal Demarcation Board code of the municipality (CPT, ETH)
tariffstringTariff name as the decision gives it
categoryenumresidential, commercial, large_power, agricultural, embedded_generation, wheeling, generator, public_lighting or other
financial_yearstringMunicipal financial year, July to June
effective_fromdateDate the tariff takes effect
statusenumWhere the tariff is in NERSA's approval process
chargesarrayEach 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)
vatenumWhether the charges include VAT, as the source states it
sourceobjectPublisher, document, decision date, page and link
flagsarrayMachine-readable notes from checking: summary_rate_differs, suspect_value_in_source, obsolete_tariff, unit_not_stated
notesarrayWhat 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

FilterExampleMeaning
zone9CMagisterial District Zone (fuel-pricing zone) code, as the schedules print it; fuel-zone-lookup finds a town's zone
productdiesel_50ppmpetrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, diesel_500ppm, diesel_50ppm, illuminating_paraffin, lpg or lpg_saldanha_bay
provinceZA-GPProvince code, ISO 3166-2
from, to2026-01-01Dates, on effective_from
Fields (16)
FieldTypeMeaning
idstringZone (ZA for a national price), product and effective date (9C-petrol-95-ulp-2026-11-04)
productenumpetrol_93_ulp, petrol_95_ulp, petrol_93_lrp, petrol_95_lrp, lpg, lpg_saldanha_bay, illuminating_paraffin_retail
product_namestringThe product in words
price_typeenumretail (petrol: the regulated pump price) or maximum_retail (LPG, and illuminating paraffin's single national maximum)
unitstringc/l (cents per litre), or c/kg for LPG; LPG includes VAT, petrol carries none
zonestringMagisterial District Zone as the gazette prints it (1A, 9C, 31J); null for paraffin, priced nationally
zone_namestring9C 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_areaenumcoast (zone 1A) or inland (zone 9C, Gauteng): the two zones the department quotes its headline prices and changes for
provincesarrayProvince 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_fromdateDate the price came into operation (00h01), from the regulations
pricenumberThe regulated price, as the gazette prints it
previousnumberThe price a month earlier (same zone and product), if we have that month's gazette
changenumberprice minus previous
flagsarrayprevious_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
notestringWhat to know about this price, where there is something: a misprint, with the figure the gazette itself implies, or the correction it came from
sourceobjectThe 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

FilterExampleMeaning
zone1AMagisterial District Zone (fuel-pricing zone) code
provinceZA-WCProvince code, ISO 3166-2
codeBV050Magisterial district code
Fields (11)
FieldTypeMeaning
idstringMagisterial district code (BV050), or for a Namakwaland area its name (NAMAKWALAND-PORT-NOLLOTH)
magisterial_codestringMagisterial district code as listed; null for the Namakwaland areas
districtstringMagisterial district as listed (mostly named after its main town)
namesarrayNames to match a place on: the district name, and any other name given in brackets (Bathurst (Port Alfred) → Bathurst, Port Alfred)
area_notestringWhere a district is split between zones, which part this is (east of 20° longitude)
zonestringFuel price zone, written as the monthly schedules write it (9B), to join to fuel-prices
zone_as_publishedstringZone as the list writes it (09B)
provincestringProvince as listed
province_codestringProvince code, ISO 3166-2 (ZA-WC)
flagsarrayno_magisterial_code: one of the Namakwaland areas (zones 31J to 37J), which the list defines by latitude and longitude instead of a magisterial district
sourceobjectPublisher, 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)

FilterExampleMeaning
councilMIBCOMIBCO, NBCRFLI, NBCPSS, BCCEI, or NMW and SD1/SD9 for the national minimum wage and sectoral determinations
instrumentbargaining_council_agreementbargaining_council_agreement, sectoral_determination or national_minimum_wage
typewagewage or levy
statusin_forcein_force, expired or upcoming on the release date
areaArea 1Area as the gazette names it
from, to2026-01-01Dates, on effective_from
Fields (29)
FieldTypeMeaning
idstringStable id: council or instrument, notice number, table, occupation and step
councilstringBargaining council, or the statute for the national minimum wage and sectoral determinations
council_codestringShort 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
instrumentenumbargaining_council_agreement, national_minimum_wage or sectoral_determination
agreementstringThe agreement or schedule the figure is in, as the gazette names it
record_typeenumwage (a minimum wage) or levy (a council levy)
sectorstringThe wage table's own heading: sector, division, chapter or schedule
areastringArea the figure applies in, as the gazette names it; National where the table has no areas
area_definitionstringThe places the area covers, in the gazette's words, where it defines them
occupationstringJob, class or grade as printed (for a levy, who it applies to)
stepstringExperience step, year of training or learnership level, where the table has one
job_titlesarrayJob titles the gazette lists under a grade, where one grade covers several jobs
amountnumberThe figure as printed, in rand (or a percentage for a levy charged as a share of wages)
unitenumhour, day, week or month for wages; day, week, month, percent_of_weekly_wage or percent_of_monthly_wage for levies
also_printedarrayThe same wage printed in other units on the same row ({amount, unit}), as the gazette prints them
hours_basisstringHours and weeks the gazette uses to turn one unit into another (checked against every row)
payerenumFor levies: employee or employer
effective_fromdateFirst day the figure binds every employer in scope, non-parties included
effective_from_partiesdateFirst day it binds the parties to the council, where the gazette gives a different date (a retrospective start can bind only the parties)
effective_todateLast day of the period the figure is for
period_as_printedstringThe table's period in the gazette's words
extended_to_non_partiesbooleanWhether the Minister extended the agreement to non-parties (null for statutory wages)
non_parties_fromdateDate the extension binds non-parties, from the notice (often the second Monday after publication)
non_parties_todateDate the extension ends
statusenumin_force, expired or upcoming on the version date
gazetteobjectGovernment Gazette number, Regulation Gazette number, notice number, date and page; correction, where a later correction notice fixed the date the extension binds non-parties
flagsarrayMachine-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
notesarrayWhat the flags mean for this record, and anything else the gazette says about the figure
sourceobjectPublisher, 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

FilterExampleMeaning
municipalityBUFMDB code of the water services authority (a municipality, metro or district)
provinceZA-ECProvince code, ISO 3166-2
programmeblue_dropblue_drop (drinking water), green_drop (wastewater) or no_drop (water losses)
assessmentgreen_drop_2024blue_drop_2023, blue_drop_risk_2024, green_drop_2024 or no_drop_risk_2025
riskcriticallow, medium, high or critical
Fields (39)
FieldTypeMeaning
idstringAssessment, 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
programmeenumblue_drop (drinking water), green_drop (wastewater) or no_drop (water losses)
assessmentenumblue_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)
yearintegerThe year DWS labels the result with (the "2024 Green Drop Score")
unitenumWhat was assessed: water_supply_system (Blue Drop), wastewater_system (Green Drop) or water_services_authority (No Drop, which assesses a municipality as a whole)
namestringThe 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
systemstringGreen Drop only: the system's name in the scorecard heading, where it differs from the works'
water_services_providerstringThe bulk supplier or water services provider named on the scorecard, if any
water_services_authoritystringThe 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_codestringMunicipal Demarcation Board code of that municipality (CPT, WC053, DC44), matched by name within the province; null for an institution that isn't a municipality
municipalitystringThe municipality's name as the Municipal Demarcation Board gives it
provincestringProvince, 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)
scorenumberBlue 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_historyobjectEarlier Blue, Green or No Drop scores printed beside this one, % by year
risk_ratingnumberRisk as a % of the maximum: BDRR (Blue Drop), CRR (Green Drop) or NDRr (No Drop) for this assessment's year
risk_categoryenumlow (<50%), medium (50 to <70%), high (70 to <90%) or critical (90% or more), DWS's bands applied by us to risk_rating
risk_historyobjectEarlier risk ratings printed beside this one, % by year
design_capacitynumberDesign capacity, kilolitres a day
available_capacitynumberAvailable capacity, kilolitres a day (full audits)
operational_flownumberFlow 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_utilisationnumberFlow as a % of capacity, as printed
microbiological_compliancenumberMicrobiological compliance, %: of drinking water with SANS 241 (Blue Drop), of final effluent with its authorisation (Green Drop)
chemical_compliancenumberChemical compliance, % (Blue Drop: chemical health compliance)
physical_compliancenumberGreen Drop only: physical effluent compliance, %
risk_defined_compliancenumberBlue Drop 2023 only: risk-defined compliance, %
microbiological_monitoring_compliancenumberBlue Drop 2024 only: microbiological monitoring compliance, %
chemical_monitoring_compliancenumberBlue Drop 2024 only: chemical monitoring compliance, %
technical_skillsnumberBlue Drop 2024 only: technical skills (process controllers, supervisors, maintenance), %
water_safety_plannumberBlue Drop 2024 only: water safety plan, %
average_daily_consumptionnumberBlue Drop: average daily consumption, litres per person
kpa_scoresobjectFull audits only: each key performance area's score, % (bonus and penalties included)
disqualifiersstringFull audits only: disqualifiers applied, as printed (None, Disqualified)
site_assessment_scorenumberGreen Drop only: technical site assessment score, % (for the works inspected)
refurbishment_estimatenumberVROOM estimate of the cost to restore the works, rand (where estimated)
water_resourcestringWhere water is abstracted from (Blue Drop 2023) or effluent discharged to (Green Drop), as printed
no_dropobjectNo 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_printedobjectWhere 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)
flagsarraysplit_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)
sourceobjectPublisher, 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

FilterExampleMeaning
stationD3R002DWS station code of a dam
provinceZA-WCProvince code, ISO 3166-2
countryZAZA, or LS and SZ for the Lesotho and Eswatini dams
riverOrange RiverRiver, as DWS names it
from, to2026-01-01Dates, on report_date
Fields (14)
FieldTypeMeaning
idstringStation code and report date (D3R002-2026-10-26)
stationstringThe Department of Water and Sanitation's station code for the dam; stable from week to week
damstringDam name as DWS gives it
riverstringRiver the dam is on
countrystringZA, or LS and SZ for the Lesotho and Eswatini dams that supply South Africa
provincesarrayProvince codes, ISO 3166-2 (ZA-FS); two where a dam sits on a provincial border
report_datedateDate of the weekly report
full_supply_capacitynumberFull supply capacity, in million cubic metres
percent_fullnumberStorage as a % of full supply capacity this week; above 100 when the dam is over full supply
percent_full_last_weeknumberThe same, a week earlier
percent_full_last_yearnumberThe same, a year earlier
volumenumberWater stored, in million cubic metres: capacity × % full, worked out by us
flagsarraynot_this_week (DWS shows its latest available reading, not this week's) and above_full_supply
sourceobjectPublisher, 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

FilterExampleMeaning
rateprime_lending_ratepolicy_rate (the repo rate), prime_lending_rate, prescribed_rate, or a National Credit Act maximum (nca_max_…)
from, to2026-01-01Dates, on effective_from
Fields (20)
FieldTypeMeaning
idstringRate and effective date (prescribed-rate-2026-11-01, nca-max-unsecured-2026-09-25)
rateenumpolicy_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
namestringThe rate in words
effective_fromdateFirst 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
valuenumberThe rate, % a year (% a month where unit says so)
previousnumberThe value before this one (null for the first)
changenumbervalue minus previous, in percentage points
series_codestringAlways null (kept for older clients)
flagsarrayfirst_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
sourceobjectFor 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
unitstringLegal limits and prime: % a year, or % a month (the NCA caps on short-term and incidental credit)
formulastringLegal limits and prime: how the value follows from the repo rate (Repo rate 7.25% + 3.5 points)
repo_ratenumberLegal limits and prime: the policy rate the value follows, % a year (null for a fixed cap)
based_onstringLegal limits and prime: the repo change the value follows, as policy-rate-<the day it took effect> (null for a fixed cap)
decision_datedateRepo rate and prescribed rate: the day the Reserve Bank announced the repo decision it follows (the Act counts from this month)
decision_sourcestringRepo rate and prescribed rate: a public report of the decision (date and rate)
gazette_noticeobjectPrescribed 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_statusenumPrescribed rate only: gazetted, gazetted_late, gazetted_different_date or not_gazetted
credit_typestringNCA caps only: the credit type in the words of Table A
notestringLegal 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

FilterExampleMeaning
currencyUSDUSD, GBP, EUR or JPY
from, to2026-01-01Dates, on date
Fields (11)
FieldTypeMeaning
idstringCurrency and date (usd-2026-11-09)
currencyenumUSD, GBP, EUR or JPY
namestringThe currency in words
datedateThe 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)
valuenumberRand per unit of the currency (per yen for JPY)
unitstringRand per US dollar, and so on
basisenumecb (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_eurnumberThe ECB's rand per euro that day
currency_per_eurnumberThe ECB's units of the currency per euro that day (null for the euro)
flagsarraylarge_move: the rand moved more than 4% against this currency since the business day before
sourceobjectThe 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

FilterExampleMeaning
levelwardward, municipality or district
cycle2026Demarcation cycle: the local government election the boundaries were drawn for
provinceZA-WCProvince code, ISO 3166-2
municipalityCPTMDB code of the local or metropolitan municipality
districtDC12MDB code of the district (or metro)
code19100001MDB code of one ward, municipality or district
from, to2026-01-01Dates, on in_force_from
Fields (18)
FieldTypeMeaning
idstringLevel, cycle and code (ward-2026-19100001, municipality-2026-CPT, district-2026-DC12)
levelenumward, municipality (a local or metropolitan municipality) or district (a district municipality, or a metro, which is its own district)
cyclestringThe demarcation cycle: the local government election the boundaries were drawn for (2021, 2026)
codestringThe MDB code: an 8-digit ward id, a municipal code (CPT, EC124) or a district code (DC12, or the metro’s code)
namestringName: the municipality’s or district’s, or "Ward n, Municipality" for a ward
categoryenumMunicipal category: A (metropolitan), B (local) or C (district); null for wards
category_namestringThe category in words
provincestringProvince, ISO 3166-2 (ZA-WC)
district_codestringThe district (or metro) it falls in
districtstringThe district’s name
municipality_codestringThe local or metropolitan municipality it falls in (for wards and municipalities)
municipalitystringThe municipality’s name
ward_numberintegerThe ward’s number within its municipality
area_km2numberArea in square kilometres, worked out from the shape
label_pointarrayA point inside the shape, [longitude, latitude], for a label or a quick map
in_force_fromdateThe date these boundaries took (or take) effect: the election they were drawn for
in_force_todateThe last day before the next cycle took effect; null while current
sourceobjectPublisher, 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

FilterExampleMeaning
routeN3National route: N1, N2, N3, N4, N17, or R30/R730/R34
plazaMooiToll plaza, as the gazette names it
pointmainlinemainline, or a ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w
operatorN3TCSANRAL, or the concessionaire: Bakwena, N3TC or TRAC
provinceKwaZulu-NatalProvince, by name (from OpenStreetMap)
tariff_year2026/27Tariff year, from 1 March
from, to2026-01-01Dates, on effective_from
Fields (23)
FieldTypeMeaning
idstringRoute, plaza, point and tariff year (za-n3-mooi-mainline-2026-27)
plazastringToll plaza as the 2026 gazette names it
pointenummainline, or the ramp plaza: ramp, ramp_n, ramp_s, ramp_e or ramp_w (the gazette's Ramp (N), (S), (E), (W))
point_labelstringThe point as the gazette prints it
routestringNational route (N1, N2, N3, N4, N17) or R30/R730/R34
toll_roadstringToll 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
operatorenumSANRAL for its own toll roads, or the concessionaire: Bakwena (Platinum), N3TC (N3), TRAC (N4 east)
operator_namestringOperator in full
provincestringProvince the plaza is in, from OpenStreetMap (ODbL); null where no OSM toll booth carries its name
latitudenumberMiddle of the plaza's OpenStreetMap toll booths (ODbL), 4 decimals; ramps share their plaza's
longitudenumberThe same
tariff_yearstringYear the tariffs apply, from 1 March (1 April in 2018) to the next adjustment: 2026/27
effective_fromdateDate and time from which the toll is payable, as the notice states (00:00 that day)
class_1numberLight vehicles, in rand including VAT: motor cars, motorcycles and motor tricycles, with or without a trailer
class_2numberMedium heavy vehicles (two axles), rand including VAT
class_3numberLarge heavy vehicles (three or four axles), rand including VAT
class_4numberExtra large heavy vehicles (five or more axles), rand including VAT
previousobjectThe 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
vatenumincluded: every notice states the tariffs include VAT
sourceobjectGazette, notice, date, English and Afrikaans table pages, the Government Printing Works link and the rights basis
location_sourceobjectOpenStreetMap toll booths and province boundary the position and province come from (ODbL 1.0, (c) OpenStreetMap contributors)
flagsarraychange_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
notesarrayWhat 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

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
kindnormalsyear (twelve months), days (a month day by day) or normals (1991 to 2020)
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
year2025year records: the calendar year
month2026-10days records: yyyy-mm
Fields (20)
FieldTypeMeaning
idstringlevel-code-period: ward-83204017-2026 (a year), ward-83204017-2026-11 (a month's days), ward-83204017-normals
kindstringyear (12 monthly figures), days (one figure a day of the month) or normals (1991 to 2020, by month)
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
yearintegeryear records: the calendar year
monthstringdays records: yyyy-mm
periodstringnormals records: 1991-2020
rain_mmarrayRain 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_carrayC: 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_carrayC: the coldest night's low in each month (year), each day's low (days) or the mean coldest night (normals)
hot_daysarrayDays 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_carrayC: mean temperature at 2 m, from ERA5-Land's monthly means (year, normals)
basisarray or stringyear 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_yearsintegernormals: how many of the 30 years are loaded day by day (hottest day, coldest night and hot days need all 30)
yearsintegernormals: years in the mean
sourcestringERA5-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)

FilterExampleMeaning
stationH6R001DWS station code of a dam (as dam-levels)
provinceZA-WCProvince code, ISO 3166-2
Fields (23)
FieldTypeMeaning
idstringThe DWS station code (as dam-levels): one record per station
stationstringDWS station code
damstringThe dam's name as DWS prints it
riverstringThe river, as DWS prints it
countrystringZA, LS (Lesotho) or SZ (Eswatini)
provincesarrayISO 3166-2 province codes, as dam-levels
outlineobject or nullThe 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_nonestringOnly where outline is null: why the dam has no outline (outside the extract, a reach of river, no name in OpenStreetMap)
frameobjectThe 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)
latestobject or nullThe 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)
monthsarrayOne 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
cropsarrayTrue-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...]
yearsarrayOne 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).
landsatarrayOne 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...]
driestobject or nullThe 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)
compareobjectDWS 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
volumeobjectOur 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
mixedarrayOne 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)]
calibratedobject or nullOur 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
flagobject or nullWhere 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
radarobject or nullCopernicus 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)
validationobject or nullHow 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)
historyobjectSince 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

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
kindpopulationprofile (land cover 2021), built-up (1975 to 2020) or population (2015 to 2026, modelled)
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
Fields (21)
FieldTypeMeaning
idstringlevel-code-kind: ward-19100001-profile, municipality-CPT-built-up, province-ZA-WC-population
kindstringprofile (land cover in 2021), built-up (built-up surface every five years 1975 to 2020) or population (people, modelled, each year 2015 to 2026)
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
area_km2numberThe place's area from its MDB boundary, km2
yearintegerprofile: 2021, the year of ESA WorldCover
mapped_km2numberprofile: the area ESA WorldCover classes, km2
cover_pctobjectprofile: 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_km2objectprofile: each class's area, km2
yearsarraybuilt-up: 1975 to 2020 in five-year steps; population: 2015 to 2026
built_km2arraybuilt-up: built-up surface (roofs and paved ground as GHSL sees them), km2, for each year
built_pctarraybuilt-up: built-up surface as a share of the place's area, %
modelledbooleanpopulation: always true. A modelled estimate, not the census
peoplearraypopulation: people (WorldPop, modelled) for each year
per_km2arraypopulation: people per km2 of the place
secondobjectpopulation: 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%)
sourcestringThe 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

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
kindnormalsyear (twelve months) or normals (1984 to 2020)
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
year2026year records: the calendar year
Fields (15)
FieldTypeMeaning
idstringlevel-code-period: ward-19100001-2026 (a year), municipality-CPT-normals
kindstringyear (twelve months) or normals (1984 to 2020, by month)
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
yearintegeryear records: the calendar year
periodstringnormals records: 1984-2020
ndviarrayMean 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
anomalyarrayyear records: Digital Earth Africa's standardised anomaly averaged over the place (standard deviations from the month's normal; above 0 is greener than normal)
seenarrayThe share of the place seen (0 to 1) each month: pixels with a value through the clouds
clms_ndviarrayyear records: the second reading, CLMS NDVI 300 m (version 3), the month's three 10-day images averaged, then over the place
sourcestringThe 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

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
year2017The calendar year
Fields (18)
FieldTypeMeaning
idstringlevel-code-year: ward-19100001-2026, municipality-CPT-2017
kindstringyear (twelve months)
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
yearintegerThe calendar year
indexarrayEach 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
classarrayEach 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)
spi3arrayStandardised precipitation index over 3 months, ours from ERA5-Land monthly rain (gamma distribution per calendar month, 1991 to 2020)
spi12arrayThe same over 12 months
spei12arrayStandardised precipitation-evapotranspiration index over 12 months, from Copernicus ERA5-Drought (0.25 degree, reference 1991 to 2020), averaged over the place by area
ndviarrayGreenness against normal (Digital Earth Africa's standardised NDVI anomaly, from greenness-by-ward), from 2017, in months seen over half the place
rain3_pctarrayRain over the 3 months to the month as a percentage of its 1991 to 2020 mean (ERA5-Land)
era5_spi12arrayThe second reading: ERA5-Drought's own 12-month SPI, averaged over the place; not part of the index
sourcestringThe 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

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeWC048MDB ward, municipality or district code, or ISO 3166-2 province code
municipalityWC048A ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
year2017The calendar year
Fields (17)
FieldTypeMeaning
idstringlevel-code-year: ward-10408005-2017, municipality-WC048-2017
kindstringyear (twelve months)
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
area_km2numberThe place's area (2026 MDB boundary), the base of burnt_pct
yearintegerThe calendar year
firesarrayEach 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_nharrayThe same, nominal or high confidence only
fires_n20arrayThe second reading: the same count from VIIRS on NOAA-20, from April 2018
burnt_haarrayEach 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_pctarrayburnt_ha as a percentage of the place's area
seenarrayThe 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)
sourcestringThe 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)

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
Fields (15)
FieldTypeMeaning
idstringlevel-code: ward-19100001, municipality-CPT, province-ZA-WC
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
first_yearintegerThe first year of the arrays (1984)
last_yearintegerThe last year of the arrays (2025)
water_km2arrayEach 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_km2arrayEach year's area wet in over 80% of its clear looks, km2
ever_km2arrayEach year's area seen wet at least once, km2
seenarrayThe share of the place (0 to 1) with at least one clear look that year
area_km2numberThe place's area as counted in 30 m pixels
sourcestringThe 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

FilterExampleMeaning
levelmunicipalitymunicipality, district or province (2026 boundaries; no wards)
codeJHBMDB municipality or district code, or ISO 3166-2 province code
districtDC31A municipality's district (MDB code)
provinceZA-MPProvince code, ISO 3166-2
year2024The calendar year
Fields (16)
FieldTypeMeaning
idstringlevel-code-year: municipality-MP312-2024, province-ZA-GP-2010
kindstringyear (twelve months)
levelstringmunicipality, district or province (2026 MDB boundaries); no wards: the model's cells are about 80 km
codestringMDB municipality or district code, or ISO 3166-2 province code
namestringThe place's name
district_codestringA municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
yearintegerThe calendar year
no2arrayEach 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
o3arrayThe same for ozone
no2_colarrayEach 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_colarrayThe same for sulphur dioxide
annual_no2numberThe year's mean NO2 near the ground (only when all twelve months are there)
who_no2_timesnumberannual_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
modelledbooleanAlways true: these are model figures, not ground measurements
sourcestringThe 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)
FieldTypeMeaning
idstringtax-year-<the year it ends> (tax-year-2026 is 1 March 2025 to 28 February 2026)
yearstringThe year of assessment, named by the year it ends, as the Acts and payslips do
startsdateFirst day of the year of assessment (1 March)
endsdateLast day (28 or 29 February)
statusenumheld (figures from the Act) or not_held (no Act fixing this year's rates is held; no figures)
bracketsobjectThe 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
rebatesobjectprimary, 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 }
thresholdsobjectOur 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_creditsobjectMedical 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_withdrawalobjectThe retirement fund lump sum withdrawal benefit table (Schedule I of the Rates Act): brackets and cite
lump_sum_retirementobjectThe retirement fund lump sum benefit (retirement, death, retrenchment) table: brackets and cite
sourcesarrayThe Gazettes the record rests on: gazette, published, url (GPW's copy), sha256 of the file we read
notestringWhy a year is not held, or null
citeobjectIn 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)

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
Fields (16)
FieldTypeMeaning
idstringlevel-code: ward-19100077, municipality-CPT, province-ZA-WC
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
first_monthstringThe month of the first value in lst and looks (1984-01)
last_monthstringThe month of the last value in lst and looks
lstarrayEach 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
looksarrayHow many clear looks the average 240 m cell of the place had that month (0 = none)
first_summerintegerThe year of the first value in summer_lst (a summer is December to February, named by the year it ends)
summer_lstarrayEach summer's land surface temperature: the mean of its months with a value, when at least two of the three have one
summer_vs_municipalityarrayWards only: the ward's summer against its municipality's, degrees C (above 0 = hotter), over the months both have
cellsintegerThe place's 240 m cells (EPSG:6933), the base of looks
sourcestringThe 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)

FilterExampleMeaning
gazette55679Government Gazette number
departmentForestry, Fisheries and the EnvironmentWho published it: a notice's printed heading, else GPW's file label read into a department's name
kinddraft for commentact, regulation, notice, draft for comment, proclamation, board notice, or not read
noticeR. 8127The notice number as printed
from, to2026-01-01Dates, on date
Fields (22)
FieldTypeMeaning
idstringgg-<Gazette number> for a Gazette whose notices are not listed yet; gg-<number>-<notice number> for a notice
gazettestringThe Government Gazette number
datedateThe Gazette's date (GPW's listing; the cover where a held copy disagrees and a person has read it, see date_note)
departmentstringWho published it: for a notice, the heading it is printed under; otherwise GPW's file label, read into a department's name
gazette_departmentstringFor a notice: the Gazette's publisher as GPW names the file
gpw_namestringGPW's own label in the file name, as typed
kindstringact, regulation, notice, draft for comment, proclamation, board notice, or not read (a Gazette whose notices are not listed yet)
noticestringThe notice number as printed (R. 8127 for a regulation), or null
titlestringThe 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)
withheldbooleanTrue when the title is withheld because the notice names a private person; the Gazette itself is at GPW's link
pageintegerThe page the notice starts on, in the Gazette
comment_closesdateFor a draft: the date comments close, printed or counted (see comment_rule)
comment_rulestring"printed", or how the date was counted from the notice's period
comment_earliestbooleanTrue when the period runs from the Gazette or a newspaper, whichever is later: the date is the earliest close
comment_wordsstringThe notice's own words the closing date was read from
readstring"two readings" when the notice number is on its page in both text readings; "contents only" otherwise
extraordinarybooleanGPW files it as a separate (extraordinary) issue
withdrawnbooleanGPW marks its only file withdrawn
gpwstringGPW's own download link for the Gazette
gpw_bytesintegerThe size of GPW's file
heldstringThe sha256 of our stored copy (GPW's file, byte for byte), when we hold it
notice_pagestringThe 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)

FilterExampleMeaning
levelmunicipalityward, municipality, district or province (2026 boundaries)
codeCPTMDB ward, municipality or district code, or ISO 3166-2 province code
municipalityCPTA ward's municipality (MDB code)
provinceZA-WCProvince code, ISO 3166-2
Fields (25)
FieldTypeMeaning
idstringlevel-code: ward-19100077, municipality-CPT, province-ZA-WC
levelstringward, municipality, district or province (2026 MDB boundaries)
codestringMDB ward code, municipality or district code, or ISO 3166-2 province code
namestringThe place's name
municipality_codestringA ward's municipality
district_codestringA ward's or municipality's district (a metro is its own district)
provincestringISO 3166-2 province code
area_km2numberThe place's area on the Black Marble grid (km2)
first_monthstringThe month of the first value in the monthly arrays (2012-01)
last_monthstringThe month of the last value in the monthly arrays
radarrayEach 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
litarrayEach 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)
seenarrayEach month's share of the place with a value (%)
gaparrayEach month's share of the seen area that NASA filled from earlier months because no clear night was seen (%)
nightsarrayEach month's mean number of clear nights behind a pixel
first_yearintegerThe year of the first value in the yearly arrays (2012)
last_yearintegerThe year of the last value in the yearly arrays
year_radarrayEach 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_litarrayEach year's lit share of the area seen (%), yearly product
year_brightarrayEach year's bright share of the area seen (%): radiance 5 nW/cm2/sr or more, yearly product
year_seenarrayEach year's share of the place with a value (%)
year_gaparrayEach year's gap-filled share of the seen area (%)
year_totalarrayEach year's total light: radiance times area, summed over the place (nW/cm2/sr x km2), yearly product
wards_yeararrayMunicipalities only: each ward's newest year as [ward code, mean radiance, lit share %], by ward code
sourcestringThe 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)
FieldTypeMeaning
idstringThe grant: older-persons, older-persons-75, war-veterans, disability, care-dependency, foster-child, child-support, child-support-top-up, grant-in-aid
namestringThe grant's name in plain words
unitstringRand a month: the maximum the notice sets (the means test can pay less)
amountnumberThe maximum a month in force on as_on, in rand: base plus additional
basenumberThe 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)
additionalnumberThe 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_fromdateThe 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_ondateThe day the release was cut, for amount and in_force_from
historyarrayEvery 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
sourcesarrayThe Gazettes the record rests on: gazette, notice, page, published, url (GPW's copy), sha256 of the file we read
citeobjectIn 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)
FieldTypeMeaning
idstringschool-year-<year>
yearnumberThe school year (a calendar year)
termsarrayThe 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)
totalobjectThe summary's own Total row: weeks, days, school_days (the terms add up to it: checked)
special_school_holidaysarrayDates the calendar marks as special school holidays
public_holidaysarrayThe public holidays the notice lists beside the calendar, { date, name } as printed (checked against the public holidays tool: the same days)
citeobjectgazette, notice (No. 8081), notice_page, summary_page (the Gazette page of the summary table), published, url (GPW's copy), sha256, title
notestringWhat the record does not say

Unmapped Dataworks