Skip to content

Methodology

SourcesAbout

What each number is, where it came from, and what it does not claim.

In short

  • Prices are observed by Bank Indonesia (PIHPS) and shown as published, with their date and source.
  • Figures marked Derived are our arithmetic over those prices, versioned so they can be reproduced.
  • No index is calculated here. Official inflation is published by Badan Pusat Statistik; the BPS-based rates on the Economy page are credited to the BIS and the IMF, which calculated them.
  • A basket cost is quantity × price for a fixed list — not a Consumer Price Index.
  • Answers on Ask are written by a language model from figures we already computed; it never produces a number.

Rules we follow

What is implemented, and what is not

What is implemented, and what is notWhich methods compute the figures on this site, and why no index is one of them.

Five methods are implemented and in use: price change, price status, regional comparison, the Essential Price Pulse, and the coverage policy. Each is versioned, deterministic, and described below with the thresholds actually running.

No index is implemented. The five planned indices further down this page are published definitions with no formula, and the API returns an explicit “not implemented” for metric values rather than a zero or an empty series. The Essential Price Pulse is deliberately not one of them: it is a count of commodities in movement bands, with no basket weights and no base period.

Official statistics, and what they are not equivalent to

Official statistics, and what they are not equivalent toOur basket figures and the official CPI are related but not equivalent; subtracting one from the other measures nothing.

Consumer price indices, wage series, employment rates, and consumer confidence are published by Badan Pusat Statistik and Bank Indonesia. This platform does not produce or recompute them. Where it shows one, it restates it as published and credits the publisher (or the agency that calculated the figure, such as the BIS or the World Bank), and it does not compute any single score from them and its own figures.

Our basket estimator measures a defined basket of monitored commodities. The official CPI measures consumer inflation using BPS’s own basket, weights, scope, and methodology, over its own reference period, for the urban households it samples. The two are related and are not equivalent. Subtracting one from the other does not produce a measure of anything — not “excess inflation”, not “real” inflation, and not a correction to the official figure.

Reference period, release date, and two kinds of age

Reference period, release date, and two kinds of ageAn official figure describes a period and is published later, so it is never attributed to a day or repeated across days.

An official figure describes a reference period, and is published on a later release date. July’s CPI released on 3 August is a statement about July; presenting it as an August measurement would be wrong by a month and would look entirely plausible.

So a macro value is never attributed to a day. It is shown as the latest official reference period at or before the date in question, with two ages reported separately: how old the measured period is, and how long since the publisher released it. The first says the statistic is old; the second says our copy is. Those are different problems.

Nothing is forward-filled. A monthly figure is not repeated across each day of the following month to give a daily chart a value — that would show a monthly statistic as if it had been measured daily. And a figure is never shown before its release date, even for a period that has ended: on 31 July, July’s CPI does not yet exist.

National is not provincial

National is not provincialA national figure shown beside a province is labelled national context.

Our prices cover 34 provinces. Official series may be national only, provincial, or per city. Where a series is published nationally and the view is provincial, the figure is labelled national context and the province name never appears beside it.

City-level series are not rolled up. Combining city indices into a provincial one needs the publisher’s population or expenditure weights, and an unweighted average of cities is not a provincial figure — it would be indistinguishable from one in the output, which is exactly why it is refused.

Comparability is stated, not assumed

Comparability is stated, not assumedEvery pairing with an official series is classed comparable, partially comparable, context only, or not comparable.

Every pairing of one of our figures with an official series is classified comparable, partially comparable, context only, or not comparable, with the reasons listed: different periods, geography, basket, population, frequency, units, seasonal adjustment, nominal against real, or different concept.

A 30-day basket change for one province against national year-on-year inflation differs in five of those at once. Any one would make the subtraction questionable; together they make it meaningless, and the meaninglessness is invisible in the arithmetic because both inputs are percentages.

Consumer confidence is not comparable rather than merely context: a diffusion index around 100 is not a quantity of money or goods, so there is no sense in which it could be arithmetically related to a cost.

Wage series describe who they describe

Wage series describe who they describeAn employee wage is not household income, and the minimum wage is a policy floor rather than earnings.

“Average net wage of employees” covers people in paid employment. It excludes the self-employed, informal workers, and everyone not working — so it is not average household income and not average income of all residents.

The provincial minimum wage (UMP) is a policy floor set by regulation, not a measurement of earnings. It is registered here so it can be read for what it is, and it is never used as a proxy for income.

When a publisher restates a figure

When a publisher restates a figureRevisions are appended and the original stays retrievable.

Official data is revised. A restatement appends a new revision and marks the previous one superseded; the original stays retrievable, because what was published and when is a fact about the record even after it stops being the current value.

Three causes are kept apart: the publisher restated its figure, we re-imported or reparsed, and the publisher changed its methodology. Merging them would either blame a publisher for our reparse or credit our reparse with their correction.

The basket estimator is not a Consumer Price Index

The basket estimator is not a Consumer Price IndexQuantity × observed price over a declared list, with no weights and no base period.

