The catalog
<!-- order: 2 | Listed products, brands, categories and the verify lookup: what's in them and how to search. -->The catalog is every product the listing rule lists: verified, or recently withdrawn or terminated within their grace periods, and never a product marked Do Not Publish. Anyone can read it without a key, at 60 requests a minute; a key or your token raises that and, with catalog.read.extended, adds package details and other certifications.
Find a product
# By words in the product or brand name
curl "https://api.foodintegrityproject.org/v2/catalog/products?q=oat+milk"
# By barcode
curl "https://api.foodintegrityproject.org/v2/catalog/products?gtin=00850019428060"
# By certificate number
curl "https://api.foodintegrityproject.org/v2/catalog/products?certificate=C-670849-2026"
Filter by program (non_gmo or non_upf), brand_number and category (codes from /v2/catalog/categories). Combine filters freely.
Verify a product
/v2/catalog/lookup answers what a QR code or a scanner asks: is this product verified and listed?
curl "https://api.foodintegrityproject.org/v2/catalog/lookup?gtin=00850019428060"
{ "found": true, "listed": true, "product": { "name": "…", "verifications": [ { "program": "non_gmo", "status": "verified", "certificate_number": "C-670849-2026", "valid_to": "2027-04-13" } ] } }
A product that isn't listed comes back as { "found": false, "listed": false }, never with its details.
What a product has
verifications: one per program, with status, certificate number, dates, scope, the technical administrator, andlistedbrand(number and name),participant,categories,gtins- with
catalog.read.extended:packages(size, unit, type, channel) andother_certifications
The whole catalog
/v2/catalog/export?format=ndjson (or csv) streams everything listed. For a copy you keep up to date, export once, then follow the change feed.