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.

By Matthias Begot ·

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 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:

EndpointInputAnswer
POST /label/claims/checka proposed wordingis this text authorised, rejected with its official motive, or absent
GET /label/claims/permitteda nutrientthe 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

GET /label/claims/permitted?nutrient=melatonin

The response is a UnifiedResponse whose data.authorised[] carries the register content relayed as published:

{
  "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 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 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), 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)) 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. Readverdict, the authorised wordings, 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 walks the full discover → 402 → pay → replay cycle with runnable snippets. Price and accepted rails are served live by the 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:

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; for how agents discover and call Invoket endpoints, see For agents.