The Cost Basket page sums quantity × observed price over a declared list of commodities. That is the whole model. It has no expenditure weights, no base period, and no claim to represent any household — all three of which a price index has and this deliberately does not. Indonesia’s official Consumer Price Index is published by Badan Pusat Statistik; official inflation is shown separately, on the Economy page, and is never calculated from the basket.

No weights are declared anywhere. An item’s influence is its quantity times its price, so five kilograms of rice matters more than half a kilogram of garlic without anyone deciding that it should. Basket definitions are frozen by version: changing a quantity, a commodity, a unit, or the market layer creates a new version rather than editing the old one, because a cost history is only meaningful if the basket it was computed against still means what it meant.

It also says nothing about affordability. Whether a cost is manageable depends on income, and the basket calculation uses no income or wage data — so a cheaper basket does not mean a better standard of living, and a regional cost ranking is not a ranking of hardship.

Two different questions about an incomplete basket

Two different questions about an incomplete basketWhether a basket moved and whether its total can be compared are judged separately.

A basket missing an item still produces a number, and the number looks cheaper rather than incomplete. So completeness is reported two ways, and they gate different things.

Has it moved? Governed by item count. A province where the source has never published chilli has a stable set of the remaining items, and the change over that stable set is a real measurement.

Can this total be compared? Stricter: only a complete basket. A seven-item sum and an eight-item sum are different quantities of goods however stable each is over time, so a province missing an item is left out of the regional ranking and out of the monitored-province median rather than appearing cheap.

A missing item is never priced at zero, and no date is ever priced from data published after it.

Why cooking oil is measured in litres

Why cooking oil is measured in litresBank Indonesia’s PIHPS FAQ says the cooking-oil figure is per litre, and nothing converts it to kilograms.

Bank Indonesia’s PIHPS FAQ says cooking oil is reported per litre. The PIHPS API labels every commodity kg, oil included; the FAQ is the publisher’s stated method, so oil prices and baskets use litres. The stored figures are unchanged.

Converting would need a density for this specific product in this specific packaging. Palm oil is roughly 0.9 kg per litre, which is a real number from a physics reference and still an assumption about what is in the bottle. A basket item requesting kilograms of cooking oil is therefore excluded and reported, not multiplied by 0.9. Grams convert freely, because a kilogram is a thousand grams for every product.

How a published figure changes, and when it does not

How a published figure changes, and when it does notCorrections append a revision, recomputing unchanged data writes nothing, and a new method gets a new version.

Derived figures now have a stored history, so a number published for a past date can be asked about later. Three events are kept distinct: an upstream price correction appends a new revision and keeps the old one retrievable (a price the source restates is replaced by its current figure, and the old figure is archived); a recomputation over unchanged data writes nothing at all; and a methodology version change creates its own rows and never touches the previous version’s.

A stored figure is reproducible from its methodology version and its recorded input fingerprint. If identical inputs ever produce a different value, that is reported as a defect rather than recorded as an update.

A price spread is not a profit margin

A price spread is not a profit marginThe gap between two layers also holds transport, storage and handling, and it shows no reliable lead or lag.

The platform measures the difference between what one layer of the supply chain quotes and what the next quotes, and calls it a price spread. A spread also contains transport, storage, spoilage, handling, financing, taxes, grade differences the source does not disclose, and the fact that Bank Indonesia may sample producers and retailers in different parts of the same province. None of that is separable from price data, so nothing here describes anyone’s margin or pricing decisions.

Observed lead or lag is not proof of causality. A signal saying retail rose while producer prices did not says what the prices did, not why. And on the 23 published dates currently held, no lead or lag relationship is detectable at all: correlations between upstream and downstream price movements sit within 0.02 of zero at every lag tested, which is indistinguishable from chance at this sample size. The platform therefore reports spreads, which are well measured, and does not claim to know whether one layer leads another.

Official inflation is shown as context, never computed

Official inflation is shown as context, never computedBPS-based inflation rates calculated by the BIS and the IMF appear on the Economy page; nothing computed here measures inflation.

Indonesian inflation is published by Badan Pusat Statistik. This platform has no direct BPS connection: the inflation rates on the Economy page are calculated from BPS’s consumer price index by the BIS (the monthly year-on-year change) and by the IMF (the annual average, as published by the World Bank). They are shown beside this site’s own figures as context. Nothing this site calculates from market prices is a measure of inflation, and no derived figure should be read as one. Every derived number is labelled DERIVED and carries the method that produced it.

Methods in use

Read from the running configuration, so this cannot describe a threshold the engine is not using.

Price change over a window

Price change over a windowCompares the latest observation against the most recent one at or before the target date, within a three-day tolerance, and discloses the date actually used.

DERIVEDprice_change_v1

Compares the latest observation against the most recent one at or before the target date, within a three-day tolerance, and discloses the date actually used.

Why it works this way

The source publishes on working days, so "the price exactly 7 days ago" usually does not exist. The baseline is the most recent observation at or before the target date, and the response says which date it used.

What it refuses to claim

It will not select an observation later than the target date. That would produce a window shorter than its label and overstate the rate of change. It will not substitute a baseline when none falls inside the tolerance — the answer is then no comparison, never zero.

Parameters in force
Baseline tolerance (days)
3
Baseline selection
most recent at or before target

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Price status

