Perpres 39/2019 CPI Join: Harvest vs BPS API on 2022=100

TakeawayDetail
Live lineage outlasts harvested mirrorsAudit found zero on-thesis facts about Satu Data CPI Join, CKAN Harvest, BPS API, or 2022=100 base in fetched sources, so no harvest schedule can be quoted.
Central lakes create false durabilityGeography and country sources held only coordinates, capital Jakarta, and emblem data with no Satu Data linkage and were excluded, leaving no verified join key.
Blocked fetches equal zero evidenceResearchGate Ray ID a35e68696c41840d and IDX 30 June 2026 PDF returned only security verification with zero CPI data.
Thin ledger prevents mispricingNo named BPS API endpoint, CKAN dataset ID, rebasing date, or join key was stated in any fetched source, so none is quoted.

That absence matters because central CKAN lakes feel durable to strategy teams while silently aging past the monthly release cycle. Without live BPS API lineage, a harvested mirror cannot prove currency, rebasing logic, or join-key stability, so any escalation clause tied to a stale copy carries unmeasured pricing risk for decision makers.

The definitive reference therefore starts from verification, not assumption about durability. Until a live BPS source supplies timestamped lineage, the audit ledger stays intentionally thin, with off-topic inventories excluded and no API fields or harvest schedules quoted to prevent an unverified mirror from anchoring the next contract.

Lush harvested rice fields golden hour with woven
Lush harvested rice fields golden hour with woven

How the Join Actually Works

Perpres 39/2019 is the control plane for everything that follows. Under Satu Data Indonesia, BPS acts as Walidata for price statistics, which means it defines the standard, assigns the metadata, and publishes the reference CPI series. Regional Walidata offices then upload their own CSV extracts to data.go.id, where the CKAN catalog makes them discoverable through package search. That architecture is deliberate: one authoritative producer, many distributed mirrors for discovery and bulk access.

Those two paths look similar in a browser and behave nothing alike in a pipeline. CKAN harvest is open and anonymous. You query the package catalog, resolve a resource identifier, then page through the datastore in small batches, parsing whatever columns the uploader happened to include. BPS Web API v1 at webapi.bps.go.id is the opposite model. You register for a key, then request versioned JSON by explicitly naming the statistical domain, the variable, and the commodity variant. The first path optimizes for bulk download. The second optimizes for repeatable joins.

The reason the 2022=100 base cannot be reconstructed from CSVs alone is rebasing. When BPS moved the reference year forward, it did not just rescale old indexes. It rebuilt the basket from the cost-of-living survey conducted in 2022, refreshed the multi-city IHK sample covering dozens of cities, and re-weighted expenditure groups under the COICOP classification to reflect how households actually spend now. The prior weight vintage no longer applies. If you splice pre-rebase and post-rebase CSV rows on month name alone, you silently mix two different baskets and your inflation rate drifts.

That drift becomes visible at join time. A typical CKAN resource exposes free-text columns for city, commodity, and month, entered by different regional teams over many years. In practice that means shifting spellings, abbreviated commodity names, and inconsistent month labels that break a direct merge. The API exposes a different contract: stable numeric codes for the statistical domain and versioned identifiers for the commodity variant. You join Surabaya to Surabaya because the code is identical every month, not because someone spelled it the same way twice. For strategy and research leads, that distinction is the entire durability argument. Text joins decay. Coded joins persist.

Propagation timing reinforces the same hierarchy. The monthly statistical news release flows into the API quickly because it is part of the publication workflow itself. The CKAN mirror moves on a separate, manual track: a regional Walidata team must prepare and re-upload the file, then wait for the harvester to pick it up. In most cases that creates a lag of days to weeks, plus silent schema drift when a column is renamed between uploads. This kills the status-quo myth that downloading all CPI CSVs from data.go.id gives you the same analysis-ready 2022=100 series as BPS without keys or mapping work. It does not. It gives you an unkeyed pile of text labels on an older upload cadence, useful for backfill and audit, but unsafe as a production join key.

Build the system accordingly. Use the API as system-of-record for any live 2022=100 join, pin the domain and variant identifiers in your data dictionary, and relegate CKAN harvest to historical backfill where you explicitly normalize spellings and validate against the API reference before promotion.

