Stop reading 500-page European Union legal PDFs. They weren’t written for you. They were written by lawyers, for lawyers, and they’re a minefield of ambiguity designed to protect institutions, not your app.
If you are building a food, health, or restaurant application for the European Union market, you are not just a developer. You are a publisher of regulated information. And when it comes to food, the regulations are not suggestions. They are strict, legally-binding requirements. Your code is now subject to food law.
At the center of this is Regulation (EU) No 1169/2011 on the provision of Food Information to Consumers, or FIC. This is the law that governs every piece of food information—especially allergens—presented to an EU consumer. Getting it wrong isn’t a bug you can patch later. It’s a compliance failure that can lead to crippling fines, user lawsuits, and the destruction of your brand’s credibility before it even gets off the ground.
This is not a scare tactic. It’s a market reality. Your competitors, like Spoonacular, provide a vast ocean of data, but navigating compliance is left to you. They give you a dictionary, but you’re still on the hook for writing the novel. That’s a dangerous place to be.
We’re here to give you the developer-friendly translation of the law, the UI best practices to mitigate your liability, and most importantly, the exact JSON data structure you need to satisfy every clause. This is the blueprint for turning a legal nightmare into a simple, reliable API call.
What is FIC Regulation 1169/2011?
In simple terms, FIC 1169/2011 is the EU’s single, unified rulebook for food labelling. It was created to replace a patchwork of older directives and make food information clear, legible, and consistent for consumers across all member states. For a CTO or developer, you can think of it as a strict data schema for food.
The Regulation’s core principle is transparency. A consumer must be able to know, without ambiguity, what is in their food. This is especially critical for the millions of people with food allergies, for whom a missing piece of information can be a life-or-death matter.
From a technical standpoint, FIC mandates three key things that directly impact your application:
- Mandatory Information: A specific list of details must be present for most prepacked foods, including the name of the food, a list of ingredients, and nutrition information.
- Allergen Highlighting: Any of the 14 mandatory allergens present in the ingredients must be emphasized in the ingredients list. The law specifies this can be through a change in font, style (like bolding or italics), or background color.
- Clarity and Legibility: The information must be easy to read and understand. For digital applications, this translates directly to UI/UX design. Hiding allergen information behind multiple clicks or in a tiny font is a direct violation of the spirit, and likely the letter, of the law.
Your responsibility is to ensure that the data you pull from an API and render in your app’s UI is a perfect, compliant reflection of these rules. The Regulation doesn’t care if your data source was inaccurate. The liability falls on the Food Business Operator (FBO), and your platform is now part of that chain.

The EU 14 Mandatory Allergens: Your Core Data Requirement
FIC annex II lists 14 substances or products that cause the majority of food allergies and intolerances in Europe. You must explicitly declare the presence of any of these in your product data. This is not negotiable. Let’s break down the list, with specific technical considerations you need to be aware of.
- Cereals containing gluten: namely wheat (such as spelt and khorasan wheat), rye, barley, oats.
- Crustaceans: for example prawns, crabs, lobster, crayfish.
- Eggs.
- Fish.
- Peanuts.
- Soybeans.
- Milk (including lactose).
- Nuts: namely almonds, hazelnuts, walnuts, cashews, pecan nuts, Brazil nuts, pistachio nuts, macadamia or Queensland nuts.
- Celery.
- Mustard.
- Sesame seeds.
- Sulphur dioxide and sulphites: This is a critical nuance. They only need to be declared if they are present at concentrations of more than 10 mg/kg or 10 mg/litre in terms of the total SO2. Your data source must be able to provide this level of quantitative detail, not just a simple boolean. A generic API often fails here.
- Lupin: A type of legume, common in some parts of Europe as a flour substitute.
- Molluscs: for example mussels, oysters, squid, snails.
Your system must be architected to handle each of these 14 points as a distinct data field. A simple tags: ["nuts", "dairy"] array from a generic food API is insufficient and dangerous. You need granular, boolean flags for each specific allergen as defined by the law.
PPDS (Prepacked for Direct Sale): The Natasha’s Law Update
On October 1, 2021, the rules in the UK tightened significantly due to a tragic event. A teenager named Natasha Ednan-Laperouse died from an allergic reaction to a pre-packaged baguette that, under the old rules, did not require individual allergen labelling. This led to Natasha’s Law.
This law specifically targets food that is Prepacked for Direct Sale (PPDS). This is food that is packaged at the same place it is offered or sold to consumers and is in its packaging before it is ordered or selected.
Think about:
* A sandwich or salad packaged by a cafe and placed on a shelf for customers to grab.
* A butcher who packages sausages or pies on-site to be sold from a counter.
* A food truck selling pre-boxed meals.
If your application facilitates the sale of any food item that falls under the PPDS definition in the UK (and similar interpretations are being adopted across the EU), you are now required to display full ingredient and allergen information for that item. The old exception of simply having a sign telling customers to ask staff is gone.
What this means for your app:
Your platform’s responsibility just expanded. If you are a delivery aggregator, a restaurant discovery app, or provide a digital menu platform, you are now a conduit for PPDS information. You must have a system capable of ingesting and displaying full, accurate, and highlighted allergen information for every single PPDS item offered by your partners. This requires a robust API and a data model that can handle product-level variations, not just a generic restaurant menu.
What ‘May Contain’ and Cross-Contamination Declarations Require By Law
This is one of the most misunderstood areas of food labelling, and a place where technical teams often make critical errors. There is a legal and practical difference between an allergen being an ingredient and an allergen being present due to cross-contamination.
FIC 1169/2011 itself covers allergens present as ingredients. The use of precautionary allergen labelling (PAL), such as “may contain nuts” or “produced in a factory that handles shellfish,” is not specifically regulated by FIC. Instead, it falls under general food safety law (Regulation 178/2002), which states that food must not be placed on the market if it is unsafe.
An FBO will use a “may contain” statement after a thorough risk assessment reveals a genuine, unavoidable risk of cross-contamination. It is not a legal loophole to cover for poor manufacturing practices.
For your app, this means your data structure must differentiate:
- Intentional Allergens: Allergens that are part of the product’s recipe (e.g.,
has_peanuts: true). These must be highlighted in the ingredient list. - Precautionary/Advisory Allergens: Allergens that are not in the recipe but could be present due to shared equipment or environment (e.g.,
allergen_advisory_statement: "May contain traces of milk."). This information should be displayed clearly, but separately from the main ingredient list, to avoid confusing the user.
A generic API that lumps these two distinct types of data into a single array is setting you up for failure. It either overstates the risk (confusing users) or understates it (creating liability). You need an API that understands the law and provides separate, structured fields for both.