Price statusClassifies a series as NORMAL, WATCH, PRESSURE, or SPIKE from its 7- and 30-day change, its deviation from its own 30-day median, and that deviation relative to the series’ own volatility.

DERIVEDprice_status_v1

Classifies a series as NORMAL, WATCH, PRESSURE, or SPIKE from its 7- and 30-day change, its deviation from its own 30-day median, and that deviation relative to the series’ own volatility.

Why it works this way

Four signals rather than one threshold, because a 30-day rule both misses sharp reversals inside the month and keeps reporting pressure after it has unwound. The deviation is scaled by each series’ own volatility, so a 10% move in chillies and a 10% move in rice are not treated as the same event.

What it refuses to claim

It is not a forecast and not an anomaly detector. It makes no movement claim at all below eight observations in the window, and staleness pre-empts every threshold — a two-week-old price is reported as stale whatever it has done.

Parameters in force
Minimum observations in window
8
Window (days)
30
Volatility floor
2.0%
Spike — 30-day change
25%
Spike — 7-day change
10%
Spike — deviation score
3
Pressure — 30-day change
10%
Pressure — above own median
3.0%
Watch — 30-day change
5.0%
Watch — 7-day change
5.0%
Watch — deviation score
2
Stale after (days)
7

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Regional comparison

Regional comparisonPositions one province against the median of provinces the source covers, with absolute and percentage deviation, percentile, and rank.

DERIVEDregional_comparison_v1

Positions one province against the median of provinces the source covers, with absolute and percentage deviation, percentile, and rank.

Why it works this way

A province is positioned against the median of provinces the source covers. Median rather than mean: one extreme province should not redefine what a typical province pays, and for an odd count the median is itself an observed price that can be checked upstream.

What it refuses to claim

The comparison basis is never described as national. Four provinces have no coverage from any source, and individual commodities are priced in as few as 27 of the 34 the source does report. A missing province is absent from the calculation, never entered as zero.

Parameters in force
Comparison basis
cross province median
Minimum provinces
5
Percentile convention
fraction at or below inclusive

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Essential Price Pulse

Essential Price PulseCounts how many monitored staples are falling, stable, rising, under pressure, or spiking, plus the median commodity change.

DERIVEDessential_price_pulse_v1

Counts how many monitored staples are falling, stable, rising, under pressure, or spiking, plus the median commodity change. Descriptive: no basket weights, no base period, not inflation.

Why it works this way

A count of how many monitored staples sit in each movement band, plus the median commodity change. Concentration is checked before magnitude, because a spike in a quarter of provinces is a real regional event that a cross-province median averages away.

What it refuses to claim

It is not an index and not inflation. There are no basket weights, no base period, and no scalar summary anywhere — a single "pulse level" would be read as an index within a week, and it would be one with none of the methodological decisions an index requires.

Parameters in force
Concentration threshold
25%
Stable band (±)
1.0%

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Coverage policy

Coverage policyStates every coverage figure against a named denominator, and records the four provinces no connected source covers.

DERIVEDcoverage_policy_v1

States every coverage figure against a named denominator, and records the four provinces no connected source covers.

Why it works this way

Every coverage figure states the denominator it is a fraction of, in the same object. Counts are reported per commodity because the denominator genuinely differs between them.

What it refuses to claim

It never presents provincial coverage as national coverage, and it never imputes the four uncovered provinces. Apportioning a pre-2022 Papua figure across its successor provinces would invent four numbers nobody measured.

Parameters in force
Provinces in Indonesia
38
Provinces the source reports
34
Stale after (days)
7

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Price status, history-relative

Price status, history-relativeClassifies a series by whether its 30-day change is both unusual for that series’ own history and large enough in absolute terms to matter.

DERIVEDprice_status_v2

Classifies a series by whether its 30-day change is both unusual for that series’ own history and large enough in absolute terms to matter. Corrects a measured 10× imbalance in v1 between volatile and stable commodities. Selectable; v1 remains the default until more series have enough own history.

Why it works this way

The same question as v1, asked relative to each series’ own history. Measured over 88 published dates, v1 flags volatile fresh produce on 37.5% of evaluations and stable staples on 3.7% — a 10× imbalance, so the same badge carries different information depending on which commodity it sits beside. v2 requires a change to be both unusual for that series and large enough in absolute terms, which brings the imbalance to 2.4×.

What it refuses to claim

Both conditions are required. A percentile test alone equalises the rate almost perfectly and would label a 0.3% rice move a spike, because 0.3% genuinely is unusual for rice. It also refuses to classify a series with fewer than 20 past 30-day changes — currently 29% of them — which is why v1 remains the default until more history exists.

Parameters in force
Minimum own-history changes
20
Spike — own percentile
95%
Pressure — own percentile
85%
Watch — own percentile
70%
Spike — magnitude floor
5.0%
Pressure — magnitude floor
3.0%
Watch — magnitude floor
1.5%

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Basket cost estimator

Basket cost estimatorSums quantity × observed unit price over a fixed list of commodities, pricing each item from the most recent observation at or before the date within a three-day tolerance.

DERIVEDbasket_cost_estimator_v1