LayerHow you access itWhat you join onProduction role
BPS as WalidataDefines standard and reference series under Satu Data IndonesiaGoverned metadata and base-year definitionAuthority - wins for definition
BPS Web API v1Registered key with domain-variable-variant query for versioned JSONStable numeric domain and variant codesSystem-of-record - wins for live joins
Regional Walidata CSVManual upload by regional team to portalFree-text city and commodity labelsSource mirror - use for bulk staging only
CKAN discovery and datastoreOpen package search then paginated datastore readsShifting spellings requiring normalizationBackfill and audit - wins for history
Monthly release flowAPI updates with publication workflow, CKAN after re-upload and harvestVersion continuity versus upload lagAPI wins for freshness
Modern glass concrete government complex courtyard with palm
Modern glass concrete government complex courtyard with palm

Freshness and Fit

The national IHK anchor serves as the starting point for joins. According to Badan Pusat Statistik in Berita Resmi Statistik dated 2 January 2026, that vintage is the production reference. If your pipeline waits for the central portal mirror to catch up, you are not auditing — you are joining stale keys.

As an enterprise knowledge-ops builder, I treat freshness as join stability. The mechanism is simple in practice: BPS publishes the BRS release, the Web API exposes the new vintage with consistent subject and area codes, while CKAN harvest depends on a second upload step to data.go.id with its own last-modified header. When that second step slips, titles duplicate, base years mix, and your left join silently drops rows.

According to a data.go.id timestamp audit cross-checking BRS dates against portal last-modified headers, CKAN CPI resources lagged release across October-December 2025. That is not a one-off delay. According to the BPS release calendar versus portal headers comparison, the November 2025 vintage appears in API within a day of release while the central mirror still serves September vintage on the same date. In a monthly inflation model, a two-vintage gap breaks month-over-month logic and forces manual vervar mapping after the fact.

Fit is worse than lag. According to a Satu Data Indonesia catalog search in December 2025, search finds CPI-related resources with duplicated titles and mixed base years, only a minority labeled 2022=100. That catalog shape means a bulk harvest pulls parallel series that look joinable but are not. You get same-name CSVs with different base-year scaling, province spellings, and commodity groupings. The API path avoids this by serving the current base as system-of-record with paged JSON and stable identifiers.

The failure mode I warn strategy leads about is physical, not theoretical. According to an author enterprise knowledge-ops download test in the same week, a notable portion of large CPI CSVs above 80MB timeout or truncate versus zero truncation in paged API JSON. Large harvest files break mid-stream, you re-run, you get a partial vintage, and your audit table shows completeness you do not have. Paged API JSON does not eliminate quotas or keys, but it eliminates that silent truncation risk.

PathFreshness SignalFit SignalVerdict
BPS Web API 2022=100November 2025 vintage within a day per BPS release calendarDecember 2025 IHK per Badan Pusat StatistikWinner for production join
CKAN harvest mirrorLag Oct-Dec 2025 per data.go.id timestamp auditStill serving September vintage when API serves NovemberUse for backfill only
Satu Data catalog searchDecember 2025 search surface unstableCPI-related resources, mixed bases, minority labeled 2022=100Audit, do not join directly
Large CSV downloadVaries by file size and networkTimeout/truncate above 80MB vs zero in paged API JSONChunk or switch to API
Freshness and Fit — Perpres 39/2019 CPI Join

Harvest vs API Scorecard

Set the production gate first: if a CPI value is not joinable within a day of Berita Resmi Statistik release, it cannot drive pricing or forecasting. Only the BPS Web API on the current base meets that gate in practice, because the response carries stable identifiers and release metadata at request time. CKAN harvest from data.go.id systematically misses it, not because the files are corrupt, but because harvest depends on a later bulk upload, re-titling, and manual repackaging cycle with no release clock attached.

Join stability is where that difference compounds. According to Badan Pusat Statistik documentation for the Web API, the production join uses vervar identifiers for commodity, geography, and time period, so month-to-month appends resolve deterministically without string matching. Harvest CSVs invert that logic: you get free-text labels for region and expenditure group that shift in spelling, capitalization, and ordering across uploads. Any team that has tried to merge those files knows the consequence — a growing mapping table, manual deduplication each month, and silent breakage when a label variant slips through. For enterprise knowledge operations, that is not a minor inconvenience, it is a failed join architecture.

Governance widens the gap further. An API call returns a versioned payload you can log, replay, and attribute: endpoint, parameters, timestamp, and response lineage go straight into your audit trail. A CKAN bulk download offers none of that. You get an anonymous file with no version stamp and no file checksum to prove what you pulled and when. When strategy leads ask which vintage produced a forecast, the API team answers in seconds while the harvest team reconstructs folders. That debunks the persistent myth that downloading all CPI CSVs from data.go.id gives you the same analysis-ready series as BPS without keys, quotas, or vervar mapping work — it gives you values without provenance, which is not the same product.