How to Implement EU-Compliant Allergen Display In Your Food App
Your backend can be perfectly compliant, but if the front-end presentation is poor, you are still liable. The law requires information to be clear and legible. Here are the non-negotiable best practices for your UI/UX.
1. The Ingredient List is Sacred
For any product with an ingredient list, the 14 EU allergens must be visually emphasized. The most common and legally sound method is bolding.
- Bad:
Ingredients: Wheat flour, sugar, egg, milk powder, vanilla extract. - Good:
Ingredients: **Wheat** flour, sugar, **egg**, **milk** powder, vanilla extract.
Your UI components must be able to parse and render this formatting directly from the data you receive.
2. The Allergen Summary Box
In addition to highlighting within the ingredients, it is best practice to provide a clear, easy-to-read summary box. This is where you declare the presence of allergens.
- Contains: List the allergens that are intentional ingredients. Use clear, unambiguous language. For example:
Contains: Wheat, Egg, Milk. - May Contain: If your API provides a precautionary statement, display it separately and clearly. For example:
May Contain: Nuts, Soya.
This two-tiered approach provides maximum clarity for the user and demonstrates your due diligence.
3. Use Icons, But With Text Labels
Allergen icons can be a great visual aid, but they are not a substitute for text. There is no universally standardized set of allergen icons, and relying on them alone can lead to misinterpretation.
- Best Practice: Display a clear icon (e.g., a peanut icon) along with the text label “Peanuts”. This combination is both scannable and unambiguous.
4. Filter and Search Functionality
Empower your users. Your application should allow users to set their allergen profiles and filter out unsuitable products. This is not just a feature; it’s a critical safety tool. This requires your backend data to be granular and accurate. You cannot build a reliable “Contains Nuts” filter if your API just gives you a vague tag.
A Warning on Legal Liability
Do not bury this information. It should be one click away from the main product page, at most. Add a clear disclaimer to your app’s Terms of Service stating that users with severe allergies should always take extra precautions and that your data is for informational purposes. However, a disclaimer will not protect you if your data is proven to be systematically negligent or inaccurate. The quality of your data partner is your first and most important line of defense.
Mapping FIC Requirements to API Fields: A Developer Reference Table
This is where theory meets execution. A compliant system is impossible without a compliant data structure. A generic food API gives you unpredictable strings in an array. A purpose-built compliance API like NutriGraphAPI gives you a predictable, boolean-based schema that maps directly to the law. There is no room for interpretation, and no string parsing required.
Below is a direct mapping of the EU 14 allergens and related compliance data to the fields you’ll find in a NutriGraphAPI JSON response. This is the data structure you need to demand from your provider.
| EU Legal Requirement (FIC 1169/2011 Annex II) | NutriGraphAPI JSON Field | Data Type | Example Value | Implementation Notes |
|---|---|---|---|---|
| Cereals containing gluten | allergens.has_gluten |
boolean |
true |
Master flag for all gluten-containing cereals. |
| – Wheat | allergens.contains_wheat |
boolean |
true |
Specific grain. Allows for filtering for non-wheat gluten sources like barley. |
| – Rye | allergens.contains_rye |
boolean |
false |
Specific grain. |
| – Barley | allergens.contains_barley |
boolean |
false |
Specific grain. |
| – Oats | allergens.contains_oats |
boolean |
false |
Specific grain. Important for users who can tolerate gluten-free oats but not other cereals. |
| Crustaceans | allergens.has_crustaceans |
boolean |
false |
Covers prawns, crabs, lobster, etc. |
| Eggs | allergens.has_eggs |
boolean |
true |
Clear and unambiguous. |
| Fish | allergens.has_fish |
boolean |
false |
Clear and unambiguous. |
| Peanuts | allergens.has_peanuts |
boolean |
true |
Legally distinct from tree nuts. Never bundle them. |
| Soybeans | allergens.has_soy |
boolean |
true |
Note the field name has_soy for developer convenience. |
| Milk | allergens.has_milk |
boolean |
true |
Covers all milk products, including lactose. |
| Nuts | allergens.has_tree_nuts |
boolean |
true |
Master flag for all tree nuts listed in FIC. |
| – Almonds | allergens.contains_almonds |
boolean |
true |
Specific nut type. |
| – Hazelnuts | allergens.contains_hazelnuts |
boolean |
false |
Specific nut type. |
| – Walnuts | allergens.contains_walnuts |
boolean |
false |
Specific nut type. |
| – Cashews | allergens.contains_cashews |
boolean |
false |
Specific nut type. |
| – Pecan nuts | allergens.contains_pecans |
boolean |
false |
Specific nut type. |
| – Brazil nuts | allergens.contains_brazil_nuts |
boolean |
false |
Specific nut type. |
| – Pistachio nuts | allergens.contains_pistachios |
boolean |
false |
Specific nut type. |
| – Macadamia nuts | allergens.contains_macadamia |
boolean |
false |
Specific nut type. |
| Celery | allergens.has_celery |
boolean |
false |
Clear and unambiguous. |
| Mustard | allergens.has_mustard |
boolean |
false |
Clear and unambiguous. |
| Sesame seeds | allergens.has_sesame |
boolean |
false |
Clear and unambiguous. |
| Sulphur dioxide and sulphites | allergens.has_sulphites |
boolean |
false |
This boolean is only true if the concentration is > 10 mg/kg or 10 mg/L. |
| – Sulphite Concentration (ppm) | allergens.sulphites_ppm |
integer |
0 |
Provides the quantitative data for custom logic or display, where ppm (parts per million) is equivalent to mg/kg. |
| Lupin | allergens.has_lupin |
boolean |
false |
Clear and unambiguous. |
| Molluscs | allergens.has_molluscs |
boolean |
false |
Covers mussels, squid, oysters, etc. |
| Cross-Contamination & PAL | allergen_advisory_statement |
string |
"May contain traces of tree nuts and soy." |
Precautionary Allergen Labelling (PAL). A null or empty string means no statement was provided. Display this separately from the main allergen list. |
| Formatted Ingredient List | ingredients_formatted_html |
string |
"Ingredients: <strong>Wheat</strong> flour, sugar, <strong>egg</strong>, <strong>milk</strong> powder." |
Provides a pre-formatted, legally compliant string with allergens already bolded. Ready to render in a web view. This eliminates parsing errors. |
This is what a compliance-first data structure looks like. It is predictable, granular, and removes the burden of legal interpretation from your development team. You are no longer guessing; you are simply mapping fields to your UI.
Beyond the EU: FDA FASTER Act (Sesame), Australia/NZ, and Global Allergen Standards
The world of food regulation is not static. What is compliant today may be incomplete tomorrow. A prime example is the FASTER Act of 2021 in the United States, which officially added sesame to the list of major food allergens, a change that took effect on January 1, 2023.
Australia and New Zealand, governed by the Food Standards Code, have a similar list to the EU but also include other allergens like royal jelly. Canada has its own list of priority allergens.
The point is this: allergen regulations are a moving target. If you are building a global or multi-region application, hard-coding allergen lists or relying on a data provider that only focuses on one region is a recipe for technical debt and compliance risk.
You need a partner whose business is to stay ahead of these changes. When the FASTER Act was passed, NutriGraphAPI’s schema already had a has_sesame field. For our customers, the transition was seamless. For developers using other APIs, it was a scramble to update their code and data processing.
Building on a compliance-focused API is not just about solving today’s problem for the EU. It’s about future-proofing your application against the inevitable evolution of global food law.
Your job is to build a great application. Our job is to handle the Byzantine complexity of food regulation and deliver it to you in a simple, clean, and reliable JSON object.
Stop trying to become a legal expert. Stop building risky parsers for unreliable data. Focus on your product and let the data do the work.
See how NutriGraphAPI mathematically maps to EU allergen requirements at nutrigraphapi.com/docs and pull your Sandbox key.