Sums quantity × observed unit price over a fixed list of commodities, pricing each item from the most recent observation at or before the date within a three-day tolerance. No weights are declared: an item’s weight is its quantity times its price. Not a Consumer Price Index — no expenditure weights, no base period, and no claim to represent a population.

Why it works this way

A single commodity moving tells a reader little about what a shop costs. Summing quantity × observed price over a declared list turns many prices into one amount a person can recognise — and does it without weights, a base period, or any claim to represent a population, all of which a price index needs and this deliberately does not have.

What it refuses to claim

It refuses to treat a missing item as free, refuses to compare a basket against a differently-composed one, and refuses to price any date from data published after it. Each refusal is reported with the item and the reason rather than absorbed into a smaller total that would read as a cheaper shop.

Parameters in force
Price carry-forward tolerance (days)
3
Maximum items in a custom basket
24
Maximum quantity per item
1000

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Unit normalisation

Unit normalisationRecords, per commodity, the unit the source quotes in and whether a requested unit can be converted to it.

DERIVEDunit_normalization_v1

Records, per commodity, the unit the source quotes in and whether a requested unit can be converted to it. Only conversions that are pure unit arithmetic are permitted; anything needing a product assumption, such as kilograms of cooking oil (published per litre) to litres, is refused and the item is excluded and reported rather than converted.

Why it works this way

A basket is a sum of quantity × price, so a quantity in litres multiplied by a price per kilogram is wrong by roughly a tenth and looks entirely plausible. Every commodity therefore carries its source unit, its canonical unit, and whether a requested unit can be converted at all.

What it refuses to claim

Only conversions that are pure unit arithmetic are allowed — a kilogram is a thousand grams for rice and for chilli alike. Mass to volume needs a density, which depends on the product, so a kilogram of cooking oil is refused rather than multiplied by 0.9. Bank Indonesia’s PIHPS FAQ states all three cooking oils are reported per litre, although its API labels them kg, so oil is priced per litre and only litres or millilitres can be requested.

Depends on: BI_PIHPS

Basket coverage policy

Basket coverage policyReports basket completeness by item count and, where a reference cost exists, by share of expected value.

DERIVEDbasket_coverage_v1

Reports basket completeness by item count and, where a reference cost exists, by share of expected value. A headline change is withheld unless both clear their floors, because dropping one expensive item from a six-item basket is 83% item coverage and can be under half the money.

Why it works this way

Counting items hides the case that matters. Dropping one expensive item from a six-item basket leaves 83% of the items and can be under half the money, so completeness is reported by item count and, where a reference exists, by share of expected value.

What it refuses to claim

It separates two questions that look like one. Whether a basket has *moved* is governed by item count — a province that has never priced chilli has a stable seven-item set whose change is real. Whether its *total* can be set beside another province’s is stricter: a seven-item sum and an eight-item sum are different quantities of goods however stable each is, so that province is left out of the ranking and the median.

Parameters in force
Item coverage floor for a movement
75%
Value coverage floor for a movement
90%
High coverage — item ratio
90%
Partial coverage — item ratio
75%

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Essential Cost Pressure

Essential Cost PressureClassifies basket cost movement as easing, stable, rising, under pressure, or under high pressure, from bands calibrated on the basket’s own measured distribution.

DERIVEDessential_cost_pressure_v1

Classifies basket cost movement as easing, stable, rising, under pressure, or under high pressure, from bands calibrated on the basket’s own measured distribution. A basket is a portfolio and moves far less than its ingredients — its median 30-day move is 2.75% against 20% for its most volatile item — so the price-status thresholds could not be reused.

Why it works this way

A basket is a portfolio and moves far less than its holdings. Measured over 2,244 comparable 30-day windows, the Essential Basic basket’s median absolute move is 2.75% while its most volatile ingredient moves 20% — so the price-status thresholds would fire on under one observation in a hundred and separate nothing. The bands are read off the basket’s own distribution instead.

What it refuses to claim

The easing threshold mirrors the pressure threshold rather than sitting at a low percentile: an earlier draft put it near the 30th, which labelled 28% of ordinary weeks as easing. The 90-day bands are *tighter* than the 30-day ones, because food prices oscillate and a longer window nets more of the oscillation out — widening them with the window would have made every quarter stable.

Parameters in force
7-day — easing at or below
-0.02
7-day — rising at or above
1.0%
7-day — pressure at or above
2.0%
7-day — high pressure at or above
3.0%
30-day — easing at or below
-0.04
30-day — rising at or above
2.0%
30-day — pressure at or above
4.0%
30-day — high pressure at or above
6.0%
90-day — easing at or below
-0.03
90-day — rising at or above
1.5%
90-day — pressure at or above
3.0%
90-day — high pressure at or above
4.5%

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Series comparability

Series comparabilityDecides whether two market-layer series may be subtracted at all, and returns a reason code when they may not, rather than producing a spread that happens to subtract cleanly.

DERIVEDseries_comparability_v1

Decides whether two market-layer series may be subtracted at all, and returns a reason code when they may not, rather than producing a spread that happens to subtract cleanly.

Why it works this way

A spread is only meaningful when both sides measure the same commodity, in the same place, at the same time, in the same unit. Subtracting two numbers is trivial; establishing that the result means anything is not, so the gate is explicit and returns a reason code rather than a figure.