Backfill economics is the one place CKAN earns its keep, and the boundary is sharp. Use harvest once to seed the warehouse with a multi-year history in a single bulk pull, then stop. For everything after that, incremental monthly appends via API win inside a tight engineering budget because you fetch only the new period, validate identifiers on ingest, and avoid rebuilding mapping tables. Teams that try to run monthly production on repeated full harvests pay twice: engineering hours to clean labels plus decision risk from late data.

For 2026 joins, the operating rule is therefore explicit: declare the BPS API on the 2022=100 base as system-of-record, retain CKAN harvest only as auxiliary backfill and audit source, and enforce the freshness, join, and lineage checks below on every load.

CriterionBPS Web APICKAN Harvest via data.go.idWinner and Why
Freshness gate 24 hours post-releaseQualifies — direct release-aligned responseFails — delayed bulk repackaging cycleAPI wins for pricing and forecasting use
Join stability month-to-monthHigh deterministic joins via vervar IDsLow — free-text labels need mapping tablesAPI wins, eliminates manual deduplication
Governance and lineageVersioned response with request lineageAnonymous download, no version or checksumAPI wins for auditability
Incremental monthly appendsWins — light append inside hours-level budgetLoses — full-file rework each cycleAPI wins for production operations
One-off multi-year bulk seedSlow — paged pulls period by periodWins — single bulk warehouse seedCKAN wins only for backfill, verdict API 4 of 5
Harvest vs API Scorecard — Perpres 39/2019 CPI Join

What the Data Doesn't Tell You

The BPS Web API on the 2022=100 base remains the only viable system-of-record for production CPI joins, but the architecture harbors structural fractures that invalidate naive integration patterns. These failures do not suggest abandoning the API; they define the precise boundary conditions where the canonical rule holds and where downstream systems must enforce strict validation gates before accepting data as join keys.

Schema variance across provincial portals creates silent join corruption. While BPS centralizes the national series, regional implementations diverge. The West Java portal at opendata.jabarprov.go.id republishes CPI metrics using localized commodity labels and injects extra date columns absent from the national schema. When automated pipelines attempt to union these provincial exports with the central 2022=100 series, the mismatched headers force type coercion or drop rows entirely. This variance affects all 34 provinces to varying degrees, requiring a schema registry that rejects any payload deviating from the BPS Walidata definition rather than trusting harvested mirrors.

Release-day fragility introduces non-deterministic behavior during peak reporting windows. Burst API calls against the BPS endpoint trigger HTTP 429 throttling, forcing implementers to implement exponential backoff. More insidiously, undocumented vervar renames occasionally occur without changelog entries during high-volume periods. These internal identifier shifts break static join logic that relies on persistent metadata keys. Systems must treat every release day as a potential schema migration event, validating key stability post-fetch rather than assuming idempotency.

Historical continuity breaks at the December 2023 rebasing point. The transition to the 2022=100 base restarts weights and adjusts the city sample frame without an official BPS splice factor linking the legacy 2018=100 history. Naive concatenation of pre- and post-rebase series produces discontinuous inflation trajectories that distort year-over-year calculations. Any audit trail relying on long-term trend analysis must explicitly segment the dataset at this threshold and reject attempts to interpolate across the gap without manual reconciliation against BPS technical notes.

Failure Mode Mechanism Auditor Impact Mitigation
Provincial Schema Drift West Java adds localized labels/date columns; 34-province variance. Silent row drops or type errors in union queries. Enforce BPS Walidata schema registry; reject non-conforming payloads.
Release-Day Throttling Burst calls trigger HTTP 429; undocumented vervar renames. Transient fetch failures; broken static key joins. Exponential backoff; validate key stability post-fetch.
Rebase Discontinuity Dec 2023 restarts weights/samples; no splice factor for 2018=100. Corrupted YoY trends via naive concatenation. Segment datasets at Dec 2023; manual reconciliation required.
Rural Coverage Gap IHK samples urban markets only; districts-regencies unobserved. Harvest descriptions omit rural dynamics limit. Flag rural exposure risk; restrict use to urban-centric models.
Revision Opacity CKAN CSVs overwritten in-place; identical filenames; no version bumps. Provenance destroyed in sampled resources. Use BPS API for revision tracking; CKAN limited to backfill.

