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

Andi Pratama · September 4, 2026

> Perpres 39/2019 CPI Join: Harvest vs BPS API on 2022=100. That absence matters because central CKAN lakes feel durable to strategy t...

| Takeaway | Detail |
| --- | --- |
| Live lineage outlasts harvested mirrors | Audit 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 durability | Geography 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 evidence | ResearchGate Ray ID a35e68696c41840d and IDX 30 June 2026 PDF returned only security verification with zero CPI data. |
| Thin ledger prevents mispricing | No 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](https://static.mm-ais.com/article-images-ai/perpres-39-2019-cpi-join-harvest-vs-bps-ai-a171d42a.jpg)
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.

| Layer | How you access it | What you join on | Production role |
| --- | --- | --- | --- |
| BPS as Walidata | Defines standard and reference series under Satu Data Indonesia | Governed metadata and base-year definition | Authority - wins for definition |
| BPS Web API v1 | Registered key with domain-variable-variant query for versioned JSON | Stable numeric domain and variant codes | System-of-record - wins for live joins |
| Regional Walidata CSV | Manual upload by regional team to portal | Free-text city and commodity labels | Source mirror - use for bulk staging only |
| CKAN discovery and datastore | Open package search then paginated datastore reads | Shifting spellings requiring normalization | Backfill and audit - wins for history |
| Monthly release flow | API updates with publication workflow, CKAN after re-upload and harvest | Version continuity versus upload lag | API wins for freshness |

![Modern glass concrete government complex courtyard with palm](https://static.mm-ais.com/article-images-ai/perpres-39-2019-cpi-join-harvest-vs-bps-ai-c7fc8253.jpg)
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.

| Path | Freshness Signal | Fit Signal | Verdict |
| --- | --- | --- | --- |
| BPS Web API 2022=100 | November 2025 vintage within a day per BPS release calendar | December 2025 IHK per Badan Pusat Statistik | Winner for production join |
| CKAN harvest mirror | Lag Oct-Dec 2025 per data.go.id timestamp audit | Still serving September vintage when API serves November | Use for backfill only |
| Satu Data catalog search | December 2025 search surface unstable | CPI-related resources, mixed bases, minority labeled 2022=100 | Audit, do not join directly |
| Large CSV download | Varies by file size and network | Timeout/truncate above 80MB vs zero in paged API JSON | Chunk or switch to API |

![Freshness and Fit — Perpres 39/2019 CPI Join](https://static.mm-ais.com/article-images-pixabay/perpres-39-2019-cpi-join-harvest-vs-bps-82764102.jpg)

## 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.

| Criterion | BPS Web API | CKAN Harvest via data.go.id | Winner and Why |
| --- | --- | --- | --- |
| Freshness gate 24 hours post-release | Qualifies — direct release-aligned response | Fails — delayed bulk repackaging cycle | API wins for pricing and forecasting use |
| Join stability month-to-month | High deterministic joins via vervar IDs | Low — free-text labels need mapping tables | API wins, eliminates manual deduplication |
| Governance and lineage | Versioned response with request lineage | Anonymous download, no version or checksum | API wins for auditability |
| Incremental monthly appends | Wins — light append inside hours-level budget | Loses — full-file rework each cycle | API wins for production operations |
| One-off multi-year bulk seed | Slow — paged pulls period by period | Wins — single bulk warehouse seed | CKAN wins only for backfill, verdict API 4 of 5 |

![Harvest vs API Scorecard — Perpres 39/2019 CPI Join](https://static.mm-ais.com/article-images-pixabay/perpres-39-2019-cpi-join-harvest-vs-bps-af9837fc.jpg)

## 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&#039;t Tell You — Perpres 39/2019 CPI Join](https://static.mm-ais.com/article-images-pixabay/perpres-39-2019-cpi-join-harvest-vs-bps-679d0b9c.jpg)

## 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) | Fresh | Stale/Lagged | API: Accurate index; harvest misprices escalation. |
| Row Completeness | Rows with vervar IDs | Missing February rows | API: Full temporal coverage; harvest breaks joins. |
| Join Stability | Matched deterministically | Heuristic matching required | API: Structured keys prevent drift; harvest prone to errors. |
| Audit Trail | Headers + PDF lock (immutable) | No native provenance capture | API: Tamper-evident pack; harvest lacks verification. |
| Exception Handling | Variants flagged for review | Renamed strings obscure root cause | API: Isolated exceptions; harvest masks anomalies. |

![Jakarta Walkthrough — Perpres 39/2019 CPI Join](https://static.mm-ais.com/article-images-pixabay/perpres-39-2019-cpi-join-harvest-vs-bps-0dadd51b.jpg)

## 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 trigger | Threshold to apply | Winning path and why |
| --- | --- | --- |
| Needs CPI fast after release | Within 72 hours of release | BPS API domain-vervar join wins; harvest refresh varies and lags |
| Needs deep history | Longer than 36 months continuous | Seed once from CKAN bulk, then re-key all rows to API vervar IDs |
| Label matching degrades | Confidence below on free-text labels | Abort 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](https://infonesia.fyi/blog/2026-sku-data-10x-api-premium-latency-not-constant.php) · **AI Market Segmentation Strategies for Indonesia's Diverse Regions**: [AI Market Segmentation Strategies for](https://infonesia.fyi/blog/ai_market_segmentation_strategies_for_indonesias_diverse_regions.php) · **2026 Indonesia Minimum Wage: Update Cadence Cuts Stale Costs 30%**: [2026 Indonesia Minimum Wage: Update](https://infonesia.fyi/blog/2026-indonesia-minimum-wage-update-cadence-cuts-stale-costs-30.php)

### Related reading

- [Jakarta Pilots: 165-Minute TLKM Gap in Catalog vs SharePoint](https://infonesia.fyi/blog/jakarta-pilots-165-minute-tlkm-gap-in-catalog-vs-sharepoint.php)
- [NPWP 16 to 18: PMK 81/2024 Vendor Remap vs. ID Lookups](https://infonesia.fyi/blog/npwp-16-to-18-pmk-812024-vendor-remap-vs-id-lookups.php)
- [Bahasa-English Wiki Search: 41.3% Query Loss, Four Fixes](https://infonesia.fyi/blog/bahasa-english-wiki-search-413-query-loss-four-fixes.php)
- [PP 71/2019 Liability Chain: PMI Repatriation Corridors Compared](https://infonesia.fyi/blog/pp-712019-liability-chain-pmi-repatriation-corridors-compared.php)
- [PDP Law 2026: How Consent Costs Reshape First-Party Segmentation](https://infonesia.fyi/blog/pdp-law-2026-how-consent-costs-reshape-first-party-segmentation.php)
- [Automating market intelligence for Indonesian e-commerce](https://infonesia.fyi/blog/automating-market-intelligence-for-indonesian-e-commerce.php)

### Latest

- [Jakarta Pilots: 165-Minute TLKM Gap in Catalog vs SharePoint](https://infonesia.fyi/blog/jakarta-pilots-165-minute-tlkm-gap-in-catalog-vs-sharepoint.php)
- [NPWP 16 to 18: PMK 81/2024 Vendor Remap vs. ID Lookups](https://infonesia.fyi/blog/npwp-16-to-18-pmk-812024-vendor-remap-vs-id-lookups.php)
- [Bahasa-English Wiki Search: 41.3% Query Loss, Four Fixes](https://infonesia.fyi/blog/bahasa-english-wiki-search-413-query-loss-four-fixes.php)

Canonical: https://infonesia.fyi/blog/perpres-392019-cpi-join-harvest-vs-bps-api-on-2022100.php
Markdown: https://infonesia.fyi/blog/perpres-392019-cpi-join-harvest-vs-bps-api-on-2022100.php/index.md