What it refuses to claim

It refuses to compare two retail channels as a supply-chain step — traditional and modern retail are parallel, and modern retail is cheaper in 27.9% of measured pairs. It refuses a pair with fewer than eight shared published dates. Producer prices exist for as few as 2 of 34 provinces on some commodities, and roughly 44% of producer-side pairs are refused on coverage alone.

Parameters in force
Minimum shared published dates
—
Usable layer coverage share
—
Must be a chain step
—
Must be the same commodity
—
Must be the same unit
—

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Date alignment

Date alignmentPairs observations from two series on the newest shared published date, falling back to an upstream observation at most two days earlier — never later — and discloses whether the match was exact.

DERIVEDseries_alignment_v1

Pairs observations from two series on the newest shared published date, falling back to an upstream observation at most two days earlier — never later — and discloses whether the match was exact.

Why it works this way

Two layers are paired on the newest date both published. Where no shared date exists, the upstream observation may be at most two days earlier — a tighter tolerance than the three days used for change comparisons, because a spread pairs two different measurements rather than filling a gap in one series.

What it refuses to claim

The upstream observation is never later than the downstream one. Pairing a retail price with a producer price recorded after it would compute a spread against a cost not yet incurred and absorb any movement in between. Every spread reports whether the pairing was exact.

Parameters in force
Preferred pairing
—
Maximum days apart
—
Direction
—

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Price transmission

Price transmissionMeasures the price spread between two layers of the supply chain and how it is changing, and classifies the pattern from each layer’s own movement.

DERIVEDprice_transmission_v1

Measures the price spread between two layers of the supply chain and how it is changing, and classifies the pattern from each layer’s own movement. A spread, never a margin, and descriptive rather than causal.

Why it works this way

The spread between two layers, and how it is changing. Signals classify on each layer’s own 30-day movement rather than on the spread ratio, because a ratio of ratios is noisy — its own 30-day change runs from 1.9 percentage points at the median to 73 at the 90th percentile for producer pairs.

What it refuses to claim

It is a price spread, never a profit margin. A spread contains transport, storage, spoilage, handling, financing, undisclosed grade differences, and the fact that the source may sample each layer in different parts of the same province — none of which is separable from price data. Signals are descriptive: a widening spread says the gap grew, not why. A negative spread is reported as negative, which happens in 22.7% of producer-to-wholesale pairs.

Parameters in force
Percentage denominator
—
Material layer movement
—
Material spread change
—

Read from the running configuration, not restated here.

Depends on: BI_PIHPS

Staple volatility ranking

Staple volatility rankingRanks staples by how far their daily prices typically sat from their own 30-day median (median absolute deviation over the median), per province and as the median across provinces.

DERIVEDstaple_volatility_ranking_v1

Ranks staples by how far their daily prices typically sat from their own 30-day median (median absolute deviation over the median), per province and as the median across provinces. Only current series with enough days in the window are ranked, and the province count is stated.

Depends on: BI_PIHPS

Basket cost as a share of the average employee wage

Basket cost as a share of the average employee wageOne Essential Basic list (8 staples in fixed quantities) at a province’s traditional-market prices on one date, divided by the latest released BPS average monthly net wage of employees in the same province.

DERIVEDbasket_to_wage_ratio_v2

One Essential Basic list (8 staples in fixed quantities) at a province’s traditional-market prices on one date, divided by the latest released BPS average monthly net wage of employees in the same province. Employees only, not household income; not a month of living costs; both dates and the gap stated. Enabled by the owner decision of 2026-10-11.

Depends on: BI_PIHPS, BPS

Kinds of number

The four kinds of number

The four kinds of numberOfficial, observed, derived or estimated — assigned by the system from the source, not by whoever built the page.

Official statistics

Official statistic

Published by an official statistical authority and restated here without modification.

We restate and attribute. We never recompute, adjust, or reweight an official figure, and we never present our own work as one.

Observed prices

Observed price

A price recorded from a source exactly as published, with no adjustment.

We record the price, its source, its observation date, and the raw payload — so any figure can be traced to the exact record it came from.

Derived metrics

Derived metric

Calculated by Indonesia Price Intelligence from stored observations using a documented, versioned formula. Not an official statistic.

We publish the formula, version it, and retain enough of the inputs that anyone with the stored data can reproduce the result.

Estimated metrics

Estimated metric

Depends on modelling or assumptions in addition to observed data. Directional, not authoritative.

We state the assumptions alongside the figure, and we label it as an estimate every time it appears.

A fifth kind, used only during development

Demo data

Illustrative placeholder used to develop the interface. Not real data. Never cite it.

Demonstration figures pass through the same provenance pipeline as real ones and are attributed to an openly synthetic source, so they arrive at the interface already labelled. There is no code path that renders one as an observed price.

Official statistics

Official statisticsRestated and attributed, never recomputed or adjusted.

Official inflation for Indonesia is published by Badan Pusat Statistik. When this platform shows an official figure, it restates it as its publisher or republisher published it and attributes it to both — where the BIS or the World Bank calculated the figure from BPS data, the credit says so. We do not recompute it, adjust it, reweight it, or “correct” it.