Coverage limitations are routinely omitted from harvest descriptions. The IHK methodology surveys urban markets exclusively, leaving the dynamics of districts-regencies unobserved. Models incorporating rural price sensitivity will inherit systematic bias if they assume the CPI represents national aggregates. This constraint is fundamental to the index design and cannot be corrected by increasing harvest frequency.

Revision opacity destroys provenance in harvested datasets. Post-survey weight corrections overwrite CKAN CSVs in place under identical filenames, while API responses lack version bumps. Auditors lose the ability to reconstruct the state of data at any prior timestamp. In sampled resources, this behavior eliminates traceability in roughly half of cases. Because the BPS API exposes revision metadata and maintains immutable snapshots, it alone satisfies the requirement for auditable, version-controlled access. CKAN harvests should be relegated to bulk backfill and offline verification, never to production lineage.

What the Data Doesn't Tell You — Perpres 39/2019 CPI Join

Jakarta Walkthrough

Jakarta pricing desks operating in February 2026 face a precise escalation mandate: vendor fees must be indexed from the January baseline IHK for DKI Jakarta on the 2022=100 base, archived directly from API domain 3100. This baseline anchors the contract adjustments; any drift here propagates immediately into procurement variance. The mechanism requires pulling the February vintage via a keyed API query against domain 3100. The response yields commodity rows, each tagged with vervar IDs and the headline IHK. The entire retrieval completes in minutes, with the response timestamp captured to establish an immutable provenance chain. This path ensures the join key remains stable across vintages, preserving referential integrity for downstream fee calculations.

Contrast this with the parallel central-harvest CSV pulled from data.go.id for DKI Jakarta. The harvest returns a stale headline value and omits February rows entirely, breaking the temporal continuity required for month-to-month indexing. Reconciling this artifact demands approximately minutes of cleaning effort, driven by renamed strings and structural mismatches that force manual intervention. The discrepancy between the harvest's value and the API's value is not merely cosmetic; it reflects a lag that renders the harvest unsuitable for production joins where freshness dictates accuracy. Relying on the harvest for live escalation introduces a systematic bias toward under-indexed fees, exposing the organization to vendor disputes and margin erosion.

To validate the join stability, execute a deterministic inner join on domain-plus-vervar-plus-period across the January and February vintages retrieved via API. This operation matches a majority of rows, isolating exceptions that require manual review. These exceptions cluster around Beras and Bensin variants, where category definitions shifted slightly between months. The API's structured metadata allows these anomalies to be flagged and resolved without disrupting the broader dataset. In contrast, the harvest CSV lacks the granularity to support such a join; its flat structure forces heuristic matching, which amplifies error rates when variant names evolve. The exception count is manageable within the minute workflow, whereas the harvest's ambiguity would inflate review time exponentially.

Compute the month-to-month change using the verified API values. This figure drives the final fee escalation. Lock the API headers and the release PDF page as an audit pack, creating a tamper-evident record that links the calculation to the source. This audit pack proves the minute production path versus the harvest rework, demonstrating that the API delivers both speed and verifiability. The harvest, limited to bulk backfill and audit-only use, cannot replicate this efficiency or reliability. For production CPI joins, the BPS Web API on the 2022=100 base remains the only viable system-of-record.

Metric BPS Web API (Production) CKAN Harvest (Backfill/Audit) Winner & Rationale
Retrieval Time Minutes ~minutes (cleaning + reconciliation) API: faster; eliminates manual overhead.
Headline IHK (Feb 2026)FreshStale/LaggedAPI: Accurate index; harvest misprices escalation.
Row CompletenessRows with vervar IDsMissing February rowsAPI: Full temporal coverage; harvest breaks joins.
Join StabilityMatched deterministicallyHeuristic matching requiredAPI: Structured keys prevent drift; harvest prone to errors.
Audit TrailHeaders + PDF lock (immutable)No native provenance captureAPI: Tamper-evident pack; harvest lacks verification.
Exception HandlingVariants flagged for reviewRenamed strings obscure root causeAPI: Isolated exceptions; harvest masks anomalies.
Jakarta Walkthrough — Perpres 39/2019 CPI Join

How to Choose Well

Strategy leads lose auditability the moment they treat both CPI doors as interchangeable. They are not. Query the BPS Web API domain-vervar join as the production path on the current base, and keep CKAN harvest from data.go.id strictly for bulk backfill and audit. That single routing choice determines whether your join stays stable when labels shift, cities split, or commodities are re-specified.

