Skip to main content
Glama

DataPulse

Live dashboard: https://www.data-pulse.my

Open in Google Colab: Open In Colab

datapulse-my MCP server M8ven Verified mcpgrade

🤖 AI-agent-ready — Wire DataPulse into Claude Desktop, Cursor, Cline, or any MCP-compatible client with one config block. Your agent gets

418 official Malaysian datasets — including 30 GTFS transit feeds (KTMB, Prasarana, BAS.MY) — with declared licences and an honest ten-status trust taxonomy instead of a blanket green checkmark.

Connect your AI agent in 30 seconds

This is DataPulse

When an AI quote is wrong, it is often wrong because the underlying data was stale, mis-licensed, or unverifiable — not because the model hallucinated. An official-looking page does not tell an agent when the dataset behind it last updated, who published it, whether it may legally be reused, or whether the observation can be reproduced by a second party.

DataPulse exists to make that uncertainty explicit. It is an open, read-only verification layer for Malaysian public data: it continuously probes

and publishes — for each one — machine-readable evidence about whether the source is reachable, how fresh the content is, what licence applies, how the schema behaves, and when the observation was signed.

It does not replace the official source. It documents, on an honest and reproducible basis, what the official portal states and whether that material is current, so you know what you are reusing or citing. The verification speaks for itself: every claim here is a live, checkable artefact, not a promise.

What we do, simply

  • We watch the sources. A scheduled probe revisits each dataset under its declared cadence and records what it actually finds — reachability, an honest freshness signal, schema shape, record counts, and collection quirks.

  • We state the truth plainly. Instead of a blanket green checkmark, each dataset carries one of ten honest health statuses (fresh, aging, stale, discontinued, degraded, browser-dependent, unreachable, unknown, unknown-freshness, reference). A dataset that cannot be proven fresh is labelled unknown-freshness — not silently treated as healthy.

  • We publish evidence, not just claims. Each dated observation is signed and recorded to an immutable public log, so you can verify when DataPulse observed the source and that the record has not been altered.

  • We make it machine-readable first. The whole portfolio is discoverable from one index and queryable over a read-only MCP server, so an agent receives the same freshness, licence, and provenance signal a careful human reviewer would.

Who this serves

  • AI builders and agent developers, who want a model to check a Malaysian figure's freshness and licence before it cites the number — without building a bespoke integration or trusting a scraping pipeline.

  • Researchers, analysts, and journalists, who need to ground coursework, a thesis, a dashboard, or a published figure in data whose currency and licence they can actually verify.

  • Compliance and regulatory-monitoring teams, who must keep a tamper-evident trail that an official figure was checked at a known time before it reached a product or a public statement.

  • Civic technologists and public servants, who want a transparent, reproducible view of how discoverable and reliably described public data is.

Why you can trust the verification

Three independent, checkable layers. You do not have to take DataPulse's word — you can verify each with the published public key, the public Git source record, and the public transparency log:

Layer

What it proves

How to check it yourself

Signed envelope

Each per-dataset observation is Ed25519-signed over its exact content by a key in the published registry

python3 scripts/verify_external.py

Source of record

The served observation byte-matches the versioned Git source

python3 scripts/verify_external.py

Temporal witness

The health statement carries a Rekor/Sigstore public-log inclusion proof

python3 scripts/verify_external.py

Run it yourself, from anywhere, with no checkout and no DataPulse code:

curl -fsSLO https://raw.githubusercontent.com/r3dz4r/datapulse-my/main/scripts/verify_external.py
python3 verify_external.py

See Verify DataPulse externally for the full guide, and our methodology below for how health is judged.

A verification layer is only as honest as its method, so DataPulse deliberately tells you when it cannot be sure — a source that cannot be proven current is labelled accordingly, never silently marked healthy. That is the boundary we hold: the platform proves the integrity and timing of its observations, not that an upstream government figure is semantically true. That distinction is the whole point of an evidence layer, and we do not blur it.

Dataset health

Health is reported as fresh, aging, stale, discontinued, degraded, browser-dependent, unreachable, unknown, unknown-freshness, or reference. Unknown freshness means the URL and content shape work, but neither a Last-Modified header nor a parseable content date proves when the data was updated. Reference means versioned lookup data is reachable and its record count is measured, while date-based freshness does not apply. Within the catalogue, data_type refines the reference family without changing the status: policy-reference rows (policy state that stays valid until superseded — BNM OPR is current while unchanged, not stale) and reference-current rows (lookups that must still pass freshness, such as a bank-rate table that can itself go stale) are judged by their declared policy, while plain reference rows are static. The public _trust_summary shows the distribution and explicitly counts missing freshness and row-count signals.