Where our own observations disagree with an official series, that difference is reported as a difference — with both figures, both methodologies, and both dates shown. A discrepancy between a national survey and a set of market observations usually reflects what each is measuring, not an error in either.

No index calculated by this platform is official inflation, and none will ever be presented as such.

Official headline consumer price index (BPS)

Official headline consumer price index (BPS)Metric not implemented. No values are published for this metric.

Official headline consumer price index (BPS)

BPS_CPI_HEADLINE · v1.0.0

Official statisticNot implemented

The Consumer Price Index published by Badan Pusat Statistik. Restated here for comparison; never recomputed by us.

Methodology

Compiled and published by Badan Pusat Statistik according to their published national CPI methodology. Indonesia Price Intelligence does not modify, recompute, or adjust these figures; it stores and attributes them. Where our own observations disagree with this series, the official series remains the official figure and the difference is reported as a difference, not a correction.

Unit
index
Depends on
BPS

Official statistic published by Badan Pusat Statistik and attributed to them.

Observed prices

Observed pricesA price we recorded, exactly as published.

An observation records the price, the item, the location, the source, the instant it was true, the instant we retrieved it, and the raw upstream payload. The unit as published is kept verbatim alongside a normalised price per canonical unit, so that a 5 kg sack and a per-kilogram quote can be compared without either being altered.

Where a source’s unit cannot be resolved confidently, the normalised price is left empty rather than guessed. An incorrect normalisation would silently corrupt every comparison downstream of it, and a missing value is recoverable in a way that a wrong one is not.

Prices are stored and transmitted as exact decimals. No monetary amount is ever represented as a floating-point number anywhere in this system.

Derived metrics

Derived metricsOur arithmetic over stored observations, versioned and reproducible.

A derived metric is computed from observations by a documented formula carrying a version number. Every published value references the version that produced it, so a figure published today remains explainable after the formula is revised — the old version is retained rather than overwritten.

Derived metrics are our own work. They are labelled as such wherever they appear and are never described as official.

Affordability change

Affordability changeMetric not implemented. No values are published for this metric.

Affordability change

AFFORDABILITY_CHANGE · v0.1.0

Derived metricNot implemented

The change in a basket-to-wage ratio between two reference periods, for one basket version and one wage series.

Methodology

Compares two basket-to-wage ratios rather than subtracting basket growth from wage growth: the subtraction is a different quantity and diverges from the change in the ratio as the changes get larger. Requires the same basket version, the same wage series, the same population definition, and the same geography at both ends; a basket version change is a refusal rather than an adjustment, because it would report a definitional change as affordability. Not a welfare finding: the ratio moving says nothing about what else changed.

Unit
percent change in ratio
Depends on
BPSBI_PIHPS

This is a metric calculated by Indonesia Price Intelligence. It is not an official statistic and is not a substitute for inflation figures published by Badan Pusat Statistik.

Methodology under development. No values are published for this metric.

Basket-to-wage ratio

Basket-to-wage ratioMetric not implemented. No values are published for this metric.

Basket-to-wage ratio

BASKET_TO_WAGE_RATIO · v0.1.0

Derived metricNot implemented

The observed basket cost as a share of a named wage benchmark, over that benchmark’s own reference period.

Methodology

Defined by affordability_comparability_v1 and gated by affordability_execution_gate_v1. Requires a validated employee-wage observation, a basket aggregated over exactly the wage’s reference period, the same geography on both sides, and a resolved authorization for both publishers. A statutory minimum wage is not an admissible denominator: it measures a legal floor rather than earnings, and belongs to a separate Minimum-Wage Benchmark methodology. Zero wage observations are held, so nothing is computed.

Unit
ratio
Depends on
BPSBI_PIHPS

This is a metric calculated by Indonesia Price Intelligence. It is not an official statistic and is not a substitute for inflation figures published by Badan Pusat Statistik.

Methodology under development. No values are published for this metric.

Essential Price Index

Essential Price IndexMetric not implemented — methodology under development. No values are published for this metric.

Essential Price Index

ESSENTIAL_PRICE_INDEX · v0.1.0

Derived metricMethodology under development

A price index over a defined basket of essential goods, computed from observed prices rather than survey data.

Methodology

Intended as a weighted index over tracked entities flagged as essential, computed from normalised unit prices. Open questions that must be resolved before any value is published: the basket definition and its review process; the weighting scheme and its source; the base period; how missing observations are handled without interpolating prices that were never observed; and how a revision to an input observation propagates to already-published values.

Unit
index (base period to be defined)
Depends on
BI_PIHPSBAPANAS

This is a metric calculated by Indonesia Price Intelligence. It is not an official statistic and is not a substitute for inflation figures published by Badan Pusat Statistik.

Methodology under development. No values are published for this metric.

Essential Price Pulse

Essential Price PulseDerived metric · implemented.

Essential Price Pulse

essential_price_pulse · vv1

Derived metricImplemented

How many monitored staples are falling, stable, rising, under pressure, or spiking on a given observation date. A count of commodities in movement bands, persisted so its composition over time can be read.

Methodology

