App::CekBpom - Check BPOM products via the command-line (CLI interface for


This document describes version 0.010 of App::CekBpom (from Perl distribution App-CekBpom), released on 2020-10-22.


See included script cek-bpom.




 cek_bpom(%args) -> [status, msg, payload, meta]

Search BPOM products via


  • By default search against name (nama_produk) and brand (merk):

     cek_bpom( queries => ["hichew", "hi-chew", "hi chew"]);

Uses LWP::UserAgent::Plugin so you can add retry, caching, or additional HTTP client behavior by setting LWP_USERAGENT_PLUGINS environment variable.

This function is not exported by default, but exportable.

Arguments ('*' denotes required arguments):

  • note => str

    Add note.

    This will not be sent as queries, but will be added to the log file if log file is specified, as well as added to the result dump file name, in encoded form.

  • queries* => array[str]

  • query_log_file => filename

    Log queries to log file.

    If specified, each invocation of this utility will be logged into a line in the specified file path, in TSV format. Tab character in the query will be converted into 4 spaces, to avoid clash with the use of Tab as field separator.

    For example, this invocation:

     % cek-bpom "minuman susu fermentasi" yakult --query-log-file /some/path.txt

    Sample log line:

     time:2020-10-22T01:02:03.000Z    queries:minuman susu fermentasi,yakult    search_types:merk,nama_produk    num_results:51    duration:3.402
  • result_dump_dir => dirname

    Dump result to directory.

    If specified, will dump full enveloped result to a file in specified directory path, in JSON format. The JSON formatting makes it easy to grep each row. The file will be named cek-bpom-result.<encoded-timestamp>.<search-types-encoded>.<queries-encoded>(.<note-encoded>)?.json. The encoded timestamp is ISO 8601 format with colon replaced by underscore. The encoded query will replace all every group of "unsafe" characters in query with a single dash. The same goes with encoded note, which comes from the note argument. For example, this invocation:

     % cek-bpom "minuman susu fermentasi" yakult --note "some note"

    will result in a result dump file name like: cek-bpom-result.2020-10-22T01_02_03.000Z.merk-nama_produk.minuman-susu-fermentasi-yakult.some-note.json.

  • search_types => array[str]

    Select what field(s) to search against.

    By default, if not specified, will search against product name ("nama_produk") and brand ("merk"). If you specify multiple times, it will search against all those types, e.g.:

     --search-type nama_produk --search-type nama_pendaftar


     --nama-produk --nama-pendaftar

Returns an enveloped result (an array).

First element (status) is an integer containing HTTP status code (200 means OK, 4xx caller error, 5xx function error). Second element (msg) is a string containing error message, or 'OK' if status is 200. Third element (payload) is optional, the actual result. Fourth element (meta) is called result metadata and is optional, a hash that contains extra information.

Return value: (any)


Please visit the project's homepage at


Source repository is at


Please report any bugs or feature requests on the bugtracker website

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.



perlancar <>


This software is copyright (c) 2020 by

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.