# Which health claims may you write on an EU label? > An agent drafting a label needs the claims it is allowed to write, not a plausible sentence. One offline call returns the authorised wordings for a nutrient, their conditions of use, and the EFSA opinion behind each. Published 2026-08-10 · HTML version: https://invoket.com/blog/which-health-claims-may-you-write-on-an-eu-label --- Under **Regulation (EC) No 1924/2006**, a health claim is prohibited unless it has been authorised and entered in the EU lists. That inverts the usual generation problem: an agent drafting packaging copy is not free to write a sentence and hope it survives review — it has to start from the set of sentences that already exist. [`GET /label/claims/permitted`](/docs/api/label-claims-permitted) returns that set for a nutrient or substance: every authorised claim as published, with its conditions of use as written and the referenced EFSA opinion, served from a local snapshot with no network call and no secret at request time. ## One register, read from two directions The EU Register of nutrition and health claims lists, in the Commission's own description, "permitted nutrition claims and their conditions of use", "authorised health claims, their conditions of use and applicable restrictions" and "non-authorised health claims and the reasons for their non-authorisation". Invoket exposes that single dated register through two routes, and the choice between them is the choice of direction: | Endpoint | Input | Answer | |---|---|---| | [`POST /label/claims/check`](/docs/api/label-claims-check) | a proposed **wording** | is this text authorised, rejected with its official motive, or absent | | [`GET /label/claims/permitted`](/docs/api/label-claims-permitted) | a **nutrient** | the claims you **may** write, verbatim | `check` is the review direction — it audits a string a human or a model already produced. `permitted` is the drafting direction, and it is the one that matters when the agent is the author. A verification step placed after a generation step can only reject; it cannot supply the correct wording. ## Why generation is the dangerous direction Article 10(1) of the Regulation is categorical: "Health claims shall be prohibited unless they comply with the general requirements in Chapter II and the specific requirements in this Chapter and are authorised in accordance with this Regulation and included in the lists of authorised claims provided for in Articles 13 and 14." A language model asked for a health claim about a nutrient will produce fluent, scientific-sounding text. The failure mode is not nonsense — it is a sentence that reads exactly like an authorised claim and is not one. The register is where the difference lives, and it is not inferable from the biology: it records which effects were assessed by EFSA, which were accepted, and under precisely which conditions. ## What one lookup returns ```http GET /label/claims/permitted?nutrient=melatonin ``` The response is a `UnifiedResponse` whose `data.authorised[]` carries the register content relayed as published: ```json { "nutrient": "melatonin", "verdict": "found", "authorised": [ { "code": "POL-HC-6418", "type": "Art. 13.1", "status": "authorised", "nutrient": "Melatonin", "wording": "Melatonin contributes to the alleviation of subjective feelings of jet lag", "conditions_of_use": "The claim may be used only for food which contains at least 0,5 mg of melatonin per quantified portion. ...", "efsa": { "question": "2010;8(2):1467", "url": "..." } }, { "code": "POL-HC-6419", "type": "Art. 13.1", "status": "authorised", "wording": "Melatonin contributes to the reduction of time taken to fall asleep", "conditions_of_use": "The claim may be used only for food which contains 1 mg of melatonin per quantified portion. ..." } ], "non_authorised_count": 1 } ``` Two authorised claims about the same substance, two different thresholds — 0,5 mg per quantified portion for the jet-lag claim, 1 mg for the falling-asleep claim. Neither is "melatonin helps you sleep". A drafting agent that keeps only the `wording` field and drops `conditions_of_use` has kept the half of the authorisation that cannot be complied with on its own. ### The conditions of use are part of the claim The pattern repeats across nutrients, and the conditions are where the product formulation actually gets decided: - **Vitamin C** — most of its authorised claims are gated on the food being *at least a source of vitamin C* as defined in the Annex to Regulation (EC) No 1924/2006. The claim points back at a nutrition claim threshold. - **Creatine** — "Creatine increases physical performance in successive bursts of short-term, high intensity exercise" requires a daily intake of 3 g *and* carries a separate restriction limiting it to foods targeting adults performing high intensity exercise. - Entries also record which route authorised them (`type`), for instance `Art. 13.1` for generally accepted function claims versus `Art. 13.5` for claims authorised on newly developed scientific evidence — a distinction that matters because some authorisations are subject to proprietary data protection. Each entry carries the referenced EFSA opinion, so the scientific basis is one link away rather than something the agent has to assert. ### Rewording is allowed; inventing is not The published wording is not a magic string that must be copied character for character. Recital 9 of [Commission Regulation (EU) No 432/2012](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32012R0432) allows flexibility: where a wording has *the same meaning for the consumer* as a permitted claim, because it expresses the same relationship between the food or its constituent and health, it may be used — subject to the same conditions of use. That is a permission to rephrase a claim that exists, not a permission to compose one. Which is precisely why the drafting order should be: fetch the authorised claims, pick one, adapt the register wording if needed, keep the conditions of use attached — and, if the final label text drifted, [`check`](/docs/api/label-claims-check) it before shipping. ## Three verdicts, all billed 200s The x402 golden rule is that the agent pays for the answer to its question, and "which claims are authorised for this nutrient?" is a well-formed question whatever the answer's length: - **`found`** — at least one authorised claim. - **`none_authorised`** — the nutrient is in the register, and every claim filed for it was refused. `authorised` is empty and `non_authorised_count` is positive: the emptiness is accounted for, not a silence. - **`unknown_nutrient`** — the nutrient is not in the register at all. `authorised` is empty, `non_authorised_count` is `0`, and a note states the limit explicitly. `non_authorised_count` exists to keep the two empty lists apart. Isomaltulose returns `none_authorised` with a count of 1 — a known substance whose claim was rejected, and `check` will return that rejection with its official motive. Nothing here is a 404; only a missing or empty `nutrient` parameter leaves the 200 range, and that is not billed. ## Absent from the register is not a prohibition This is the honesty line of the endpoint, and it is why `unknown_nutrient` carries a note rather than an empty body. Around 2,000 health claims on botanicals have sat "on hold" since 2012 — neither authorised nor rejected — used under the transitional measures of Articles 28(5) and 28(6) of the Regulation. They are not in the register. Their absence is a state of the procedure, not a verdict. That regime is contested, and an agent should not be the one to resolve it: - In **Case C-386/23, *Novel Nutriology*** (judgment of 30 April 2025, [ECLI:EU:C:2025:304](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=celex%3A62023CJ0386)), the Court of Justice read the transitional regime restrictively, holding that the Article 10(1) prohibition is not lifted by the Commission's own delay in assessing botanical claims. - The European Parliament's January 2024 implementation report on the Regulation ([2023/2081(INI)](https://oeil.europarl.europa.eu/oeil/en/document-summary?id=1772507)) flagged that continued use of "on-hold" claims under the transitional measures could mislead consumers, who may assume the claims were scientifically assessed. So the endpoint reports what the register says and stops there. It returns authorised claims as published; it does not decide what a specific label should say, and it is not legal advice. An `unknown_nutrient` verdict on a botanical is a signal to route the decision to a human, with the dated register state attached to the ticket. ## Where it sits in the x402 loop No account, no key, no onboarding call: 1. **Discover** the endpoint in the live catalog, call it, receive the `402` challenge. 2. **Pay** — sign the chosen rail and replay the request. 3. **Read** — `verdict`, the authorised `wording`s, their `conditions_of_use`, the EFSA references, and `provenance.freshness.as_of` dating the register extraction that answered. 4. **Branch** — draft from an authorised wording, escalate an `unknown_nutrient`, or drop a claim whose conditions the product cannot meet. The [Quickstart](/docs/quickstart) walks the full discover → `402` → pay → replay cycle with runnable snippets. Price and accepted rails are served live by the [catalog](https://api.invoket.com/catalog), never pinned in an article. Answers come from a snapshot of the register, dated by the extraction served rather than by ingestion time. A missed refresh keeps serving the last good snapshot with `as_of` telling the truth about it — staleness is never turned into a 5xx. ## Chain it with the rest of the label family A compliant pack is several dated registers read at once, and the same discipline — verbatim, dated, sourced — applies to each: - [`POST /label/claims/check`](/docs/api/label-claims-check) — the review direction on the same register, with the official rejection reason when a wording is refused. - [`GET /label/food/additive`](/docs/api/label-food-additive) — whether an additive is authorised *in a given food category*, at what level. - [`GET /label/cosmetic/ingredient`](/docs/api/label-cosmetic-ingredient) — annex status and restrictions under Regulation (EC) No 1223/2009. - [`GET /label/chem/classify`](/docs/api/label-chem-classify) — harmonised CLP classification, versioned by ATP. Used for what it is — a dated, verbatim reading of the authorised side of the EU Register — `/label/claims/permitted` gives a drafting agent the sentences it is allowed to write, before a pack goes to print. For the full field reference and error codes, see the [`GET /label/claims/permitted` documentation](/docs/api/label-claims-permitted); for how agents discover and call Invoket endpoints, see [For agents](/docs/for-agents).