Each commodity is placed in one band from its cross-province median 30-day change and the share of its covered provinces under pressure or spiking. Concentration is checked before magnitude. No basket weights, no base period, and deliberately no scalar summary.

Unit
Not defined
Depends on
BI_PIHPS

Derived from observed prices by this platform. Not an official statistic.

Not a measure of inflation, and not an index: it has no basket weights and no base period.

Coverage varies by commodity and by date. A band count is a count of what could be measured.

Commodity price status

Commodity price statusDerived metric · implemented.

Commodity price status

price_status · vv1

Derived metricImplemented

Whether a commodity-province series is NORMAL, WATCH, PRESSURE, or SPIKE on a given observation date. Persisted so a status history — when a commodity entered each state — can be read without re-evaluating every past date.

Methodology

Four signals: 7- and 30-day change, deviation from the series own 30-day median, and that deviation scaled by the series own volatility with a floor. Freshness gates pre-empt every threshold. Thresholds are recorded in the analytics policy and served at /v1/intelligence/methodologies.

Unit
Not defined
Depends on
BI_PIHPS

Derived from observed prices by this platform. Not an official statistic.

A reading aid computed from observed movement, not a forecast and not an anomaly detector.

Price transmission summary

Price transmission summaryDerived metric · implemented.

Price transmission summary

price_transmission · vv1

Derived metricImplemented

Signal counts and the median price spread for one supply-chain step across every commodity and province, on a given observation date. Persisted so whether spreads are widening over months can be read.

Methodology

Layers are gated by series_comparability_v1, paired by series_alignment_v1, and the spread is (downstream − upstream) / upstream. Signals classify on each layer own 30-day change rather than on the spread ratio.

Unit
ratio
Depends on
BI_PIHPS

Derived from observed prices by this platform. Not an official statistic.

A price spread is not a profit margin. It also contains transport, storage, spoilage, handling, financing, and grade differences the source does not disclose.

Descriptive only. A widening spread says the gap grew, not why, and no lead or lag between layers is detectable on the history held.

Estimated metrics

Estimated metricsFigures that would depend on assumptions as well as observations.

Some questions cannot be answered from prices alone. Purchasing power and affordability need an income reference, and income data is published far less often than prices — so any current-period figure depends on assumptions about the gap between publications.

Those figures are classified as estimates, not measurements, and each one states its assumptions where it appears. This distinction is the difference between a directional indicator and a number someone could reasonably plan around.

Work-time equivalent

Work-time equivalentMetric not implemented. No values are published for this metric.

Work-time equivalent

WORK_TIME_EQUIVALENT · v0.1.0

Estimated metricNot implemented

The observed basket cost expressed in hours at a named wage benchmark, under a named and cited working-hours convention.

Methodology

The basket-to-wage ratio expressed in hours. ESTIMATED rather than DERIVED because an hours-per-month convention is a choice rather than a measurement, whoever makes it: 160 and 173.33 differ by 8% and move a twelve-hour answer by an hour. No convention is hardcoded and none is currently usable — the statutory basis has not been read by anyone on this project, and the preferred alternative is the wage survey’s own reported hours, which needs the wage dataset first. The convention is named beside every figure derived with it.

Unit
hours
Depends on
BPSBI_PIHPS

This is a metric calculated by Indonesia Price Intelligence. It is not an official statistic and is not a substitute for inflation figures published by Badan Pusat Statistik.

Methodology under development. No values are published for this metric.

Freshness, confidence, revisions

Data freshness

Data freshnessJudged against each source's own publishing schedule, and recomputed on every request.

Freshness is relative. A monthly release from three weeks ago is perfectly current; a daily price from three weeks ago is not. So freshness is measured against each source’s declared publication cadence rather than a fixed threshold, and where a source declares no cadence, we say that the judgement rests on a default rather than on the publisher’s own schedule.

Age is measured from when the price was true, not from when we fetched it. A figure retrieved a minute ago describing last month’s market is not fresh information.

Nothing about freshness is stored. It is recomputed on every request, because a stored verdict becomes wrong through the passage of time alone.

Live
Updated within the last few minutes.
Fresh
Within the publication cycle promised by the source.
Aging
Older than one publication cycle. Interpret with care.
Stale
Overdue relative to the source cadence. Treat as historical.
Unavailable
No observation has been recorded for this series.

Confidence

ConfidenceA combined figure is only as trustworthy as its weakest input.

Confidence is scored from 0 to 1 and presented in bands. The intended inputs are the reliability of the source, whether the figure is corroborated by another source, the age of the observation, and how certain the unit normalisation was.

The scoring model is not implemented. Until it is, confidence reflects a per-source baseline recorded in the registry, and the interface says which of the two a score came from rather than presenting an unexplained number.

When figures are combined, the result takes the lowest confidence and the weakest freshness of its inputs. An aggregate is exactly as trustworthy as its worst component, and rounding that up would be the most convenient possible lie.

Revision policy

Revision policyA revised figure is a new record; the original stays.

Upstream figures get revised. Our commitments when that happens:

  • A revised observation is stored as a new record, not an edit. The original is retained with the ingestion run that produced it.
  • A derived value recomputed from revised inputs is republished with a new computation timestamp, and the value it replaced remains queryable.
  • A change in methodology requires a new metric version. Values published under the previous version keep pointing at the text that produced them.
  • Where a revision materially changes a published figure, the change is disclosed rather than applied silently.