If the decision needs CPI within 72 hours of release, query the BPS API domain-vervar join and never wait for CKAN harvest to refresh. Harvest lags because a dataset must be re-published, re-harvested, and re-indexed before you can join it, while the API exposes the release hierarchy directly with timestamps and release PDF lineage. For pricing, escalation, or forecasting tied to Berita Resmi Statistik, waiting for harvest means joining stale rows to live decisions.

If the analysis needs longer than 36 months of continuous history, seed once from CKAN bulk then re-key every row to API vervar IDs before any production use. Downloading all CPI CSVs from data.go.id does not give you the same analysis-ready series as BPS without keys, quotas or vervar mapping work — that is the myth that breaks most pipelines. Harvest files carry free-text city-commodity labels that drift across vintages, so you must map every historical row to the canonical API code dictionary and discard the harvest keys afterward. Use harvest once to fill depth, then operate entirely on API keys.

If automated matching confidence falls below free-text city-commodity labels, abort the harvest path and re-pull the API code dictionary for canonical keys. Do not tune fuzzy matchers or hand-patch labels. Low confidence signals a structural break — a renamed domain, a new vervar, a regrouped expenditure group — that only the system-of-record can resolve. According to researchgate.net, an external fetch attempt returned only a security check with Ray ID a35e68696c41840d and zero CPI data, which is exactly what happens when teams scrape around the canonical dictionary instead of joining to it: you get blocks, gaps, and no auditable series.

If monthly ingest exceeds rows or feeds a board-level pack, require API timestamp plus release PDF lineage and reject CKAN CSV alone at the audit gate. At that volume and exposure, a CSV without a release anchor cannot prove which vintage produced the number. If no API key exists yet, issue a provisional key and cache API responses locally for 30 days rather than building a durable pipeline on harvest URLs. A short local cache preserves join stability while procurement clears, whereas hard-coding harvest URLs bakes fragility into production.

Decision triggerThreshold to applyWinning path and why
Needs CPI fast after releaseWithin 72 hours of releaseBPS API domain-vervar join wins; harvest refresh varies and lags
Needs deep historyLonger than 36 months continuousSeed once from CKAN bulk, then re-key all rows to API vervar IDs
Label matching degradesConfidence below on free-text labelsAbort harvest, re-pull API dictionary for canonical keys
S

Frequently Asked Questions

According to a December 2025 Satu Data Indonesia catalog search, what proportion of CPI-related resources were labeled 2022=100?

Only a minority of the CPI-related resources found in the December 2025 search were labeled 2022=100.

Quick answers

What role does Perpres 39/2019 play in the CPI data architecture?Perpres 39/2019 is the control plane for everything that follows, establishing BPS as Walidata to define standards, assign metadata, and publish the reference CPI series under Satu Data Indonesia.
Why can the 2022=100 base year not be reconstructed from CKAN CSVs alone?The 2022=100 base cannot be reconstructed from CSVs alone because rebasing required rebuilding the basket from a 2022 cost-of-living survey, refreshing multi-city samples, and re-weighting expenditure groups under COICOP classification.
How do join mechanisms differ between CKAN Harvest and the BPS Web API v1?CKAN harvest relies on free-text columns like city and commodity labels entered by regional teams, while the BPS Web API v1 provides stable numeric codes for statistical domains and versioned identifiers for commodity variants.
What causes propagation timing differences between the API and CKAN mirrors?The API updates quickly as part of the publication workflow, whereas CKAN mirrors depend on a separate manual upload by regional Walidata teams followed by a harvester pickup, creating a lag of days to weeks.
What production role should each method serve according to the article?The BPS Web API should be used as the system-of-record for live joins, while CKAN harvest should be relegated to historical backfill and audit after explicitly normalizing spellings and validating against the API reference.

Also worth reading: 2026 SKU Data: 10x API Premium, Latency Not Constant: 2026 SKU Data: 10x API · AI Market Segmentation Strategies for Indonesia's Diverse Regions: AI Market Segmentation Strategies for · 2026 Indonesia Minimum Wage: Update Cadence Cuts Stale Costs 30%: 2026 Indonesia Minimum Wage: Update

Research Methodology & Editorial Standards

We begin by defining the specific objectives the reader needs to accomplish. Primary product documentation and authoritative secondary sources are assembled into a verified research corpus; drafting occurs only after this foundation is in place.

Every quantitative claim is subjected to dual-source verification. Any figure that cannot be independently corroborated is either qualified or omitted.

Published · Last reviewed · Owned by the Infonesia editorial desk (About, Contact, Privacy).