API reference
All endpoints of SENTINARA API v1.0.0. Base URL https://api.sentinara.org. Download the OpenAPI 3.1 document to generate a client.
#Service
API status and discovery.
#API index
/v1Key optionalLinks to the documentation, the OpenAPI document and the status endpoint.
curl "https://api.sentinara.org/v1"const res = await fetch('https://api.sentinara.org/v1');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1", timeout=30).json()["data"]Example response 200
{
"data": {
"name": "SENTINARA API",
"version": 1,
"docs": "https://docs.sentinara.org",
"openapi": "https://api.sentinara.org/openapi.json",
"status": "https://api.sentinara.org/v1/status"
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#index"
}
}#Data freshness and validation
/v1/statusKey optionalWhen the data was last refreshed, the engine version, and the result of the automated validation checks.
curl "https://api.sentinara.org/v1/status"const res = await fetch('https://api.sentinara.org/v1/status');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/status", timeout=30).json()["data"]Example response 200
{
"data": {
"status": "ok",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"pipeline_seconds": 23,
"files": 256,
"who_rows": 44747,
"ml_version": "1.0.0",
"validation": {
"pass": 18,
"warn": 2,
"fail": 0,
"total": 20
},
"sources": {
"who": {
"fetchedAt": "2026-10-31T06:49:52.016Z",
"rows": 44747,
"latestIndonesia": "2026-08"
},
"opendengue": {
"version": "V1.3",
"title": "OpenDengue: data from the OpenDengue database",
"published": "2025-05-27T11:05:52Z",
"doi": "10.6084/m9.figshare.24259573"
},
"worldbank": {
"lastUpdated": "2026-10-08"
},
"climate": {
"months": 120
},
"situation": {
"asOf": "2026-09-30"
}
}
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#status"
}
}#Countries
WHO surveillance data for 199 countries and territories, with early-warning signals, forecasts and anomalies.
#List countries
/v1/countriesKey optionalList · CSVEvery country and territory with year-to-date cases, last full year incidence and the current warning level.
| Parameter | In | Type | Description |
|---|---|---|---|
region | query | AMR | SEAR | WPR | EMR | AFR | EUR | WHO region (case-insensitive). |
level | query | normal | watch | alert | outbreak | Early-warning level. |
q | query | string | Case-insensitive text search. |
sort | query | name | cases | -cases | change | -change | level | -level | incidence | -incidence default -cases | Sort field; prefix with - for descending. |
has_cases | query | true | false | Only countries that have (or have never) reported a case. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/countries?region=SEAR&sort=-cases&limit=5"const res = await fetch('https://api.sentinara.org/v1/countries?region=SEAR&sort=-cases&limit=5');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/countries?region=SEAR&sort=-cases&limit=5", timeout=30).json()["data"]Example response 200
{
"data": [
{
"iso3": "LKA",
"slug": "sri-lanka",
"name": "Sri Lanka",
"name_id": "Sri Lanka",
"who_name": "Sri Lanka",
"region": "SEAR",
"population": 21756000,
"latest_month": "2026-08",
"latest_complete_month": "2026-08",
"reporting": "month/isoweek",
"year_to_date": {
"year": 2026,
"through_month": 8,
"cases": 95545,
"deaths": 47,
"previous_year_cases": 36637,
"change_pct": 160.8,
"five_year_average": 41221,
"vs_five_year_average_pct": 131.8
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 236.5,
"case_fatality_pct": 0.056
},
"warning": {
"status": "ok",
"level": "outbreak",
"score": 5.5
},
"links": {
"self": "https://api.sentinara.org/v1/countries/LKA",
"series": "https://api.sentinara.org/v1/countries/LKA/series",
"page": "https://sentinara.org/global/sri-lanka"
}
},
{
"iso3": "BGD",
"slug": "bangladesh",
"name": "Bangladesh",
"name_id": "Bangladesh",
"who_name": "Bangladesh",
"region": "SEAR",
"population": 175686899,
"latest_month": "2026-09",
"latest_complete_month": "2026-09",
"reporting": "isoweek/month",
"year_to_date": {
"year": 2026,
"through_month": 9,
"cases": 79620,
"deaths": 245,
"previous_year_cases": 47342,
"change_pct": 68.2,
"five_year_average": 64109,
"vs_five_year_average_pct": 24.2
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 58.6,
"case_fatality_pct": 0.442
},
"warning": {
"status": "ok",
"level": "watch",
"score": 2.5
},
"links": {
"self": "https://api.sentinara.org/v1/countries/BGD",
"series": "https://api.sentinara.org/v1/countries/BGD/series",
"page": "https://sentinara.org/global/bangladesh"
}
},
{
"iso3": "IND",
"slug": "india",
"name": "India",
"name_id": "India",
"who_name": "India",
"region": "SEAR",
"population": 1463865525,
"latest_month": "2026-09",
"latest_complete_month": "2026-09",
"reporting": "month",
"year_to_date": {
"year": 2026,
"through_month": 9,
"cases": 70140,
"deaths": 71,
"previous_year_cases": 68356,
"change_pct": 2.6,
"five_year_average": null,
"vs_five_year_average_pct": null
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 8.2,
"case_fatality_pct": 0.09
},
"warning": {
"status": "insufficient",
"level": null,
"score": null
},
"links": {
"self": "https://api.sentinara.org/v1/countries/IND",
"series": "https://api.sentinara.org/v1/countries/IND/series",
"page": "https://sentinara.org/global/india"
}
},
{
"iso3": "THA",
"slug": "thailand",
"name": "Thailand",
"name_id": "Thailand",
"who_name": "Thailand",
"region": "SEAR",
"population": 71619863,
"latest_month": "2026-08",
"latest_complete_month": "2026-08",
"reporting": "month",
"year_to_date": {
"year": 2026,
"through_month": 8,
"cases": 23780,
"deaths": 32,
"previous_year_cases": 43969,
"change_pct": -45.9,
"five_year_average": 48191,
"vs_five_year_average_pct": -50.7
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 80.2,
"case_fatality_pct": 0.082
},
"warning": {
"status": "ok",
"level": "normal",
"score": 0
},
"links": {
"self": "https://api.sentinara.org/v1/countries/THA",
"series": "https://api.sentinara.org/v1/countries/THA/series",
"page": "https://sentinara.org/global/thailand"
}
},
{
"iso3": "NPL",
"slug": "nepal",
"name": "Nepal",
"name_id": "Nepal",
"who_name": "Nepal",
"region": "SEAR",
"population": 29618118,
"latest_month": "2026-09",
"latest_complete_month": "2026-09",
"reporting": "month/isoweek",
"year_to_date": {
"year": 2026,
"through_month": 9,
"cases": 6192,
"deaths": 3,
"previous_year_cases": 5496,
"change_pct": 12.7,
"five_year_average": 15741,
"vs_five_year_average_pct": -60.7
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 28.9,
"case_fatality_pct": 0.07
},
"warning": {
"status": "ok",
"level": "normal",
"score": 0
},
"links": {
"self": "https://api.sentinara.org/v1/countries/NPL",
"series": "https://api.sentinara.org/v1/countries/NPL/series",
"page": "https://sentinara.org/global/nepal"
}
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#countriesList",
"total": 9,
"limit": 5,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/countries?region=SEAR&sort=-cases&limit=5",
"next": "https://api.sentinara.org/v1/countries?region=SEAR&sort=-cases&limit=5&cursor=eyJvIjo1fQ"
}
}#Country profile
/v1/countries/{country}Key optionalAnnual totals, warning level with reasons and signals, endemic channel, seasonality, data quality and provenance.
| Parameter | In | Type | Description |
|---|---|---|---|
country required | path | string | ISO 3166-1 alpha-3 code (IDN) or slug (indonesia). |
curl "https://api.sentinara.org/v1/countries/IDN"const res = await fetch('https://api.sentinara.org/v1/countries/IDN');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/countries/IDN", timeout=30).json()["data"]Example response 200
{
"data": {
"iso3": "IDN",
"slug": "indonesia",
"name": "Indonesia",
"name_id": "Indonesia",
"who_name": "Indonesia",
"region": "WPR",
"population": 285721236,
"latest_month": "2026-09",
"latest_complete_month": "2026-08",
"reporting": "month",
"year_to_date": {
"year": 2026,
"through_month": 8,
"cases": 88178,
"deaths": 240,
"previous_year_cases": 130105,
"change_pct": -32.2,
"five_year_average": 111782,
"vs_five_year_average_pct": -21.1
},
"last_full_year": {
"year": 2025,
"incidence_per_100k": 59.8,
"case_fatality_pct": 0.412
},
"warning": {
"status": "ok",
"level": "normal",
"score": 0,
"as_of": "2026-08",
"reliability": "high",
"forecast_skilled": true,
"endemic_zone": "sukses",
"reasons": [
{
"code": "within-pattern",
"text": "Within the usual range for this time of year"
}
],
"signals": {
"outbreak_score": -0.41,
"expected_cases": 9867,
"upper_bound": 23654,
"robust_z": -2.44,
"cusum": 0,
"cusum_alarm": false,
"p_exceed_next_3_months": 0.001,
"momentum_pct": -42.3,
"vs_last_year_pct": -45.2
},
"points": [
{
"signal": "zone",
"points": 0
},
{
"signal": "outbreak-score",
"points": 0
},
{
"signal": "cusum",
"points": 0
},
{
"signal": "forecast",
"points": 0,
"used": true
},
{
"signal": "momentum",
"points": 0
}
],
"endemic_channel": {
"reference_years": [
2021,
2022,
2023,
2024,
2025
],
"median": [
20486,
11849,
10220,
10664,
12470,
12762,
"… 6 more"
],
"q3": [
23805,
19930,
15838,
14656,
16208,
14239,
"… 6 more"
],
"epidemic_threshold": [
62418,
51467,
44009,
39313,
42365,
34644,
"… 6 more"
]
},
"seasonality": {
"share_pct": [
13.32,
12.23,
10.88,
9.63,
9.31,
7.76,
"… 6 more"
],
"peak_month": 1,
"complete_years": 19
},
"data_quality": {
"completeness": 1,
"months_reported": 236,
"longest_gap_months": 0,
"suspect_months": [],
"interpolated_months": []
}
},
"links": {
"self": "https://api.sentinara.org/v1/countries/IDN",
"series": "https://api.sentinara.org/v1/countries/IDN/series",
"page": "https://sentinara.org/global/indonesia",
"forecast": "https://api.sentinara.org/v1/countries/IDN/forecast",
"anomalies": "https://api.sentinara.org/v1/countries/IDN/anomalies"
},
"annual": [
{
"year": 2014,
"cases": 100347,
"deaths": 907,
"months_reported": 12
},
{
"year": 2015,
"cases": 129579,
"deaths": 1244,
"months_reported": 12
},
{
"year": 2016,
"cases": 204172,
"deaths": 1598,
"months_reported": 12
},
{
"year": 2017,
"cases": 68364,
"deaths": 494,
"months_reported": 12
},
{
"year": 2018,
"cases": 65591,
"deaths": 467,
"months_reported": 12
},
{
"year": 2019,
"cases": 138131,
"deaths": 919,
"months_reported": 12
},
"… 7 more"
],
"serotypes_reported": [],
"similar_seasonality": [
"AUS",
"COL",
"PER",
"TLS",
"ABW",
"LKA"
],
"provenance": {
"source": "WHO Global Dengue Surveillance",
"extended_with": null,
"negative_corrections_absorbed": 0
}
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#country"
}
}#Monthly series
/v1/countries/{country}/seriesKey optionalList · CSVMonthly cases, deaths and severe cases reported to WHO. include_history=true prepends OpenDengue months where the sources were verified to agree.
| Parameter | In | Type | Description |
|---|---|---|---|
country required | path | string | ISO 3166-1 alpha-3 code (IDN) or slug (indonesia). |
from | query | string | First month (YYYY-MM), inclusive. |
to | query | string | Last month (YYYY-MM), inclusive. |
include_history | query | true | false default false | Include spliced OpenDengue history. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/countries/BRA/series?from=2025-01"const res = await fetch('https://api.sentinara.org/v1/countries/BRA/series?from=2025-01');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/countries/BRA/series?from=2025-01", timeout=30).json()["data"]Example response 200
{
"data": [
{
"month": "2025-01",
"cases": 462699,
"deaths": 289,
"severe": 404,
"source": "WHO"
},
{
"month": "2025-02",
"cases": 569042,
"deaths": 311,
"severe": 439,
"source": "WHO"
},
{
"month": "2025-03",
"cases": 693042,
"deaths": 432,
"severe": 576,
"source": "WHO"
},
{
"month": "2025-04",
"cases": 792762,
"deaths": 383,
"severe": 560,
"source": "WHO"
},
{
"month": "2025-05",
"cases": 466447,
"deaths": 203,
"severe": 278,
"source": "WHO"
},
{
"month": "2025-06",
"cases": 182242,
"deaths": 87,
"severe": 110,
"source": "WHO"
},
"… 15 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#countrySeries",
"iso3": "BRA",
"latest_complete_month": "2026-09",
"total": 21,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/countries/BRA/series?from=2025-01",
"next": null
}
}#Six-month forecast
/v1/countries/{country}/forecastKey optionalEnsemble forecast with 80% and 95% ranges, the probability of exceeding the epidemic threshold, and backtest skill. 404 not_available when there is not enough data.
| Parameter | In | Type | Description |
|---|---|---|---|
country required | path | string | ISO 3166-1 alpha-3 code (IDN) or slug (indonesia). |
curl "https://api.sentinara.org/v1/countries/IDN/forecast"const res = await fetch('https://api.sentinara.org/v1/countries/IDN/forecast');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/countries/IDN/forecast", timeout=30).json()["data"]Example response 200
{
"data": {
"iso3": "IDN",
"name": "Indonesia",
"issued_from": "2026-08",
"model": "weighted ensemble (seasonal naive, damped Holt-Winters, harmonic regression with AR terms)",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0,
"harmonicAR": 1
},
"backtest": {
"origins": 26,
"mape_pct": 14.8,
"mase": 0.3,
"coverage_80": 0.81
},
"skilled": true,
"months": [
{
"month": "2026-09",
"mean": 4057,
"lower_80": 3216,
"upper_80": 5117,
"lower_95": 2844,
"upper_95": 5787,
"p_exceed_threshold": 0
},
{
"month": "2026-10",
"mean": 4294,
"lower_80": 3192,
"upper_80": 5777,
"lower_95": 2728,
"upper_95": 6758,
"p_exceed_threshold": 0
},
{
"month": "2026-11",
"mean": 5395,
"lower_80": 3917,
"upper_80": 7430,
"lower_95": 3307,
"upper_95": 8802,
"p_exceed_threshold": 0.001
},
{
"month": "2026-12",
"mean": 7478,
"lower_80": 5168,
"upper_80": 10822,
"lower_95": 4249,
"upper_95": 13160,
"p_exceed_threshold": 0.002
},
{
"month": "2027-01",
"mean": 10138,
"lower_80": 6707,
"upper_80": 15325,
"lower_95": 5389,
"upper_95": 19071,
"p_exceed_threshold": 0
},
{
"month": "2027-02",
"mean": 11587,
"lower_80": 7369,
"upper_80": 18220,
"lower_95": 5799,
"upper_95": 23152,
"p_exceed_threshold": 0
}
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#countryForecast"
}
}#Detected anomalies
/v1/countries/{country}/anomaliesKey optionalMonths flagged by the outbreak score or the robust z-score, most recent first.
| Parameter | In | Type | Description |
|---|---|---|---|
country required | path | string | ISO 3166-1 alpha-3 code (IDN) or slug (indonesia). |
curl "https://api.sentinara.org/v1/countries/ECU/anomalies"const res = await fetch('https://api.sentinara.org/v1/countries/ECU/anomalies');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/countries/ECU/anomalies", timeout=30).json()["data"]Example response 200
{
"data": {
"iso3": "ECU",
"name": "Ecuador",
"total": 15,
"recent": [
{
"month": "2026-09",
"cases": 5822,
"expected": 1606,
"upper_bound": 4836,
"outbreak_score": 1.31,
"robust_z": 3.04,
"type": "spike",
"method": "farrington"
},
{
"month": "2024-07",
"cases": 5937,
"expected": 1540,
"upper_bound": 4299,
"outbreak_score": 1.59,
"robust_z": 0.15,
"type": "spike",
"method": "farrington"
},
{
"month": "2024-06",
"cases": 6192,
"expected": 1817,
"upper_bound": 3951,
"outbreak_score": 2.05,
"robust_z": -0.58,
"type": "spike",
"method": "farrington"
},
{
"month": "2024-05",
"cases": 9970,
"expected": 1920,
"upper_bound": 3993,
"outbreak_score": 3.88,
"robust_z": 0.71,
"type": "spike",
"method": "farrington"
},
{
"month": "2024-04",
"cases": 8185,
"expected": 2048,
"upper_bound": 4638,
"outbreak_score": 2.37,
"robust_z": 0,
"type": "spike",
"method": "farrington"
},
{
"month": "2024-03",
"cases": 7605,
"expected": 1885,
"upper_bound": 4717,
"outbreak_score": 2.02,
"robust_z": 0,
"type": "spike",
"method": "farrington"
},
"… 9 more"
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#countryAnomalies"
}
}#Early warning
Countries with an active signal and the outbreak probability calendar.
#Countries with a signal
/v1/warningsKey optionalList · CSVCountries at or above min_level (default watch), ordered by score, with plain-language reasons.
| Parameter | In | Type | Description |
|---|---|---|---|
level | query | normal | watch | alert | outbreak | Early-warning level. |
min_level | query | normal | watch | alert | outbreak default watch | Minimum level (ignored when level is set). |
region | query | AMR | SEAR | WPR | EMR | AFR | EUR | WHO region (case-insensitive). |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/warnings?min_level=alert"const res = await fetch('https://api.sentinara.org/v1/warnings?min_level=alert');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/warnings?min_level=alert", timeout=30).json()["data"]Example response 200
{
"data": [
{
"iso3": "ECU",
"slug": "ecuador",
"name": "Ecuador",
"region": "AMR",
"level": "outbreak",
"score": 8,
"as_of": "2026-09",
"endemic_zone": "epidemi",
"reasons": [
{
"code": "zone-epidemic",
"text": "Latest month is above the epidemic threshold of the endemic channel"
},
{
"code": "outbreak-score",
"text": "Outbreak score above 1: cases exceed the 99.5% upper bound for the season",
"value": 1.31
},
{
"code": "sustained-rise",
"text": "CUSUM detects a sustained rise",
"since": "2026-07"
},
{
"code": "forecast-exceed",
"text": "High probability that the next three months exceed the epidemic threshold",
"value": 0.581
}
],
"p_exceed_next_3_months": 0.581,
"outbreak_score": 1.31,
"momentum_pct": 26.2,
"next_month": {
"month": "2026-10",
"mean": 4216,
"lower_80": 2933,
"upper_80": 6059
},
"links": {
"country": "https://api.sentinara.org/v1/countries/ECU"
}
},
{
"iso3": "KHM",
"slug": "cambodia",
"name": "Cambodia",
"region": "WPR",
"level": "outbreak",
"score": 7.5,
"as_of": "2026-09",
"endemic_zone": "waspada",
"reasons": [
{
"code": "zone-alert",
"text": "Latest month is above the 3rd quartile of the previous five years"
},
{
"code": "outbreak-score",
"text": "Outbreak score above 1: cases exceed the 99.5% upper bound for the season",
"value": 1.63
},
{
"code": "sustained-rise",
"text": "CUSUM detects a sustained rise",
"since": "2026-07"
},
{
"code": "forecast-exceed",
"text": "High probability that the next three months exceed the epidemic threshold",
"value": 0.586
},
{
"code": "momentum",
"text": "Last three months well above the three months before",
"value": 512.2
}
],
"p_exceed_next_3_months": 0.586,
"outbreak_score": 1.63,
"momentum_pct": 512.2,
"next_month": {
"month": "2026-10",
"mean": 17855,
"lower_80": 10409,
"upper_80": 30626
},
"links": {
"country": "https://api.sentinara.org/v1/countries/KHM"
}
},
{
"iso3": "LKA",
"slug": "sri-lanka",
"name": "Sri Lanka",
"region": "SEAR",
"level": "outbreak",
"score": 5.5,
"as_of": "2026-08",
"endemic_zone": "waspada",
"reasons": [
{
"code": "zone-alert",
"text": "Latest month is above the 3rd quartile of the previous five years"
},
{
"code": "elevated-score",
"text": "Outbreak score above 0.5: cases well above the seasonal expectation",
"value": 0.86
},
{
"code": "forecast-exceed",
"text": "High probability that the next three months exceed the epidemic threshold",
"value": 0.721
},
{
"code": "momentum",
"text": "Last three months well above the three months before",
"value": 204.1
}
],
"p_exceed_next_3_months": 0.721,
"outbreak_score": 0.86,
"momentum_pct": 204.1,
"next_month": {
"month": "2026-09",
"mean": 5673,
"lower_80": 3919,
"upper_80": 8214
},
"links": {
"country": "https://api.sentinara.org/v1/countries/LKA"
}
},
{
"iso3": "PER",
"slug": "peru",
"name": "Peru",
"region": "AMR",
"level": "outbreak",
"score": 5.5,
"as_of": "2026-09",
"endemic_zone": "waspada",
"reasons": [
{
"code": "zone-alert",
"text": "Latest month is above the 3rd quartile of the previous five years"
},
{
"code": "elevated-score",
"text": "Outbreak score above 0.5: cases well above the seasonal expectation",
"value": 0.56
},
{
"code": "sustained-rise",
"text": "CUSUM detects a sustained rise",
"since": "2026-07"
},
{
"code": "forecast-exceed-possible",
"text": "Possible crossing of the epidemic threshold within three months",
"value": 0.448
},
{
"code": "momentum",
"text": "Last three months well above the three months before",
"value": 42.2
}
],
"p_exceed_next_3_months": 0.448,
"outbreak_score": 0.56,
"momentum_pct": 42.2,
"next_month": {
"month": "2026-10",
"mean": 6088,
"lower_80": 3365,
"upper_80": 11013
},
"links": {
"country": "https://api.sentinara.org/v1/countries/PER"
}
},
{
"iso3": "MDV",
"slug": "maldives",
"name": "Maldives",
"region": "SEAR",
"level": "outbreak",
"score": 4.5,
"as_of": "2026-08",
"endemic_zone": "waspada",
"reasons": [
{
"code": "zone-alert",
"text": "Latest month is above the 3rd quartile of the previous five years"
},
{
"code": "elevated-score",
"text": "Outbreak score above 0.5: cases well above the seasonal expectation",
"value": 0.66
},
{
"code": "forecast-exceed",
"text": "High probability that the next three months exceed the epidemic threshold",
"value": 0.548
}
],
"p_exceed_next_3_months": 0.548,
"outbreak_score": 0.66,
"momentum_pct": -23,
"next_month": {
"month": "2026-09",
"mean": 347,
"lower_80": 214,
"upper_80": 561
},
"links": {
"country": "https://api.sentinara.org/v1/countries/MDV"
}
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#warnings",
"counts": {
"normal": 44,
"watch": 8,
"alert": 0,
"outbreak": 5,
"stale": 2,
"insufficient": 140
},
"engine_version": "1.0.0",
"total": 5,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/warnings?min_level=alert",
"next": null
}
}#Outbreak probability calendar
/v1/warnings/calendarKey optionalList · CSVFor countries whose forecast has shown skill: the probability that each of the next six months exceeds its epidemic threshold.
| Parameter | In | Type | Description |
|---|---|---|---|
min_probability | query | number default 0 | Only countries whose highest monthly probability is at least this value. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/warnings/calendar?min_probability=0.2"const res = await fetch('https://api.sentinara.org/v1/warnings/calendar?min_probability=0.2');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/warnings/calendar?min_probability=0.2", timeout=30).json()["data"]Example response 200
{
"data": [
{
"iso3": "KHM",
"name": "Cambodia",
"max_probability": 0.803,
"months": [
{
"month": "2026-10",
"p_exceed_threshold": 0.08
},
{
"month": "2026-11",
"p_exceed_threshold": 0.21
},
{
"month": "2026-12",
"p_exceed_threshold": 0.431
},
{
"month": "2027-01",
"p_exceed_threshold": 0.803
},
{
"month": "2027-02",
"p_exceed_threshold": 0.71
},
{
"month": "2027-03",
"p_exceed_threshold": 0.758
}
]
},
{
"iso3": "ECU",
"name": "Ecuador",
"max_probability": 0.572,
"months": [
{
"month": "2026-10",
"p_exceed_threshold": 0.11
},
{
"month": "2026-11",
"p_exceed_threshold": 0.206
},
{
"month": "2026-12",
"p_exceed_threshold": 0.407
},
{
"month": "2027-01",
"p_exceed_threshold": 0.32
},
{
"month": "2027-02",
"p_exceed_threshold": 0.489
},
{
"month": "2027-03",
"p_exceed_threshold": 0.572
}
]
},
{
"iso3": "LKA",
"name": "Sri Lanka",
"max_probability": 0.509,
"months": [
{
"month": "2026-09",
"p_exceed_threshold": 0.342
},
{
"month": "2026-10",
"p_exceed_threshold": 0.509
},
{
"month": "2026-11",
"p_exceed_threshold": 0.136
},
{
"month": "2026-12",
"p_exceed_threshold": 0.072
},
{
"month": "2027-01",
"p_exceed_threshold": 0.061
},
{
"month": "2027-02",
"p_exceed_threshold": 0.196
}
]
},
{
"iso3": "MDV",
"name": "Maldives",
"max_probability": 0.457,
"months": [
{
"month": "2026-09",
"p_exceed_threshold": 0.457
},
{
"month": "2026-10",
"p_exceed_threshold": 0.007
},
{
"month": "2026-11",
"p_exceed_threshold": 0.162
},
{
"month": "2026-12",
"p_exceed_threshold": 0.062
},
{
"month": "2027-01",
"p_exceed_threshold": 0.058
},
{
"month": "2027-02",
"p_exceed_threshold": 0.116
}
]
},
{
"iso3": "PER",
"name": "Peru",
"max_probability": 0.235,
"months": [
{
"month": "2026-10",
"p_exceed_threshold": 0.235
},
{
"month": "2026-11",
"p_exceed_threshold": 0.06
},
{
"month": "2026-12",
"p_exceed_threshold": 0.232
},
{
"month": "2027-01",
"p_exceed_threshold": 0.153
},
{
"month": "2027-02",
"p_exceed_threshold": 0.032
},
{
"month": "2027-03",
"p_exceed_threshold": 0.015
}
]
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#warningsCalendar",
"total": 5,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/warnings/calendar?min_probability=0.2",
"next": null
}
}#Indonesia
National series since 2010, annual totals since 1968, forecast and 33 harmonised provinces.
#National summary
/v1/indonesiaKey optionalCurrent endemic-channel status, year to date, peak month, seasonality and warning assessment.
curl "https://api.sentinara.org/v1/indonesia"const res = await fetch('https://api.sentinara.org/v1/indonesia');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia", timeout=30).json()["data"]Example response 200
{
"data": {
"name": "Indonesia",
"latest_month": "2026-09",
"latest_complete_month": "2026-08",
"population": 285721236,
"status": {
"month": "2026-08",
"cases": 4167,
"endemic_zone": "sukses",
"median": 11745,
"q3": 12348,
"epidemic_threshold": 28363
},
"year_to_date": {
"year": 2026,
"through_month": 8,
"cases": 88178,
"deaths": 240,
"case_fatality_pct": 0.27,
"previous_year_cases": 130105,
"change_pct": -32.2,
"vs_five_year_average_pct": -21.1
},
"peak_month_on_record": {
"month": "2024-03",
"cases": 32292
},
"seasonality_share_pct": [
13.4,
12.05,
10.8,
9.42,
9.07,
7.64,
"… 6 more"
],
"warning": {
"status": "ok",
"level": "normal",
"score": 0,
"as_of": "2026-08",
"reliability": "high",
"forecast_skilled": true,
"endemic_zone": "sukses",
"reasons": [
{
"code": "within-pattern",
"text": "Within the usual range for this time of year"
}
],
"signals": {
"outbreak_score": -0.41,
"expected_cases": 9867,
"upper_bound": 23654,
"robust_z": -2.45,
"cusum": 0,
"cusum_alarm": false,
"p_exceed_next_3_months": 0,
"momentum_pct": -42.3,
"vs_last_year_pct": -45.2
},
"points": [
{
"signal": "zone",
"points": 0
},
{
"signal": "outbreak-score",
"points": 0
},
{
"signal": "cusum",
"points": 0
},
{
"signal": "forecast",
"points": 0,
"used": true
},
{
"signal": "momentum",
"points": 0
}
],
"endemic_channel": {
"reference_years": [
2021,
2022,
2023,
2024,
2025
],
"median": [
20486,
11849,
10220,
10664,
12470,
12762,
"… 6 more"
],
"q3": [
23805,
19930,
15838,
14656,
16208,
14239,
"… 6 more"
],
"epidemic_threshold": [
62418,
51467,
44009,
39313,
42365,
34644,
"… 6 more"
]
},
"seasonality": {
"share_pct": [
13.4,
12.05,
10.8,
9.42,
9.07,
7.64,
"… 6 more"
],
"peak_month": 1,
"complete_years": 16
},
"data_quality": {
"completeness": 1,
"months_reported": 200,
"longest_gap_months": 0,
"suspect_months": [],
"interpolated_months": []
}
},
"links": {
"series": "https://api.sentinara.org/v1/indonesia/series",
"annual": "https://api.sentinara.org/v1/indonesia/annual",
"forecast": "https://api.sentinara.org/v1/indonesia/forecast",
"provinces": "https://api.sentinara.org/v1/indonesia/provinces"
}
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#indonesia"
}
}#National monthly series
/v1/indonesia/seriesKey optionalList · CSVMonthly cases and deaths since 2010 (WHO).
| Parameter | In | Type | Description |
|---|---|---|---|
from | query | string | First month (YYYY-MM), inclusive. |
to | query | string | Last month (YYYY-MM), inclusive. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/indonesia/series?from=2024-01"const res = await fetch('https://api.sentinara.org/v1/indonesia/series?from=2024-01');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/series?from=2024-01", timeout=30).json()["data"]Example response 200
{
"data": [
{
"month": "2024-01",
"cases": 27268,
"deaths": 180
},
{
"month": "2024-02",
"cases": 29411,
"deaths": 229
},
{
"month": "2024-03",
"cases": 32292,
"deaths": 219
},
{
"month": "2024-04",
"cases": 30123,
"deaths": 176
},
{
"month": "2024-05",
"cases": 32020,
"deaths": 208
},
{
"month": "2024-06",
"cases": 24098,
"deaths": 98
},
"… 27 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#indonesiaSeries",
"source": "WHO Global Dengue Surveillance",
"latest_complete_month": "2026-08",
"total": 33,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/indonesia/series?from=2024-01",
"next": null
}
}#Annual totals since 1968
/v1/indonesia/annualKey optionalList · CSVOpenDengue before 2010, WHO from 2010, with incidence and case fatality.
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/indonesia/annual?format=csv"const res = await fetch('https://api.sentinara.org/v1/indonesia/annual?format=csv');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/annual?format=csv", timeout=30).json()["data"]Example response 200
year,cases,deaths,incidence_per_100k,case_fatality_pct,partial,source
1968,58,,,,false,OpenDengue
1969,167,,,,false,OpenDengue
1970,477,,,,false,OpenDengue
…#National forecast
/v1/indonesia/forecastKey optionalSix-month ensemble forecast for Indonesia, including whether climate covariates were adopted.
curl "https://api.sentinara.org/v1/indonesia/forecast"const res = await fetch('https://api.sentinara.org/v1/indonesia/forecast');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/forecast", timeout=30).json()["data"]Example response 200
{
"data": {
"name": "Indonesia",
"climate_covariates_used": false,
"issued_from": "2026-08",
"model": "weighted ensemble (seasonal naive, damped Holt-Winters, harmonic regression with AR terms)",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.457,
"harmonicAR": 0.543
},
"backtest": {
"origins": 26,
"mape_pct": 12.6,
"mase": 0.25,
"coverage_80": 0.81
},
"skilled": true,
"months": [
{
"month": "2026-09",
"mean": 4020,
"lower_80": 3298,
"upper_80": 4900,
"lower_95": 2970,
"upper_95": 5441,
"p_exceed_threshold": 0
},
{
"month": "2026-10",
"mean": 4209,
"lower_80": 3179,
"upper_80": 5572,
"lower_95": 2740,
"upper_95": 6465,
"p_exceed_threshold": 0
},
{
"month": "2026-11",
"mean": 4879,
"lower_80": 3551,
"upper_80": 6703,
"lower_95": 3001,
"upper_95": 7931,
"p_exceed_threshold": 0
},
{
"month": "2026-12",
"mean": 5579,
"lower_80": 3866,
"upper_80": 8052,
"lower_95": 3183,
"upper_95": 9777,
"p_exceed_threshold": 0
},
{
"month": "2027-01",
"mean": 8748,
"lower_80": 5804,
"upper_80": 13183,
"lower_95": 4672,
"upper_95": 16380,
"p_exceed_threshold": 0
},
{
"month": "2027-02",
"mean": 9351,
"lower_80": 5966,
"upper_80": 14654,
"lower_95": 4703,
"upper_95": 18589,
"p_exceed_threshold": 0
}
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#indonesiaForecast"
}
}#List provinces
/v1/indonesia/provincesKey optionalList · CSVCases and incidence per province for the latest complete year (or year).
| Parameter | In | Type | Description |
|---|---|---|---|
region | query | string | Island group, e.g. Jawa, Sumatera. |
year | query | integer | Year (2007 onwards). |
sort | query | name | incidence | -incidence | cases | -cases default -incidence | Sort field. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/indonesia/provinces?region=Jawa"const res = await fetch('https://api.sentinara.org/v1/indonesia/provinces?region=Jawa');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/provinces?region=Jawa", timeout=30).json()["data"]Example response 200
{
"data": [
{
"id": "jabar",
"slug": "jawa-barat",
"name": "Jawa Barat",
"region": "Jawa",
"capital": "Bandung",
"lat": -6.9175,
"lng": 107.6191,
"year": 2023,
"cases": 19328,
"incidence_per_100k": 37.6,
"complete_year": true,
"pattern_level": "outbreak",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/jawa-barat",
"page": "https://sentinara.org/indonesia/jawa-barat"
}
},
{
"id": "jakarta",
"slug": "dki-jakarta",
"name": "DKI Jakarta",
"region": "Jawa",
"capital": "Jakarta",
"lat": -6.2088,
"lng": 106.8456,
"year": 2023,
"cases": 3908,
"incidence_per_100k": 35.1,
"complete_year": true,
"pattern_level": "watch",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/dki-jakarta",
"page": "https://sentinara.org/indonesia/dki-jakarta"
}
},
{
"id": "banten",
"slug": "banten",
"name": "Banten",
"region": "Jawa",
"capital": "Serang",
"lat": -6.12,
"lng": 106.1503,
"year": 2023,
"cases": 4154,
"incidence_per_100k": 31,
"complete_year": true,
"pattern_level": "alert",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/banten",
"page": "https://sentinara.org/indonesia/banten"
}
},
{
"id": "jatim",
"slug": "jawa-timur",
"name": "Jawa Timur",
"region": "Jawa",
"capital": "Surabaya",
"lat": -7.2575,
"lng": 112.7521,
"year": 2023,
"cases": 9401,
"incidence_per_100k": 22.5,
"complete_year": true,
"pattern_level": "watch",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/jawa-timur",
"page": "https://sentinara.org/indonesia/jawa-timur"
}
},
{
"id": "jateng",
"slug": "jawa-tengah",
"name": "Jawa Tengah",
"region": "Jawa",
"capital": "Semarang",
"lat": -6.9932,
"lng": 110.4203,
"year": 2023,
"cases": 6659,
"incidence_per_100k": 18.9,
"complete_year": true,
"pattern_level": "alert",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/jawa-tengah",
"page": "https://sentinara.org/indonesia/jawa-tengah"
}
},
{
"id": "diy",
"slug": "di-yogyakarta",
"name": "DI Yogyakarta",
"region": "Jawa",
"capital": "Yogyakarta",
"lat": -7.7956,
"lng": 110.3695,
"year": 2023,
"cases": 700,
"incidence_per_100k": 17.8,
"complete_year": true,
"pattern_level": "watch",
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/di-yogyakarta",
"page": "https://sentinara.org/indonesia/di-yogyakarta"
}
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#provinces",
"source": "OpenDengue V1.3",
"population_note": "BPS 2016 provincial shares × World Bank national population",
"total": 6,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces?region=Jawa",
"next": null
}
}#Province profile
/v1/indonesia/provinces/{province}Key optionalAnnual cases, population and incidence, plus the pattern assessment at the latest provincial month.
| Parameter | In | Type | Description |
|---|---|---|---|
province required | path | string | Province slug (jawa-barat) or id (jabar). |
curl "https://api.sentinara.org/v1/indonesia/provinces/jawa-barat"const res = await fetch('https://api.sentinara.org/v1/indonesia/provinces/jawa-barat');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/provinces/jawa-barat", timeout=30).json()["data"]Example response 200
{
"data": {
"id": "jabar",
"slug": "jawa-barat",
"name": "Jawa Barat",
"region": "Jawa",
"capital": "Bandung",
"lat": -6.9175,
"lng": 107.6191,
"annual": [
{
"year": 2007,
"cases": 30536,
"population": 51889200,
"incidence_per_100k": 58.8,
"complete": true
},
{
"year": 2008,
"cases": 23248,
"population": 51889200,
"incidence_per_100k": 44.8,
"complete": true
},
{
"year": 2009,
"cases": 37861,
"population": 51889200,
"incidence_per_100k": 73,
"complete": true
},
{
"year": 2010,
"cases": 25727,
"population": 45083351,
"incidence_per_100k": 57.1,
"complete": true
},
{
"year": 2011,
"cases": 13971,
"population": 45662615,
"incidence_per_100k": 30.6,
"complete": true
},
{
"year": 2012,
"cases": 19663,
"population": 46253554,
"incidence_per_100k": 42.5,
"complete": true
},
"… 12 more"
],
"pattern_assessment": {
"status": "ok",
"level": "outbreak",
"score": 5,
"as_of": "2024-07",
"reliability": "medium",
"forecast_skilled": false,
"endemic_zone": "epidemi",
"reasons": [
{
"code": "zone-epidemic",
"text": "Latest month is above the epidemic threshold of the endemic channel"
},
{
"code": "outbreak-score",
"text": "Outbreak score above 1: cases exceed the 99.5% upper bound for the season",
"value": 1.27
}
],
"signals": {
"outbreak_score": 1.27,
"expected_cases": 1942,
"upper_bound": 4133,
"robust_z": -1.37,
"cusum": 0,
"cusum_alarm": false,
"p_exceed_next_3_months": null,
"momentum_pct": -12,
"vs_last_year_pct": 308.6
},
"points": [
{
"signal": "zone",
"points": 3
},
{
"signal": "outbreak-score",
"points": 2
},
{
"signal": "cusum",
"points": 0
},
{
"signal": "forecast",
"points": 0,
"used": false
},
{
"signal": "momentum",
"points": 0
}
],
"endemic_channel": {
"reference_years": [
2019,
2020,
2021,
2022,
2023
],
"median": [
2438,
2791,
3158,
2684,
2574,
2171,
"… 6 more"
],
"q3": [
4505,
3512,
3168,
3070,
2636,
2621,
"… 6 more"
],
"epidemic_threshold": [
10950,
7381,
5449,
4876,
4361,
4122,
"… 6 more"
]
},
"seasonality": {
"share_pct": [
13.06,
11.02,
10.54,
10.31,
10.54,
9.37,
"… 6 more"
],
"peak_month": 1,
"complete_years": 17
},
"data_quality": {
"completeness": 0.986,
"months_reported": 208,
"longest_gap_months": 1,
"suspect_months": [],
"interpolated_months": [
"2011-04",
"2016-02",
"2020-09"
]
}
},
"similar_seasonality": [
"banten",
"diy",
"jateng",
"malut",
"kaltim"
],
"links": {
"series": "https://api.sentinara.org/v1/indonesia/provinces/jawa-barat/series",
"page": "https://sentinara.org/indonesia/jawa-barat"
}
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#province"
}
}#Province monthly series
/v1/indonesia/provinces/{province}/seriesKey optionalList · CSVMonthly cases from OpenDengue (2007 to 2024).
| Parameter | In | Type | Description |
|---|---|---|---|
province required | path | string | Province slug (jawa-barat) or id (jabar). |
from | query | string | First month (YYYY-MM), inclusive. |
to | query | string | Last month (YYYY-MM), inclusive. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/indonesia/provinces/bali/series?from=2023-01"const res = await fetch('https://api.sentinara.org/v1/indonesia/provinces/bali/series?from=2023-01');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/indonesia/provinces/bali/series?from=2023-01", timeout=30).json()["data"]Example response 200
{
"data": [
{
"month": "2023-01",
"cases": 965
},
{
"month": "2023-02",
"cases": 963
},
{
"month": "2023-03",
"cases": 1005
},
{
"month": "2023-04",
"cases": 870
},
{
"month": "2023-05",
"cases": 851
},
{
"month": "2023-06",
"cases": 603
},
"… 18 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#provinceSeries",
"slug": "bali",
"total": 24,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/indonesia/provinces/bali/series?from=2023-01",
"next": null
}
}#Semarang
177 sub-districts of Semarang City: risk scores and spatial hotspots.
#List sub-districts
/v1/semarang/subdistrictsKey optionalList · CSVRisk score and level for each of the 177 kelurahan in the latest year, with hotspot class.
| Parameter | In | Type | Description |
|---|---|---|---|
kecamatan | query | string | District name. |
risk | query | sangat-tinggi | tinggi | sedang | rendah | Risk level. |
q | query | string | Case-insensitive text search. |
sort | query | score | -score | incidence | -incidence | name default -score | Sort field. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/semarang/subdistricts?risk=sangat-tinggi"const res = await fetch('https://api.sentinara.org/v1/semarang/subdistricts?risk=sangat-tinggi');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/semarang/subdistricts?risk=sangat-tinggi", timeout=30).json()["data"]Example response 200
{
"data": [
{
"id": 6,
"name": "Banyumanik",
"kecamatan": "Banyumanik",
"year": 2024,
"cases": 93,
"dhf_cases": 5,
"df_cases": 88,
"incidence_per_100k": 798.9,
"five_year_mean_incidence": 340.1,
"trend_pct": 135,
"persistence": 0.78,
"risk_score": 0.859,
"risk_level": "sangat-tinggi",
"hotspot": "hot90"
},
{
"id": 110,
"name": "Pekunden",
"kecamatan": "Semarang Tengah",
"year": 2024,
"cases": 27,
"dhf_cases": 1,
"df_cases": 26,
"incidence_per_100k": 755,
"five_year_mean_incidence": 145.7,
"trend_pct": 418,
"persistence": 0.33,
"risk_score": 0.846,
"risk_level": "sangat-tinggi",
"hotspot": "ns"
},
{
"id": 137,
"name": "Sambirejo",
"kecamatan": "Gayamsari",
"year": 2024,
"cases": 68,
"dhf_cases": 3,
"df_cases": 65,
"incidence_per_100k": 840.5,
"five_year_mean_incidence": 203.8,
"trend_pct": 312,
"persistence": 0.22,
"risk_score": 0.827,
"risk_level": "sangat-tinggi",
"hotspot": "ns"
},
{
"id": 101,
"name": "Pandansari",
"kecamatan": "Semarang Tengah",
"year": 2024,
"cases": 22,
"dhf_cases": 2,
"df_cases": 20,
"incidence_per_100k": 861.1,
"five_year_mean_incidence": 101.9,
"trend_pct": 745,
"persistence": 0.11,
"risk_score": 0.819,
"risk_level": "sangat-tinggi",
"hotspot": "hot90"
},
{
"id": 147,
"name": "Siwalan",
"kecamatan": "Gayamsari",
"year": 2024,
"cases": 64,
"dhf_cases": 2,
"df_cases": 62,
"incidence_per_100k": 765.2,
"five_year_mean_incidence": 198.6,
"trend_pct": 285,
"persistence": 0.22,
"risk_score": 0.812,
"risk_level": "sangat-tinggi",
"hotspot": "ns"
},
{
"id": 15,
"name": "Bubakan",
"kecamatan": "Mijen",
"year": 2024,
"cases": 24,
"dhf_cases": 2,
"df_cases": 22,
"incidence_per_100k": 884,
"five_year_mean_incidence": 258.2,
"trend_pct": 242,
"persistence": 0.22,
"risk_score": 0.809,
"risk_level": "sangat-tinggi",
"hotspot": "ns"
},
"… 13 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#subdistricts",
"source": "Dinas Kesehatan Kota Semarang",
"risk_levels": [
"sangat-tinggi (very high)",
"tinggi (high)",
"sedang (moderate)",
"rendah (low)"
],
"total": 19,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/semarang/subdistricts?risk=sangat-tinggi",
"next": null
}
}#Sub-district profile
/v1/semarang/subdistricts/{id}Key optionalAnnual cases and population, risk components and Gi* z-scores by year.
| Parameter | In | Type | Description |
|---|---|---|---|
id required | path | integer | Sub-district (kelurahan) id from /v1/semarang/subdistricts. |
curl "https://api.sentinara.org/v1/semarang/subdistricts/0"const res = await fetch('https://api.sentinara.org/v1/semarang/subdistricts/0');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/semarang/subdistricts/0", timeout=30).json()["data"]Example response 200
{
"data": {
"id": 0,
"name": "Bambankerep",
"kecamatan": "Banyumanik",
"lat": -6.9935,
"lng": 110.4027,
"risk_score": 0.794,
"risk_level": "sangat-tinggi",
"incidence_per_100k": 676,
"trend_pct": 308,
"persistence": 0.22,
"annual_cases": [
{
"year": 2016,
"cases": 16,
"population": 6006
},
{
"year": 2017,
"cases": 0,
"population": 5816
},
{
"year": 2018,
"cases": 3,
"population": 5921
},
{
"year": 2019,
"cases": 3,
"population": 5921
},
{
"year": 2020,
"cases": 15,
"population": 5917
},
{
"year": 2021,
"cases": 1,
"population": 5917
},
"… 3 more"
],
"hotspot_gi_z": [
{
"year": 2016,
"z": -0.45
},
{
"year": 2017,
"z": -1.89
},
{
"year": 2018,
"z": 0.45
},
{
"year": 2019,
"z": -1.98
},
{
"year": 2020,
"z": -0.97
},
{
"year": 2021,
"z": -1.25
},
"… 3 more"
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#subdistrict"
}
}#Spatial hotspots
/v1/semarang/hotspotsKey optionalMoran's I for the year and the Getis-Ord Gi* class of every sub-district.
| Parameter | In | Type | Description |
|---|---|---|---|
year | query | integer | Year (default: latest). |
curl "https://api.sentinara.org/v1/semarang/hotspots?year=2024"const res = await fetch('https://api.sentinara.org/v1/semarang/hotspots?year=2024');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/semarang/hotspots?year=2024", timeout=30).json()["data"]Example response 200
{
"data": {
"year": 2024,
"neighbours_k": 6,
"morans_i": {
"year": 2024,
"I": 0.001,
"expected": -0.0057,
"z": 0.18,
"p": 0.426
},
"subdistricts": [
{
"id": 11,
"name": "Beringin",
"kecamatan": "Ngaliyan",
"gi_z": 2.67,
"class": "hot99"
},
{
"id": 5,
"name": "Banjardowo",
"kecamatan": "Genuk",
"gi_z": 2.44,
"class": "hot95"
},
{
"id": 29,
"name": "Gedawang",
"kecamatan": "Banyumanik",
"gi_z": 1.87,
"class": "hot90"
},
{
"id": 40,
"name": "Jatirejo",
"kecamatan": "Gunungpati",
"gi_z": 1.86,
"class": "hot90"
},
{
"id": 101,
"name": "Pandansari",
"kecamatan": "Semarang Tengah",
"gi_z": 1.86,
"class": "hot90"
},
{
"id": 131,
"name": "Randusari",
"kecamatan": "Semarang Selatan",
"gi_z": 1.82,
"class": "hot90"
},
"… 171 more"
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#hotspots"
}
}#Models
Model performance, backtests, the real-time forecast archive, multi-year cycles and climate.
#Model performance
/v1/modelsKey optionalCalibration, best-model counts, the Indonesia ensemble, the climate test and the forecast leaderboard.
curl "https://api.sentinara.org/v1/models"const res = await fetch('https://api.sentinara.org/v1/models');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/models", timeout=30).json()["data"]Example response 200
{
"data": {
"version": "1.0.0",
"updated_at": "2026-10-31T06:49:43.461Z",
"calibration": [
{
"level": 0.5,
"observed": 0.577,
"n": 1396
},
{
"level": 0.8,
"observed": 0.801,
"n": 1396
},
{
"level": 0.9,
"observed": 0.894,
"n": 1396
},
{
"level": 0.95,
"observed": 0.941,
"n": 1396
}
],
"best_model_counts": {
"harmonicAR": 26,
"holtWinters": 9,
"seasonalNaive": 3
},
"indonesia": {
"backtest": {
"origins": 26,
"horizons": 3,
"mape": 12.6,
"mase": 0.25,
"coverage80": 0.81,
"maeLog": 0.1163
},
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.457,
"harmonicAR": 0.543
},
"models": [
{
"id": "seasonalNaive",
"label": "Seasonal naive",
"weight": 0,
"maeLog": 0.376,
"mape": 47.8
},
{
"id": "holtWinters",
"label": "Damped Holt-Winters",
"weight": 0.457,
"maeLog": 0.186,
"mape": 13.5
},
{
"id": "harmonicAR",
"label": "Harmonic regression + AR (ridge)",
"weight": 0.543,
"maeLog": 0.171,
"mape": 15
}
]
},
"climate": {
"adopted": false,
"with_climate": {
"mape": 12.8,
"mase": 0.26,
"maeLog": 0.1209,
"coverage80": 0.81
},
"without_climate": {
"mape": 12.6,
"mase": 0.25,
"maeLog": 0.1163,
"coverage80": 0.81
},
"correlations": {
"oni": [
{
"lag": 0,
"r": -0.012
},
{
"lag": 1,
"r": 0.082
},
{
"lag": 2,
"r": 0.175
},
{
"lag": 3,
"r": 0.249
},
{
"lag": 4,
"r": 0.291
},
{
"lag": 5,
"r": 0.292
},
"… 7 more"
],
"rain": [
{
"lag": 0,
"r": 0.327
},
{
"lag": 1,
"r": 0.383
},
{
"lag": 2,
"r": 0.288
},
{
"lag": 3,
"r": 0.063
},
{
"lag": 4,
"r": -0.139
}
],
"temp": [
{
"lag": 0,
"r": 0.076
},
{
"lag": 1,
"r": 0.189
},
{
"lag": 2,
"r": 0.335
},
{
"lag": 3,
"r": 0.439
},
{
"lag": 4,
"r": 0.427
}
],
"rh": [
{
"lag": 0,
"r": 0.324
},
{
"lag": 1,
"r": 0.291
},
{
"lag": 2,
"r": 0.105
},
{
"lag": 3,
"r": -0.162
},
{
"lag": 4,
"r": -0.361
}
]
},
"enso": {
"ym": "2026-08",
"value": 2.16
},
"enso_phase": "strong-el-nino"
},
"leaderboard": [
{
"iso3": "ARG",
"slug": "argentina",
"name": "Argentina",
"nameEn": "Argentina",
"region": "AMR",
"mape": 92.6,
"mase": 0.02,
"coverage80": 0.81,
"best": "harmonicAR",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.475,
"harmonicAR": 0.525
},
"level": "normal",
"reliability": "medium",
"avgCases": 745,
"ranked": true
},
{
"iso3": "URY",
"slug": "uruguay",
"name": "Uruguay",
"nameEn": "Uruguay",
"region": "AMR",
"mape": 96.7,
"mase": 0.02,
"coverage80": 0.81,
"best": "holtWinters",
"weights": {
"seasonalNaive": 0,
"holtWinters": 1,
"harmonicAR": 0
},
"level": "normal",
"reliability": "low",
"avgCases": 0,
"ranked": false
},
{
"iso3": "JAM",
"slug": "jamaica",
"name": "Jamaika",
"nameEn": "Jamaica",
"region": "AMR",
"mape": 39.2,
"mase": 0.05,
"coverage80": 0.73,
"best": "harmonicAR",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.36,
"harmonicAR": 0.64
},
"level": "watch",
"reliability": "high",
"avgCases": 41,
"ranked": true
},
{
"iso3": "BLM",
"slug": "saint-barthelemy",
"name": "Saint Barthélemy",
"nameEn": "Saint Barthélemy",
"region": "AMR",
"mape": 171.1,
"mase": 0.05,
"coverage80": 0.81,
"best": "harmonicAR",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.488,
"harmonicAR": 0.512
},
"level": "normal",
"reliability": "low",
"avgCases": 2,
"ranked": false
},
{
"iso3": "PRY",
"slug": "paraguay",
"name": "Paraguay",
"nameEn": "Paraguay",
"region": "AMR",
"mape": 36.4,
"mase": 0.06,
"coverage80": 0.73,
"best": "holtWinters",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.552,
"harmonicAR": 0.448
},
"level": "normal",
"reliability": "high",
"avgCases": 2034,
"ranked": true
},
{
"iso3": "DOM",
"slug": "dominican-republic",
"name": "Republik Dominika",
"nameEn": "Dominican Republic",
"region": "AMR",
"mape": 44.1,
"mase": 0.06,
"coverage80": 0.77,
"best": "harmonicAR",
"weights": {
"seasonalNaive": 0,
"holtWinters": 0.371,
"harmonicAR": 0.629
},
"level": "normal",
"reliability": "high",
"avgCases": 146,
"ranked": true
},
"… 48 more"
]
},
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#models"
}
}#Indonesia backtest replay
/v1/models/backtestKey optionalList · CSVOne-month-ahead forecasts the ensemble would have made, against what happened.
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/models/backtest"const res = await fetch('https://api.sentinara.org/v1/models/backtest');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/models/backtest", timeout=30).json()["data"]Example response 200
{
"data": [
{
"month": "2024-07",
"actual": 19265,
"predicted": 20166,
"lower_80": 16545,
"upper_80": 24579
},
{
"month": "2024-08",
"actual": 14563,
"predicted": 16199,
"lower_80": 13290,
"upper_80": 19744
},
{
"month": "2024-09",
"actual": 11074,
"predicted": 12561,
"lower_80": 10306,
"upper_80": 15310
},
{
"month": "2024-10",
"actual": 10970,
"predicted": 11152,
"lower_80": 9149,
"upper_80": 13592
},
{
"month": "2024-11",
"actual": 11975,
"predicted": 12189,
"lower_80": 10001,
"upper_80": 14857
},
{
"month": "2024-12",
"actual": 14212,
"predicted": 12955,
"lower_80": 10629,
"upper_80": 15790
},
"… 20 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#modelsBacktest",
"scope": "Indonesia, one month ahead",
"total": 26,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/models/backtest",
"next": null
}
}#Real-time forecast archive
/v1/models/archiveKey optionalList · CSVEvery archived forecast (first per scope and origin month).
| Parameter | In | Type | Description |
|---|---|---|---|
scope | query | string | ISO3 code; IDN also matches the national forecast. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/models/archive?scope=IDN"const res = await fetch('https://api.sentinara.org/v1/models/archive?scope=IDN');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/models/archive?scope=IDN", timeout=30).json()["data"]Example response 200
{
"data": [
{
"scope": "IDN",
"origin": "2026-08",
"issued": "2026-10-30",
"months": [
{
"month": "2026-09",
"mean": 4057,
"lower_80": 3216,
"upper_80": 5117,
"lower_95": 2844,
"upper_95": 5787
},
{
"month": "2026-10",
"mean": 4294,
"lower_80": 3192,
"upper_80": 5777,
"lower_95": 2728,
"upper_95": 6758
},
{
"month": "2026-11",
"mean": 5395,
"lower_80": 3917,
"upper_80": 7430,
"lower_95": 3307,
"upper_95": 8802
},
{
"month": "2026-12",
"mean": 7478,
"lower_80": 5168,
"upper_80": 10822,
"lower_95": 4249,
"upper_95": 13160
},
{
"month": "2027-01",
"mean": 10138,
"lower_80": 6707,
"upper_80": 15325,
"lower_95": 5389,
"upper_95": 19071
},
{
"month": "2027-02",
"mean": 11587,
"lower_80": 7369,
"upper_80": 18220,
"lower_95": 5799,
"upper_95": 23152
}
]
},
{
"scope": "national:IDN",
"origin": "2026-08",
"issued": "2026-10-30",
"months": [
{
"month": "2026-09",
"mean": 4020,
"lower_80": 3298,
"upper_80": 4900,
"lower_95": 2970,
"upper_95": 5441
},
{
"month": "2026-10",
"mean": 4209,
"lower_80": 3179,
"upper_80": 5572,
"lower_95": 2740,
"upper_95": 6465
},
{
"month": "2026-11",
"mean": 4879,
"lower_80": 3551,
"upper_80": 6703,
"lower_95": 3001,
"upper_95": 7931
},
{
"month": "2026-12",
"mean": 5579,
"lower_80": 3866,
"upper_80": 8052,
"lower_95": 3183,
"upper_95": 9777
},
{
"month": "2027-01",
"mean": 8748,
"lower_80": 5804,
"upper_80": 13183,
"lower_95": 4672,
"upper_95": 16380
},
{
"month": "2027-02",
"mean": 9351,
"lower_80": 5966,
"upper_80": 14654,
"lower_95": 4703,
"upper_95": 18589
}
]
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#archive",
"started": "2026-10-30",
"rule": "only the first forecast per scope and origin month is kept",
"total": 2,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/models/archive?scope=IDN",
"next": null
}
}#Multi-year cycles
/v1/models/cyclesKey optionalList · CSVLomb-Scargle cycle analysis with permutation significance.
| Parameter | In | Type | Description |
|---|---|---|---|
significant | query | true | false | Filter by significance. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/models/cycles?significant=true"const res = await fetch('https://api.sentinara.org/v1/models/cycles?significant=true');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/models/cycles?significant=true", timeout=30).json()["data"]Example response 200
{
"data": [
{
"iso3": "AUS",
"years": [
1979,
2024
],
"n": 37,
"period": 5.2,
"power": 0.301,
"p": 0.038,
"significant": true,
"amplitude": 1.49,
"lastPeak": 2024,
"nextPeak": 2029,
"trendPerYear": 7.8,
"surges": [
1982,
1992,
1993,
1998,
2003,
2009,
"… 2 more"
],
"name": "Australia"
},
{
"iso3": "GUY",
"years": [
1978,
2024
],
"n": 27,
"period": 11.6,
"power": 0.4285,
"p": 0.03,
"significant": true,
"amplitude": 3.62,
"lastPeak": 2023,
"nextPeak": 2034,
"trendPerYear": 15,
"surges": [
1978,
2010,
2012,
2022,
2023,
2024
],
"name": "Guyana"
},
{
"iso3": "NCL",
"years": [
1979,
2024
],
"n": 36,
"period": 4.8,
"power": 0.4499,
"p": 0.004,
"significant": true,
"amplitude": 8.99,
"lastPeak": 2023,
"nextPeak": 2027,
"trendPerYear": 6.3,
"surges": [
1980,
1989,
1995,
1998,
2003,
2009,
"… 2 more"
],
"name": "New Caledonia"
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#cycles",
"method": "Lomb-Scargle periodogram of log annual cases after removing a linear trend; periods 2 to 12 years; 500-permutation test; sinusoid fit for peak timing.",
"total": 3,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/models/cycles?significant=true",
"next": null
}
}#Indonesia climate series
/v1/climate/indonesiaKey optionalList · CSVMonthly rainfall, temperature, humidity (NASA POWER, population-weighted) and ONI.
| Parameter | In | Type | Description |
|---|---|---|---|
from | query | string | First month (YYYY-MM), inclusive. |
to | query | string | Last month (YYYY-MM), inclusive. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/climate/indonesia?from=2025-01"const res = await fetch('https://api.sentinara.org/v1/climate/indonesia?from=2025-01');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/climate/indonesia?from=2025-01", timeout=30).json()["data"]Example response 200
{
"data": [
{
"month": "2025-01",
"rain_mm": 403,
"temperature_c": 25.26,
"humidity_pct": 88.4,
"oni": -0.46
},
{
"month": "2025-02",
"rain_mm": 257,
"temperature_c": 25.3,
"humidity_pct": 88,
"oni": -0.22
},
{
"month": "2025-03",
"rain_mm": 273,
"temperature_c": 25.7,
"humidity_pct": 87.5,
"oni": -0.08
},
{
"month": "2025-04",
"rain_mm": 214,
"temperature_c": 25.8,
"humidity_pct": 85.6,
"oni": 0.02
},
{
"month": "2025-05",
"rain_mm": 252,
"temperature_c": 26.08,
"humidity_pct": 86.6,
"oni": -0.04
},
{
"month": "2025-06",
"rain_mm": 170,
"temperature_c": 25.48,
"humidity_pct": 86.1,
"oni": -0.02
},
"… 15 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#climate",
"sources": [
"NASA POWER (MERRA-2), monthly, 33 provincial capitals, population-weighted",
"NOAA CPC Oceanic Niño Index (ONI)"
],
"note": "Population-weighted mean of the 33 provincial capitals",
"total": 21,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/climate/indonesia?from=2025-01",
"next": null
}
}#Reference
Seasonality, glossary and the dataset catalogue with checksums.
#Seasonal profiles
/v1/seasonalityKey optionalList · CSVMonthly share of yearly cases and peak month.
| Parameter | In | Type | Description |
|---|---|---|---|
scope | query | provinces | countries | national default provinces | Which profiles. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/seasonality?scope=provinces"const res = await fetch('https://api.sentinara.org/v1/seasonality?scope=provinces');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/seasonality?scope=provinces", timeout=30).json()["data"]Example response 200
{
"data": [
{
"id": "aceh",
"slug": "aceh",
"name": "Aceh",
"region": "Sumatera",
"peak_month": 11,
"complete_years": 17,
"share_pct": [
11.07,
9.91,
7.75,
6.14,
6,
6.01,
"… 6 more"
]
},
{
"id": "sumut",
"slug": "sumatera-utara",
"name": "Sumatera Utara",
"region": "Sumatera",
"peak_month": 10,
"complete_years": 17,
"share_pct": [
9.2,
8.12,
7.01,
6.14,
7.25,
8.01,
"… 6 more"
]
},
{
"id": "sumbar",
"slug": "sumatera-barat",
"name": "Sumatera Barat",
"region": "Sumatera",
"peak_month": 1,
"complete_years": 17,
"share_pct": [
11.62,
10.18,
8.41,
7.72,
7.87,
7.52,
"… 6 more"
]
},
{
"id": "riau",
"slug": "riau",
"name": "Riau",
"region": "Sumatera",
"peak_month": 1,
"complete_years": 17,
"share_pct": [
12.14,
10.82,
7.46,
6.21,
6.37,
5.59,
"… 6 more"
]
},
{
"id": "kepri",
"slug": "kepulauan-riau",
"name": "Kepulauan Riau",
"region": "Sumatera",
"peak_month": 1,
"complete_years": 17,
"share_pct": [
12.14,
9.27,
6.34,
5.44,
6.76,
7.77,
"… 6 more"
]
},
{
"id": "jambi",
"slug": "jambi",
"name": "Jambi",
"region": "Sumatera",
"peak_month": 1,
"complete_years": 17,
"share_pct": [
16.93,
11.98,
9.69,
6.37,
5.31,
4.58,
"… 6 more"
]
},
"… 27 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#seasonality",
"scope": "provinces",
"total": 33,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/seasonality?scope=provinces",
"next": null
}
}#Glossary
/v1/glossaryKey optionalList · CSVDefinitions of the terms used by SENTINARA, in English or Indonesian.
| Parameter | In | Type | Description |
|---|---|---|---|
category | query | string | Category id. |
q | query | string | Case-insensitive text search. |
lang | query | en | id default en | Language. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/glossary?q=cusum"const res = await fetch('https://api.sentinara.org/v1/glossary?q=cusum');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/glossary?q=cusum", timeout=30).json()["data"]Example response 200
{
"data": [
{
"id": "warning-level",
"category": "surveillance",
"term": "Warning level",
"definition": "SENTINARA39;s overall assessment for a place: Normal, Watch, Alert or Outbreak signal. It combines the endemic-channel zone, the outbreak score, CUSUM, the forecast threshold risk and momentum, and lists the reasons behind it.",
"abbreviation": null
},
{
"id": "cusum",
"category": "models",
"term": "CUSUM",
"definition": "Cumulative sum control chart. It adds up how far each month is above normal and raises an alarm (at 4 or more) when small excesses persist, catching slow, sustained rises that single-month tests miss.",
"abbreviation": null
}
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0",
"docs": "https://docs.sentinara.org/reference#glossary",
"categories": [
"disease",
"prevention",
"epidemiology",
"surveillance",
"models",
"data"
],
"lang": "en",
"total": 2,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/glossary?q=cusum",
"next": null
}
}#Dataset catalogue
/v1/datasetsKey optionalList · CSVEvery raw data file with its size, URL and SHA-256 checksum.
| Parameter | In | Type | Description |
|---|---|---|---|
q | query | string | Case-insensitive text search. |
Also accepts limit (1 to 500), cursor and format=csv. See Pagination.
curl "https://api.sentinara.org/v1/datasets?q=indonesia"const res = await fetch('https://api.sentinara.org/v1/datasets?q=indonesia');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/datasets?q=indonesia", timeout=30).json()["data"]Example response 200
{
"data": [
{
"file": "indonesia/climate.json",
"url": "https://sentinara.org/data/indonesia/climate.json",
"bytes": 81177,
"sha256": "df8fe9b7814e01413d63a429d9216bb7b1e642a19fa19cd3ba52671494ba79f7"
},
{
"file": "indonesia/national.json",
"url": "https://sentinara.org/data/indonesia/national.json",
"bytes": 15601,
"sha256": "f79a3cda53e0defa0618de1be1119d4d3af3e09d1d2c99b51532737f928f50a0"
},
{
"file": "indonesia/provinces-monthly.json",
"url": "https://sentinara.org/data/indonesia/provinces-monthly.json",
"bytes": 25767,
"sha256": "89ca4a19a2a62e09d22d51f5136ae3d7e1f8410fe278e6e333292f100702f46d"
},
{
"file": "indonesia/provinces.json",
"url": "https://sentinara.org/data/indonesia/provinces.json",
"bytes": 20064,
"sha256": "eb8ab4432c1079be9477e0db1719ee753b8a8b28a2d28197926e44c0273ccbf1"
},
{
"file": "indonesia/provinces/aceh.json",
"url": "https://sentinara.org/data/indonesia/provinces/aceh.json",
"bytes": 3124,
"sha256": "ae4bdde5663c76e19b569806e97cd8df51b66c7998f9ce6ad5d63859bcb589df"
},
{
"file": "indonesia/provinces/bali.json",
"url": "https://sentinara.org/data/indonesia/provinces/bali.json",
"bytes": 5071,
"sha256": "95663c104711d1c8aaebd6f471aa88804f1ef591e066f353cc4c27490a8c2132"
},
"… 31 more"
],
"meta": {
"request_id": "8d3f2c1a9b7e4f60",
"tier": "anonymous",
"data_updated_at": "2026-10-31T06:49:43.461Z",
"attribution": "SENTINARA (sentinara.org) analysis of WHO Global Dengue Surveillance, OpenDengue, Dinas Kesehatan Kota Semarang, World Bank and NASA POWER data",
"license": "CC BY 4.0 for SENTINARA analyses; original sources keep their own terms",
"docs": "https://docs.sentinara.org/reference#datasets",
"updated_at": "2026-10-31T06:49:43.461Z",
"total": 37,
"limit": 50,
"offset": 0
},
"links": {
"self": "https://api.sentinara.org/v1/datasets?q=indonesia",
"next": null
}
}#API keys
Create, inspect, rotate and revoke your own key.
#Create a key
/v1/keysNo key (Turnstile)Self-service creation, protected by Cloudflare Turnstile. Use the form at docs.sentinara.org/keys. The key is returned once.
curl -X POST https://api.sentinara.org/v1/keys \
-H "Content-Type: application/json" \
-d '{"type":"secret","name":"My app","email":"you@example.org","accept_terms":true,"turnstile_token":"<token from the form>"}'const res = await fetch('https://api.sentinara.org/v1/keys', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SENTINARA_KEY}` },
});import os, requests
r = requests.post("https://api.sentinara.org/v1/keys", headers={"Authorization": f"Bearer {os.environ['SENTINARA_KEY']}"}, timeout=30)Example response 201
{
"data": {
"id": "key_8f3a2c1d9b7e4f60",
"prefix": "sn_sk_Ab12Cd",
"type": "secret",
"name": "Dinkes dashboard",
"created_at": "2026-10-31T07:00:00.000Z",
"last_used_at": null,
"limits": {
"per_minute": 300,
"per_day": 10000
},
"key": "sn_sk_Ab12CdEf34GhIj56KlMn78OpQr90StUv12WxYz34"
},
"meta": {
"warning": "Store this key now. It is shown only once and cannot be recovered."
}
}#Inspect your key
/v1/keys/meAPI key requiredType, limits, last use and usage today. Publishable keys are public, so their allowed origins are not listed.
curl "https://api.sentinara.org/v1/keys/me"const res = await fetch('https://api.sentinara.org/v1/keys/me');
const { data } = await res.json();import requests
data = requests.get("https://api.sentinara.org/v1/keys/me", timeout=30).json()["data"]Example response 200
{
"data": {
"id": "key_8f3a2c1d9b7e4f60",
"prefix": "sn_sk_Ab12Cd",
"type": "secret",
"name": "Dinkes dashboard",
"created_at": "2026-10-31T07:00:00.000Z",
"last_used_at": "2026-10-31T08:12:44.000Z",
"limits": {
"per_minute": 300,
"per_day": 10000
},
"usage_today": 128,
"remaining_today": 9872
}
}#Rotate your key
/v1/keys/me/rotateAPI key requiredIssues a new key with the same settings and revokes the current one in a single transaction. Publishable keys also need their management token.
| Parameter | In | Type | Description |
|---|---|---|---|
X-Management-Token | header | string | Publishable keys only: the management token returned when the key was created. Send it from a server or terminal (requests with an Origin header are refused). |
curl -X POST https://api.sentinara.org/v1/keys/me/rotate -H "Authorization: Bearer $SENTINARA_KEY"const res = await fetch('https://api.sentinara.org/v1/keys/me/rotate', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.SENTINARA_KEY}` },
});import os, requests
r = requests.post("https://api.sentinara.org/v1/keys/me/rotate", headers={"Authorization": f"Bearer {os.environ['SENTINARA_KEY']}"}, timeout=30)Example response 201
{
"data": {
"id": "key_c41e09a7d2b35f18",
"prefix": "sn_sk_Zx98Yw",
"type": "secret",
"name": "Dinkes dashboard",
"created_at": "2026-10-31T07:00:00.000Z",
"last_used_at": null,
"limits": {
"per_minute": 300,
"per_day": 10000
},
"key": "sn_sk_Zx98YwVu76TsRq54PoNm32LkJi10HgFe98DcBa76"
},
"meta": {
"warning": "The previous key is revoked. Store this key now; it is shown only once.",
"replaces": "key_8f3a2c1d9b7e4f60"
}
}#Revoke your key
/v1/keys/meAPI key requiredPermanently disables the key used for this request. Publishable keys also need their management token.
| Parameter | In | Type | Description |
|---|---|---|---|
X-Management-Token | header | string | Publishable keys only: the management token returned when the key was created. Send it from a server or terminal (requests with an Origin header are refused). |
curl -X DELETE https://api.sentinara.org/v1/keys/me -H "Authorization: Bearer $SENTINARA_KEY"const res = await fetch('https://api.sentinara.org/v1/keys/me', {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.SENTINARA_KEY}` },
});import os, requests
r = requests.delete("https://api.sentinara.org/v1/keys/me", headers={"Authorization": f"Bearer {os.environ['SENTINARA_KEY']}"}, timeout=30)Example response 200
{
"data": {
"id": "key_8f3a2c1d9b7e4f60",
"revoked": true
}
}