These are design commitments the schema supports today: observations are append-only, metric definitions are versioned, and every computed value records the fingerprint of its inputs. The machinery that acts on them arrives with the first connector.

Baskets

How a basket cost is computed

How a basket cost is computedQuantity × observed price for the list you chose. It is a model you selected, not a record of what you bought.

A basket is a model you selected, not a record of what you bought. The cost is the sum of each quantity you chose multiplied by the observed price of that commodity, in the province and market layer you chose. That is all it is — and it is a genuinely useful measuring stick precisely because it is that simple.

What it is not: your inflation, your household inflation, your cost of living, or a measure of what is within your reach. We know the list you built. We do not know whether you bought any of it, how often, where you shop, or what else you spend money on. Each of those labels would be a claim about a household's whole weighted expenditure, and this platform has no data for one.

The same methodology

A personal basket uses basket_cost_estimator_v1 and basket_contribution_v1 — the same versioned methodologies as the predefined basket, reached through the same code. There is no separate personal estimator, because the arithmetic is identical and a second implementation would be a second thing to keep in step.

Comparing like with like

A cost change compares the same composition: same items, same quantities, same units, same province, same market layer. Change any of those and it is a different measurement — so editing a basket starts a new version, and a history never splices two compositions into one line. Comparing a 10 kg-rice basket against last month's 5 kg one would report an increase that was entirely your edit.

Missing items

An item with no observed price is not counted as zero. It is left out and reported, and the total is the cost of what could be priced. Where coverage falls below what a headline needs, the change is withheld rather than shown against a shrunken basket.

Units

Quantities are entered in the unit the source publishes: litres for cooking oil, kilograms for everything else. Nothing converts between the two: that would need a density figure for that specific oil and packaging, which this platform does not have, so the result would rest on an assumption nobody measured.

Where it is stored

On your device, in your browser. There is no login, no account, and no basket table on any server — the definition is sent when a cost is calculated and is not retained. No income data is collected, and none is needed.

AI answers

How AI analysis works

How AI analysis worksA language model writes sentences about figures this site already computed. It is never the source of a number.

A language model is never the source of a number. Every figure in an AI answer was computed by this platform, under a named and versioned methodology, from stored observations. The model writes sentences about figures that already exist. It creates no observation, and it performs no arithmetic.

Evidence retrieval

A question is first classified into one of a closed set of supported intents, and the commodity, province and period are resolved to canonical identifiers by lookup — not by the model, which would produce a plausible code that does not exist. The platform then runs its own analytics and assembles an evidence pack: a fixed list of typed facts, each with its own value, period, geography, source, methodology and coverage.

The model receives the pack and nothing else. It has no database connection, no tools, no web access, and no way to ask for more. So the guarantee that an answer cannot exceed the evidence is a property of what the model was handed, not a hope about its behaviour.

Grounding

Every number an answer is allowed to quote is pre-formatted in the pack. After generation, a validator checks the answer against it: each cited evidence id must exist, each percentage and money amount must appear in some item’s permitted values, and any figure that does not is treated as invented. An answer that fails is sent back once with the reasons; if it fails again it is discarded and the deterministic evidence is shown on its own. Nothing ungrounded is displayed because something is better than nothing.

Causality limits

This dataset contains prices. It contains no weather, production, logistics, margin or policy data, so it cannot establish why a price moved. What it can show is how widely a movement spread, whether it appears at producer and wholesale layers, in what order, and which commodities account for a basket change.

So a “why” question gets both halves: what the data shows, and then plainly what it cannot establish. That is a complete answer, not a hedge. An answer that asserted a cause — weather, harvest, distribution, trader behaviour, policy — is rejected by the validator before a reader sees it.

Freshness

Every answer states the newest observation it rests on. When the data is not current, present-tense language is forbidden: an answer saying “today” over a dataset that ends days ago is rejected, and the wording becomes “latest available data through” the actual date. A question about the present situation over stale data is declined outright rather than answered carefully.

Coverage

The monitored set is not the country. An answer must state the denominator it measured — “26 of 34 monitored provinces”, not “most of Indonesia” — and phrases that widen a subset into the whole country are rejected.

The provider’s role

An external language-model provider receives the question, the resolved intent, the evidence pack, the methodology labels and the limitations. It does not receive raw source payloads, database identifiers, operator notes, authorization references, or anything about how this platform obtains its data. The prompt is versioned, and every generation is recorded with the fingerprint of the evidence that produced it — so an answer stays explainable after the model behind it changes.

What it will not answer

There is no forecasting methodology here, so no answer says what prices will do. There is no validated wage series, so no answer computes purchasing power, real wages, or household inflation. No travel fare has ever been collected, so no answer quotes one. Each of those is refused with the nearest thing the platform can actually show.

Deterministic fallback

Every supported question is answerable without AI. If no provider is configured, or the provider fails, or the generated answer is rejected, the evidence is still assembled and displayed. The AI is an enhancement over the evidence and never a dependency for it.

Each source’s own methodology and disclosed limitations are on its registry page.