Open Data
We publish the per-country product packs that power offline lookups in the app, as open data under the Open Database License. Anyone may download, use and redistribute them under the same terms.
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,nameandcountry_tag— the pack, its coverage, and the Open Food Facts facet it was filtered on (nullfor theworldpack, which is filtered on nothing). -
version,keyandurl— the release stamp, the object key it is stored under, and the URL to fetch it from. -
bytesandsha256— the size and the SHA-256 of the compressed.sqlite.zstbytes, so a download can be checked before it is decompressed. -
raw_bytesandsha256_raw— the same two for the decompressed SQLite file, so the decompression can be checked too. -
product_countandvacuumed— how many products the pack holds, and whether the file was vacuumed before it was compressed. -
verify— the acceptance check, aschecked,matchedandskipped. 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_nameandproduct_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,packagingandlang— the product's identity fields and its own language code. -
ingredients_textandingredients_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_tagsandtraces_tags— the analysed ingredient, additive, label and allergen facets. -
categories,categories_tags,countries_tagsandstores_tags— where the product sits and where it is sold. -
nutriscore_grade,nova_groupandecoscore_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] .