Discontinued — The source has stopped publishing new data. The data is frozen at the last known content date. This is not a freshness failure — it's a publisher decision.

Current distribution (_trust_summary): 90 fresh · 113 aging · 187 stale · 1 discontinued · 1 degraded · 5 browser-dependent · 7 unknown-freshness · 14 reference

Subscribe: RSS feed — get notified when dataset health changes.

Browser-dependent datasets

Five sources (currently 1.4% of the catalogue) require a real browser to probe because their source pages render client-side JavaScript: eperolehan-diklankan, doe_apims, doe_rqims, doe_mqims, and kkm_idengue.

DataPulse uses Camofox, a self-hosted patched headless-Chromium sidecar, to probe these. The probe path is check.sh → Camofox sidecar → DOM snapshot → content-date extraction.

To enable browser probing:

  1. Run the Camofox Docker sidecar on a reachable address (default http://localhost:9377). The probe script and the GitHub Actions workflow pick this up from the CAMOFOX_BASE_URL environment variable; nothing in this repo encodes a public IP.

  2. Set CAMOFOX_BASE_URL to that address.

  3. Restart the timer with systemctl restart datapulse-health.timer.

Without Camofox, those five datasets will sit at browser-dependent — the honest status: DataPulse cannot probe them without a browser, so it says so rather than failing silently. See scripts/smoke_browser_probes.sh for isolated smoke tests.

Methodology

Topic

DataPulse's position

Health status

Ten-status taxonomy, judged by reachability + an honest freshness signal (Last-Modified, parseable content date, or declared policy) — never a fabricated green checkmark. A series that stopped publishing is discontinued (a publisher decision, frozen data), not a freshness failure.

Licence

Every dataset declares its licence machine-readably. Creative Commons Attribution 4.0 (285); MBPP Government Open Data Terms (attribution required) (1); MIT License (8); Open Government Licence (Malaysia) (115); Publisher licence not stated; portal disclaimer applies (4); Singapore Open Data Licence v1.0 (attribution required) (5). A second party can reproduce this from datapulse.json.datasets[].licence.

Freshness cadence

Each dataset is probed on its own tiered schedule (5-minute timer, cadence-aware) — daily references, weekly fuel prices, monthly surveys, etc. Always with the human-readable steward and a stable custodian ID for publisher provenance.

Provenance

Stable custodian per dataset; signed probe attestations per observation

Observed claim

The platform proves what an official source was observed to be at a known time — it does not claim upstream data is semantically true

Read-only + lawful

Publicly available, authenticated sources only — never bypassed; rate-limited; identifies itself to sources

Verification

Fresh days are Rekor-witnessed; signed envelopes + Git source-of-record + public-log inclusion, checkable by anyone

Connect an AI agent

DataPulse exposes an AI-ready, read-only MCP server so agents can query the catalogue natively. It provides the same freshness, licence, schema-drift, and provenance evidence available to a human reviewer.

  • Endpoint: https://mcp.data-pulse.my/mcp (Streamable HTTP, no auth) Graded by mcpgrade — replay with bash scripts/audit_mcpgrade.sh (pinned version, writes artifacts/mcpgrade/). The canonical tool count lives in mcp.json / agent.json.

  • 19 tools: search_datasets, get_dataset, get_data_passport, find_stale, find_anomalies, find_deteriorating, find_recovering, find_unreliable, find_schema_drift, check_reconciliation, get_provenance, get_evidence, verify_dataset, get_freshness_summary, verify_evidence, trust_verdict, verify_attestation, find_by_licence, usage_summary

The public endpoint serves all 19 read-only tools over the 418-dataset catalogue.

get_evidence exposes pipeline receipts; verify_evidence performs cached transport-only live checks and does not update health.

Connect from Claude Desktop:

{
  "mcpServers": {
    "datapulse-my": {
      "transport": "streamable-http",
      "url": "https://mcp.data-pulse.my/mcp"
    }
  }
}

See llms.txt for the full discovery index, and docs/mcp-deploy.md for the deployment architecture.

Wire it into Claude Desktop via claude_desktop_config.json (30 seconds, no API key):

{
  "mcpServers": {
    "datapulse-my": {
      "transport": "streamable-http",
      "url": "https://mcp.data-pulse.my/mcp"
    }
  }
}

Restart Claude Desktop, confirm the hammer icon shows "datapulse-my" with the read-only tools listed above. Cursor / Cline use the same JSON in their MCP config panel.

Included datasets

Dataset inventory is grouped by stable custodian publisher ID; unknown IDs fall back to the ID itself.

National Anti-Drugs Agency (aadk)

Accountant General's Department of Malaysia (agc)

Agensi Pengangkutan Awam Darat (APAD) (apad)

Bank Negara Malaysia (bnm)

Department of Agriculture Malaysia (doa)

Department of Environment Malaysia (doe)

Department of Fisheries Malaysia (dof)

Department of Statistics Malaysia (dosm)

Energy Commission (energy_commission)

Employees Provident Fund (epf)

Forestry Department (forestry_department)

Immigration Department of Malaysia (immigration)

National Digital Department (jdn)

Department of Mineral and Geoscience (jmg)

Road Transport Department Malaysia (jpj)

National Registration Department (jpn)

Ministry of Health Malaysia (kkm)

Ministry of Domestic Trade and Cost of Living (kpdn)

Keretapi Tanah Melayu Berhad (ktmb)

Majlis Bandaraya Pulau Pinang (mbpp)

Malaysian Communications and Multimedia Commission (mcmc)

Malaysian Meteorological Department (met)

Ministry of Home Affairs Malaysia (mha)

Ministry of Housing and Local Government (mhlg)

Ministry of Education Malaysia (moe)

Ministry of Finance Malaysia (mof)

Ministry of Higher Education Malaysia (mohe)

Ministry of Transport Malaysia (mot)

MYNIC (mynic)

National Audit Department Malaysia (national_audit)

National Blood Centre (national_blood_centre)

National Pharmaceutical Regulatory Agency (npra)

Ministry of Natural Resources and Environmental Sustainability (nres)

National Transplant Resource Centre (ntrc)

Parliament of Malaysia (parliament)

Payments Network Malaysia (paynet)

Royal Malaysia Police (pdrm)

Prasarana Malaysia Berhad (prasarana)

Prisons Department of Malaysia (prisons)

ProtectHealth Corporation (protecthealth)

Singapore Government Data.gov.sg (sg-datagov)

National Water Services Commission (span)

Tenaga Nasional Berhad (tnb)

Current coverage

Refresh cadence

Dataset

Refresh cadence

air_pollution

monthly

almanak_astronomi

daily

arrivals

monthly

arrivals_soe

monthly

births

daily

blood_donations

daily

blood_donations_state

daily

bnm_base_rate

monthly

bnm_interbank_swap

daily (weekdays)

bnm_interest_rate

monthly

bnm_interest_volume

monthly

bnm_kijang_emas

daily

bnm_kl_usd_myr

daily (weekdays)

bnm_myor

daily

bnm_opr

monthly

bop_balance

quarterly

cellular_subscribers

annual

completion_school_state

annual

cosmetic_notifications

monthly

cosmetic_notifications_cancelled

monthly

cosmetics_manufacturers

daily

covid_cases

daily

covid_cases_age

daily

covid_cases_vaxstatus

daily

covid_deaths_linelist

annual

cpi_3d

monthly

cpi_4d

monthly

cpi_5d

monthly

cpi_core

monthly

cpi_core_inflation

monthly

cpi_headline

monthly

cpi_state

monthly

cpi_state_inflation

monthly

crops_state

annual

currency_codes

as-required

currency_in_circulation

monthly

currency_in_circulation_annual

annual

datasets

monthly

deaths

annual

dgm_interest_rates

monthly

dgm_interest_rates_annual

annual

dgm_ktmb_ridership_monthly

monthly

dgm_money_aggregates

monthly

dgm_payments_channels

monthly

dgm_payments_instruments

monthly

dgm_payments_systems

monthly

dgm_payments_transactions_fpx

daily

dgm_vehicle_registrations_type_fuel

monthly

doe_apims

hourly

doe_mqims

monthly

doe_rqims

hourly

domains

monthly

domains_dnssec

monthly

domains_idn

monthly

domains_ipv6

monthly

dosm_arc_dosm

daily

dosm_bec

as-required

dosm_birth_state

annual

dosm_births_annual

annual

dosm_births_annual_sex_ethnic

annual

dosm_births_annual_sex_ethnic_state

annual

dosm_births_annual_state

annual

dosm_births_district_sex

annual

dosm_cpi_annual

annual

dosm_cpi_annual_inflation

annual

dosm_cpi_core_inflation

monthly

dosm_cpi_headline_inflation

monthly

dosm_cpi_inflation

monthly

dosm_cpi_lowincome

monthly

dosm_cpi_state

monthly

dosm_cpi_state_inflation

monthly

dosm_cpi_strata

monthly

dosm_crime_district

annual

dosm_crops_district_area

annual

dosm_crops_district_production

annual

dosm_death_district_sex

annual

dosm_death_maternal

annual

dosm_death_maternal_state

annual

dosm_death_state

annual

dosm_deaths_district_sex

annual

dosm_deaths_early_childhood

annual

dosm_deaths_early_childhood_sex

annual

dosm_deaths_early_childhood_state

annual

dosm_deaths_early_childhood_state_sex

annual

dosm_deaths_maternal

annual

dosm_deaths_maternal_state

annual

dosm_deaths_sex_ethnic

annual

dosm_deaths_sex_ethnic_state

annual

dosm_deaths_state

annual

dosm_employment_sector

annual

dosm_fertility

annual

dosm_fertility_state

annual

dosm_forest_reserve

annual

dosm_forest_reserve_state

annual

dosm_gdp_annual_nominal_demand

annual

dosm_gdp_annual_nominal_demand_granular

annual

dosm_gdp_annual_nominal_income

annual

dosm_gdp_annual_nominal_supply

annual

dosm_gdp_annual_nominal_supply_granular

annual

dosm_gdp_annual_real_demand

annual

dosm_gdp_annual_real_demand_granular

annual

dosm_gdp_annual_real_supply

annual

dosm_gdp_annual_real_supply_granular

annual

dosm_gdp_district_real_supply

annual

dosm_gdp_gni_annual_nominal

annual

dosm_gdp_gni_annual_real

annual

dosm_gdp_lookup

as-required

dosm_gdp_qtr_nominal

quarterly

dosm_gdp_qtr_nominal_demand

quarterly

dosm_gdp_qtr_nominal_demand_granular

quarterly

dosm_gdp_qtr_nominal_supply

quarterly

dosm_gdp_qtr_nominal_supply_granular

quarterly

dosm_gdp_qtr_real

quarterly

dosm_gdp_qtr_real_demand

quarterly

dosm_gdp_qtr_real_demand_granular

quarterly

dosm_gdp_qtr_real_sa

quarterly

dosm_gdp_qtr_real_sa_demand

quarterly

dosm_gdp_qtr_real_sa_supply

quarterly

dosm_gdp_qtr_real_supply

quarterly

dosm_gdp_qtr_real_supply_granular

quarterly

dosm_gdp_state_real_supply

annual

dosm_hh_access_amenities

annual

dosm_hh_expenditure_dun

biennial to triennial (survey years)

dosm_hh_expenditure_parlimen

biennial to triennial (survey years)

dosm_hh_income

biennial to triennial (survey years)

dosm_hh_income_district

biennial to triennial (survey years)

dosm_hh_income_dun

annual

dosm_hh_income_parlimen

annual

dosm_hh_income_state

biennial to triennial (survey years)

dosm_hh_inequality

biennial to triennial (survey years)

dosm_hh_inequality_district

biennial to triennial (survey years)

dosm_hh_inequality_dun

annual

dosm_hh_inequality_parlimen

annual

dosm_hh_inequality_state

biennial to triennial (survey years)

dosm_hh_poverty

biennial to triennial (survey years)

dosm_hh_poverty_district

biennial to triennial (survey years)

dosm_hh_poverty_dun

annual

dosm_hh_poverty_parlimen

annual

dosm_hh_poverty_state

biennial to triennial (survey years)

dosm_hh_profile

annual

dosm_hh_profile_state

annual

dosm_hies_district

annual

dosm_hies_malaysia_percentile

annual

dosm_hies_state

annual

dosm_hies_state_percentile

annual

dosm_iowrt

monthly

dosm_iowrt_2d

monthly

dosm_iowrt_3d

monthly

dosm_ipi

monthly

dosm_ipi_1d

monthly

dosm_ipi_domestic

monthly

dosm_ipi_export

monthly

dosm_lfs_district

annual

dosm_lfs_dun

annual

dosm_lfs_month

monthly

dosm_lfs_month_duration

monthly

dosm_lfs_month_sa

monthly

dosm_lfs_month_status

monthly

dosm_lfs_month_youth

monthly

dosm_lfs_parlimen

annual

dosm_lfs_qtr

quarterly

dosm_lfs_qtr_sru_age

quarterly

dosm_lfs_qtr_sru_sex

quarterly

dosm_lfs_qtr_state

quarterly

dosm_lfs_qtr_tru_age

quarterly

dosm_lfs_qtr_tru_sex

quarterly

dosm_lfs_state_sex

annual

dosm_lfs_year

annual

dosm_lfs_year_sex

annual

dosm_lookup_item

as-required

dosm_lookup_premise

as-required

dosm_marriages

annual

dosm_marriages_age

annual

dosm_marriages_state

annual

dosm_marriages_state_age

annual

dosm_mcoicop

as-required

dosm_mineral_extraction

monthly

dosm_msic

as-required

dosm_population_malaysia

annual

dosm_population_parlimen

annual

dosm_population_state

annual

dosm_ppi

monthly

dosm_ppi_1d

monthly

dosm_ppi_sitc

monthly

dosm_productivity_annual

annual

dosm_productivity_annual_priority

annual

dosm_productivity_lookup

as-required

dosm_productivity_qtr

quarterly

dosm_sitc

as-required

dosm_sitc_sop

as-required

dosm_sppi

quarterly

dosm_sppi_1d

quarterly

dosm_sppi_2d

quarterly

dosm_stillbirths

annual

dosm_stillbirths_state

annual

dosm_timber_production

annual

dosm_trade_enduse_bec

monthly

dosm_trade_headline

monthly

dosm_trade_sitc_1d

monthly

drug_addicts_age

annual

drug_addicts_drugtype

annual

drug_addicts_education

annual

drug_addicts_occupation

annual

drug_arrests_age

annual

drug_arrests_ethnicity

annual

economic_indicators

monthly

electricity_access

annual

electricity_consumption

monthly

electricity_supply

monthly

employment_sector

monthly

enrolment_school_district

annual

eperolehan-diklankan

hourly

epf_dividend

annual

exchangerates

monthly

exchangerates_daily_0900

daily (weekdays, 0900 MYT)

exchangerates_daily_1130

daily (weekdays, 1130 MYT)

exchangerates_daily_1200

daily (weekdays, 1200 MYT)

exchangerates_daily_1700

daily (weekdays, 1700 MYT)

fdi_flows

quarterly

federal_budget_moe

annual

federal_budget_moh

annual

federal_finance_qtr

quarterly

federal_finance_qtr_de

quarterly

federal_finance_qtr_oe

quarterly

federal_finance_qtr_revenue

quarterly

federal_finance_year

annual

federal_finance_year_de

quarterly

federal_finance_year_oe

annual

federal_finance_year_revenue

annual

fertility

monthly

fish_landings

monthly

fuelprice

weekly

gdp_annual_nominal_supply

annual

gdp_annual_real_supply

annual

gdp_gni_annual_nominal

annual

gdp_qtr_nominal

quarterly

gdp_qtr_real

quarterly

gdp_qtr_real_sa

quarterly

gdp_state_real_supply

annual

ghg_emissions

annual

government_apps

monthly

government_apps_active

monthly

government_apps_downloads

monthly

government_apps_reviews

monthly

gtfs_realtime_ktmb

30 seconds

gtfs_realtime_mybas_alor_setar

30 seconds

gtfs_realtime_mybas_ipoh

30 seconds

gtfs_realtime_mybas_johor

30 seconds

gtfs_realtime_mybas_kangar

30 seconds

gtfs_realtime_mybas_kota_bharu

30 seconds

gtfs_realtime_mybas_kuala_terengganu

30 seconds

gtfs_realtime_mybas_kuching

30 seconds

gtfs_realtime_mybas_melaka

30 seconds

gtfs_realtime_mybas_seremban_a

30 seconds

gtfs_realtime_mybas_seremban_b

30 seconds

gtfs_realtime_prasarana_bus_kl

30 seconds

gtfs_realtime_prasarana_bus_mrtfeeder

30 seconds

gtfs_realtime_prasarana_bus_penang

30 seconds

gtfs_static_ktmb

daily

gtfs_static_mybas_alor_setar

as-required

gtfs_static_mybas_ipoh

as-required

gtfs_static_mybas_johor

as-required

gtfs_static_mybas_kangar

as-required

gtfs_static_mybas_kota_bharu

as-required

gtfs_static_mybas_kuala_terengganu

as-required

gtfs_static_mybas_kuching

as-required

gtfs_static_mybas_melaka

as-required

gtfs_static_mybas_seremban_a

as-required

gtfs_static_mybas_seremban_b

as-required

gtfs_static_prasarana_bus_kl

as-required

gtfs_static_prasarana_bus_kuantan

as-required

gtfs_static_prasarana_bus_mrtfeeder

as-required

gtfs_static_prasarana_bus_penang

as-required

gtfs_static_prasarana_rail_kl

as-required

hansard_mps

as-required

hansard_parliamentary_terms

as-required

hansard_sittings

as-required

healthcare_staff

annual

hh_expenditure_dun

monthly

hh_expenditure_parlimen

monthly

hh_income

monthly

hh_income_district

monthly

hh_income_state

monthly

hh_inequality

monthly

hh_inequality_district

monthly

hh_inequality_state

monthly

hh_poverty

monthly

hh_poverty_district

monthly

hh_poverty_state

monthly

hospital_beds

annual

infant_immunisation

annual

interestrates

monthly

interestrates_annual

annual

ipi_2d

monthly

ipi_3d

monthly

ipi_5d

monthly

ipi_domestic

monthly

ipi_export

monthly

kkm_idengue

daily

kkmnow_bedutil

daily

kkmnow_blood

daily

kkmnow_covidepid

weekly

kkmnow_covidnow

daily

kkmnow_covidvax

daily

kkmnow_facilities

annual

kkmnow_organ

daily

kkmnow_pekab40

daily

lecturers_uni

annual

legal_advisory_branch

monthly

legal_advisory_case_type

monthly

legal_advisory_category

monthly

legal_advisory_subcategory

monthly

lfs_month

monthly

lfs_qtr

quarterly

lfs_qtr_state

quarterly

lfs_year

annual

local_authority_sex

annual

lookup_federal_finance

as-required

lookup_money_banking

as-required

marriages_state

annual

marriages_state_age

annual

mbpp_weather_stations

hourly

met_weather

daily

metrics_content

monthly

metrics_dataset_cumul

daily

mnha

annual

mnha_moh

annual

monetary_aggregates

monthly

nutrition_children_sex

annual

nutrition_children_strata

annual

organ_pledges

daily

organ_pledges_state

daily

parliament_sex

annual

passports

monthly

payment_channels

monthly

payment_instruments

monthly

payment_systems

monthly

pekab40_screenings

daily

pekab40_screenings_state

daily

pharmaceutical_importers

monthly

pharmaceutical_manufacturers

monthly

pharmaceutical_products

monthly

pharmaceutical_products_cancelled

monthly

pharmaceutical_wholesalers

monthly

population_district

annual

population_dun

annual

population_malaysia

annual

population_parlimen

annual

population_state

annual

poskod

as-required

ppi

monthly

ppi_2d

monthly

ppi_3d

monthly

ppi_sop

monthly

pricecatcher

monthly

prisoners_prison

annual

prisoners_state

annual

registration_transactions_all

daily

registration_transactions_car

daily

registration_transactions_motorcycle

daily

registrations_type_fuel

monthly

ridership_headline

daily

ridership_ktmb_daily

daily

ridership_ktmb_monthly

monthly

ridership_od_brt_daily

daily

ridership_od_ets

daily

ridership_od_intercity

daily

ridership_od_komuter

daily

ridership_od_komuter_utara

daily

ridership_od_rapidrail_daily

daily

ridership_od_shuttle_tebrau

daily

sanitation_access

annual

schools_district

annual

sdg_03-3-1

annual

sdg_04-6-1

annual

sdg_10-c-1

annual

sdg_16-1-1

annual

sdg_16-2-2

annual

sg_datagov_coe_bidding

monthly

sg_datagov_hdb_metadata

monthly

sg_datagov_hdb_resale_prices

monthly

sg_datagov_taxi_availability

daily

sg_datagov_weather_readings

daily

sppi_3d

monthly

st_cogenerators

annual

st_consumers

monthly

st_current_cogen_licensees

as-required

st_current_ipp_licensees

as-required

st_current_lss_licensees

as-required

st_current_re_licensees

as-required

st_elesca

annual

st_energy_balance_pdf

annual

st_generation_mix_gwh

annual

st_installed_capacity_mw

monthly

st_ipps

annual

st_max_demand_mw

monthly

st_re_projects

annual

st_sales_unit_gwh

monthly

st_sales_value_rm_million

monthly

state_finance_expenditure

annual

state_finance_revenue

annual

std_state

annual

teachers_district

annual

trade_headline

monthly

trade_sitc_1d

monthly

trnsc_daily_directdebit

daily

trnsc_daily_fpx

daily

trnsc_daily_jompay

daily

trnsc_daily_san

daily

usage_metrics

daily

usage_metrics_openapi

daily

usage_metrics_openapi_cumul

daily

vaxreg_covid

daily

vaxreg_covid_demog

annual

water_access

annual

water_consumption

annual

water_pollution_basin

annual

water_production

annual

DataPulse currently tracks the portfolio declared in datapulse.json.

How to use it

Start with datapulse.json to discover datasets and their official sources. Follow each health_report link for a plain-language assessment, or consume the matching file under data/json/ in an automated workflow.

For example, a data pipeline can inspect status, content_freshness_date, and freshness_signal_source before processing a source, while a researcher can review the known quirks before designing a collection method.

External verification

For a clone-less, independent check of the published Ed25519 dataset envelope, GitHub source parity, and Rekor/Sigstore health witness, see Verify DataPulse externally.

Every dataset in this catalogue ships with a publicly-signed Sigstore DSSE evidence receipt that an agent can verify offline, without trusting the DataPulse server. An agent (human or MCP) can obtain, for any dataset, the full health row + evidence + signed-receipt-verification in three MCP tool calls or fewer: verify_datasetget_freshness_summary. The standard offline path is the verify_external.py command above.

For the portfolio-level health bundle, verify /signatures/health.latest.sigstore.json with the exact companion manifest at /signatures/datapulse.json. That signed-manifest snapshot is distinct from /datapulse.json, the current discovery manifest: the latter can change when generated metadata is refreshed. A valid signature proves the integrity of DataPulse's attested observation, not that upstream data is semantically true. Every refresh publishes signed bundles to the public Rekor log.

Monitoring

  • The VPS datapulse-health.timer wakes every 5 minutes and runs only the datasets whose cadence tier is due.

  • GitHub Actions performs a full weekly probe as a fallback and republishes the generated health, badge, feed, README, catalog snapshot, and delta artifacts.

  • RSS feed — available.

  • Status badges — available.

  • More datasets — planned.

Adopt a dataset

Know a Malaysian public dataset that deserves dependable health metadata? Adopt it: verify its source and licence, document its schema and quirks, and submit a health report. See CONTRIBUTING.md for the expected three-file contribution model.

New contributors can start with the repository's Good first issues or propose a dataset through the GitHub issue forms. Maintainers use good first issue (yellow), adopt-a-dataset (blue), freshness-check (blue), bug (red), documentation (blue), question (purple), and wontfix (gray) to route contributions.

Licence

DataPulse is released under the MIT License. Source datasets remain subject to the licences and attribution requirements stated in their individual health reports.

Privacy

See PRIVACY.md for what DataPulse collects (transient operational logs for rate limiting and usage aggregation) and what it does not collect (no credentials, no accounts, no personal data).

DataPulse probes publicly-published open-data sources. We do not bypass authentication, CAPTCHAs, or terms-of-service restrictions. Every source we probe is publicly available without login; the data is aggregate/non-personal; and the probe respects each dataset's declared refresh frequency.

All scraping is rate-limited (5-minute cadence, dataset-tier cadence applied) and identifies itself via User-Agent. Sources we cannot probe without authentication, CAPTCHA bypass, or ToS violation are marked unreachable or browser-dependent — never silently scraped through a workaround.

If you are a data source maintainer and would like DataPulse to adjust its probe cadence, exclude a dataset, or remove it from the manifest, please open a GitHub issue or contact the maintainers.