What the packs are

Each pack is a single SQLite database holding the products of one country, derived from the Open Food Facts database. A pack carries product identity, ingredients, additives, labels, allergens, categories and nutrition grades — the fields a halal and dietary verdict is computed from.

The packs are rebuilt weekly from the public Open Food Facts data dump, so each release is a snapshot rather than a live mirror. They contain no product images: images stay on Open Food Facts, which serves them under their own terms.

Every file is compressed with zstandard, so a pack is downloaded as a .sqlite.zst file and decompressed before it is opened.

Licence and attribution

The packs are a derived database of Open Food Facts and are published under the same terms. The database is made available under the  Open Database License (ODbL) 1.0 . The individual contents of the database are available under the  Database Contents License (DbCL) 1.0 .

If you use a pack, keep this attribution with it:

Contains data from Open Food Facts (https://world.openfoodfacts.org), made available under the Open Database License.

ODbL is share-alike: a publicly used adaptation of the database must itself be offered under ODbL. We honour that here — this page is where the derived database we build is published, in full, for everyone.

Downloads

Start from the manifest — it is the only stable URL, and it names the current version of every pack:

https://packs.halalapp.app/v1/manifest.json

The manifest is a JSON document with these top-level keys:

  • schema_version — the version of the SQLite schema described below. A reader that does not know this number should not open the packs.
  • generated_at — when this build ran, as an ISO 8601 timestamp.
  • off_dump_revision — the Open Food Facts data dump the build consumed, so a pack can be traced back to its source.
  • source — where the data came from: the Open Food Facts site and the exact dump the build read.
  • license — the licence terms in machine-readable form: the ODbL on the database, the DbCL on its contents, and the attribution string to carry.
  • verify — the build-wide totals of the acceptance check described below.
  • packs — one entry per pack.

Each entry of packs carries:

  • id , name and country_tag — the pack, its coverage, and the Open Food Facts facet it was filtered on ( null for the world pack, which is filtered on nothing).
  • version , key and url — the release stamp, the object key it is stored under, and the URL to fetch it from.
  • bytes and sha256 — the size and the SHA-256 of the compressed .sqlite.zst bytes, so a download can be checked before it is decompressed.
  • raw_bytes and sha256_raw — the same two for the decompressed SQLite file, so the decompression can be checked too.
  • product_count and vacuumed — how many products the pack holds, and whether the file was vacuumed before it was compressed.
  • verify — the acceptance check, as checked , matched and skipped . Before a pack is published, a sample of its most-scanned barcodes is read back out of the built file and compared with the live Open Food Facts API, so the counts say how far the snapshot had already drifted from the source at build time. It is not a download check — that is what the two hashes are for.

Every pack URL follows one template, with the id and the version taken from the manifest entry rather than typed by hand:

https://packs.halalapp.app/v1/{packId}/{version}/{packId}.sqlite.zst

A version is immutable, and each rebuild keeps the previous release alongside the new one — so a download already in progress keeps working across a rebuild. Older versions are removed, so a URL you fetched more than one release ago can return 404. Re-resolve the current version through the manifest each time, and retry there on a 404.

The published packs

Twenty country packs plus one aggregate pack covering the whole database. The country tag is the Open Food Facts facet each pack is filtered on.

Pack id Coverage OFF country tag
at Austria en:austria
au Australia en:australia
be Belgium en:belgium
ca Canada en:canada
ch Switzerland en:switzerland
de Germany en:germany
dk Denmark en:denmark
dz Algeria en:algeria
es Spain en:spain
fr France en:france
gb United Kingdom en:united-kingdom
in India en:india
it Italy en:italy
ma Morocco en:morocco
nl Netherlands en:netherlands
pl Poland en:poland
ru Russia en:russia
sa Saudi Arabia en:saudi-arabia
tr Turkey en:turkey
us United States en:united-states
world World (all countries) every country

What is inside a pack

A pack is a plain SQLite database with two tables. Nothing in it is specific to our app: it is the Open Food Facts fields we keep, in the shape we keep them.

products

One row per product, keyed by code — the barcode — as a TEXT PRIMARY KEY . The other columns are:

  • product_name and product_name_i18n — the name in the product's own language, and a JSON object keyed by language code ( en , fr , es , de , ar , tr , ur , ru , id , ms ) holding the translated names.
  • brands , quantity , packaging and lang — the product's identity fields and its own language code.
  • ingredients_text and ingredients_text_i18n — the ingredient list, with the same per-language JSON object as the name.
  • ingredients_tags , ingredients_analysis_tags , additives_tags , labels_tags , allergens_tags and traces_tags — the analysed ingredient, additive, label and allergen facets.
  • categories , categories_tags , countries_tags and stores_tags — where the product sits and where it is sold.
  • nutriscore_grade , nova_group and ecoscore_grade — the Open Food Facts scores, exactly as computed there.
  • last_modified_t — the product's last Open Food Facts edit, as a Unix timestamp.

Every column whose name ends in _tags holds the Open Food Facts tags comma-joined into one string, in their original en: -prefixed form, so nothing about their structure is lost.

meta

A key/value table describing the pack itself: schema_version , pack_id , country_tag , generated_at , off_dump_revision , product_count , vacuumed , data_license , content_license , attribution and source_url — the last four naming the ODbL, the DbCL, an attribution notice and the Open Food Facts address, so a pack that travels on its own still carries its licence.

Free data, paid convenience

The data on this page is free for everyone under ODbL, with no account and no request to us. What is part of Halal & Healthy Pro is the convenience: downloading a pack inside the app, keeping it up to date, and looking products up offline. The licence on the data is the same either way.

Open Food Facts

None of this exists without the contributors of  Open Food Facts , who photograph, type in and correct the products these packs are built from. Their own database and the terms it is offered under are documented at  world.openfoodfacts.org/data .

If you reuse these packs, tell Open Food Facts about it — they keep a public list of reuses, and a reuse they know about is one more argument for the people who fund and maintain the database. Write to them, or to us at  [email protected] .