# Changelog of Indonesia BPOM Registered Products (cekbpom) (`a-g-d/id-bpom`) Actor

- **URL**: https://apify.com/a-g-d/id-bpom/changelog.md
- **Full Actor documentation**: https://apify.com/a-g-d/id-bpom.md

## Changelog

All notable changes to this project are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to
[Semantic Versioning](https://semver.org/).

### \[0.1.3] - 2026-09-27

#### Changed

- The public Store page (README) no longer has a License section: the source is not published, and the data's terms are those of the source, described under "Data source".

### \[0.1.2] - 2026-09-26

#### Changed

- The README is now purely the public Apify Store page: build, test and schema notes moved
  to `DEVELOPMENT.md`, and field documentation points to the Store's Output tab instead of
  files in the (private) repository.
- The User-Agent's contact link is the public Store page (https://apify.com/a-g-d/id-bpom) instead of the
  private repository.

### \[0.1.1] - 2026-09-26

#### Fixed

- Host name resolution on the Apify platform: one of pom.go.id's four nameservers does
  not answer, so public resolvers sometimes failed or cached a negative answer and the
  first requests of a run waited 5-25 s on DNS retries. After the system and public
  resolvers, the actor now asks the zone's own nameservers directly.

### \[0.1.0] - 2026-09-26

#### Added

- Registered products from Indonesia's BPOM public search (cekbpom.pom.go.id) through the
  site's own DataTables JSON endpoint: cosmetics, processed food, medicines, traditional
  medicines (and the jamu, phytopharmaceutical, standardised-herbal and other-natural
  sub-lists), health supplements, quasi-drugs, or all classes, newest approval first, up to
  100,000 records per run at 5,000 per request.
- Filters: product name, brand, registration number and registrant (contains), exact
  status, approval window, and registrations expiring between today (Jakarta time) and a
  date.
- English-keyed records: NIE, product, brand, packaging, form, class (id, English and
  Indonesian names), queried sub-class, category, status, ISO dates (WIB), registrant,
  importer, ingredients as a list, ATC code, e-label leaflet links, halal certificate when
  filled, processed-food risk level and document category, replaced product id, detail-card
  link, source page and fetch time.
- Personal data dropped at parse time: the processing officer's name (`USER_NAME`) and the
  registrant's tax id (`REGISTRAR_NPWP`), never output in any form.
- Politeness: at least 5 s between requests (robots.txt `Crawl-delay: 5`), one connection,
  an honest User-Agent, disallowed paths refused by the client.
- Resilience: session and CSRF token renewed once on HTTP 419/401/403; DNS fallback to
  public resolvers with a 5 s system-resolver timeout and last-good-address reuse; retries
  with exponential backoff and jitter on DNS errors, resets, timeouts, 5xx and 200s
  without data, inside a run-wide backoff budget; optional Apify Proxy.
- Pay-per-event billing: `product-record` per stored record, charged after storing; each
  page is planned against the remaining spending limit and the run stops cleanly when it
  runs out.
