{"id":"allergen-flag","title":"Allergen flags in an ingredient list (EU Annex II, US FALCPA + FASTER Act)","description":"Scans an ingredient list for terms tied to the 14 allergens of EU Regulation 1169/2011 Annex II and the 9 US major food allergens (FALCPA plus sesame under the FASTER Act), for an agent or buyer checking a label or recipe. Returns each matched span with its character offsets, the allergen, the regime that lists it, and whether it sits in a 'may contain' clause. Pass the allergens a label declares to get a fail for any detected but undeclared one. These are flags, not advice: matching is a lexicon of terms quoted from the regulation and FDA guidance, so an absent match does not show an ingredient is free of an allergen. It does NOT judge cross-contact risk, quantities (the EU sulphite threshold of 10 mg/kg), refining exemptions, or compliance of a label.","roi":"Offsets and the regulation behind each flag make an allergen check auditable instead of a model's guess.","audience":"business","package":"compliance-evidence-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/allergen-flag","path":"/api/v1/allergen-flag","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["ingredients"],"properties":{"ingredients":{"type":"string","maxLength":20000,"description":"Ingredient list or label text, at most 20000 characters."},"jurisdictions":{"type":"string","enum":["eu","us","both"],"description":"Which list(s) to apply. Default both. EU adds celery, mustard, lupin, molluscs, sulphites and gluten cereals (rye, barley, oats); the US list has no such entries."},"declared":{"type":"array","items":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"maxItems":15,"description":"Allergen keys the label declares. Any detected, non-precautionary allergen missing from this list fails. For jurisdictions=eu, wheat and gluten-cereal cover each other (one Annex II entry)."},"extraTerms":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string","maxLength":60,"description":"Extra term, at most 6 words."},"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]}},"required":["term","allergen"]},"maxItems":100,"description":"Caller synonyms (for example a brand's own ingredient name), matched as literal words."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"jurisdictions":{"type":"array","items":{"type":"string"}},"tokenCount":{"type":"integer","description":"Words scanned."},"matches":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"term":{"type":"string","description":"The lexicon term matched."},"text":{"type":"string","description":"The matched text as written."},"start":{"type":"integer","description":"UTF-16 offset of the span start."},"end":{"type":"integer","description":"UTF-16 offset of the span end (exclusive)."},"regimes":{"type":"array","items":{"type":"string"}},"kind":{"type":"string","description":"category, example, derivative, synonym, e-number or caller."},"source":{"type":"string","description":"Which source the term comes from."},"precautionary":{"type":"boolean","description":"True when a 'may contain' / 'traces of' / shared-facility phrase precedes it in the same sentence (heuristic phrase list)."}}}},"allergens":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"listedIn":{"type":"array","items":{"type":"string"}},"references":{"type":"object","description":"Per regime: the legal entry that lists this allergen."},"matchCount":{"type":"integer"},"firstOffset":{"type":"integer"},"precautionaryOnly":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"},"description":"Exceptions and caveats quoted from the regulation or FDA guidance for this allergen."}}}},"undeclared":{"type":"array","items":{"type":"string"},"description":"Detected, non-precautionary allergens missing from declared (only when declared is given)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"jurisdictions":{"type":"array","items":{"type":"string"}},"tokenCount":{"type":"integer","description":"Words scanned."},"matches":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"term":{"type":"string","description":"The lexicon term matched."},"text":{"type":"string","description":"The matched text as written."},"start":{"type":"integer","description":"UTF-16 offset of the span start."},"end":{"type":"integer","description":"UTF-16 offset of the span end (exclusive)."},"regimes":{"type":"array","items":{"type":"string"}},"kind":{"type":"string","description":"category, example, derivative, synonym, e-number or caller."},"source":{"type":"string","description":"Which source the term comes from."},"precautionary":{"type":"boolean","description":"True when a 'may contain' / 'traces of' / shared-facility phrase precedes it in the same sentence (heuristic phrase list)."}}}},"allergens":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"listedIn":{"type":"array","items":{"type":"string"}},"references":{"type":"object","description":"Per regime: the legal entry that lists this allergen."},"matchCount":{"type":"integer"},"firstOffset":{"type":"integer"},"precautionaryOnly":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"},"description":"Exceptions and caveats quoted from the regulation or FDA guidance for this allergen."}}}},"undeclared":{"type":"array","items":{"type":"string"},"description":"Detected, non-precautionary allergens missing from declared (only when declared is given)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"ingredients":"Wheat flour, skimmed milk powder, soy lecithin, sesame seeds. May contain nuts.","declared":["wheat","milk"]},"openapiOperation":{"operationId":"allergen_flag","summary":"Allergen flags in an ingredient list (EU Annex II, US FALCPA + FASTER Act)","description":"Scans an ingredient list for terms tied to the 14 allergens of EU Regulation 1169/2011 Annex II and the 9 US major food allergens (FALCPA plus sesame under the FASTER Act), for an agent or buyer checking a label or recipe. Returns each matched span with its character offsets, the allergen, the regime that lists it, and whether it sits in a 'may contain' clause. Pass the allergens a label declares to get a fail for any detected but undeclared one. These are flags, not advice: matching is a lexicon of terms quoted from the regulation and FDA guidance, so an absent match does not show an ingredient is free of an allergen. It does NOT judge cross-contact risk, quantities (the EU sulphite threshold of 10 mg/kg), refining exemptions, or compliance of a label.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"business","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/allergen-flag","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["ingredients"],"properties":{"ingredients":{"type":"string","maxLength":20000,"description":"Ingredient list or label text, at most 20000 characters."},"jurisdictions":{"type":"string","enum":["eu","us","both"],"description":"Which list(s) to apply. Default both. EU adds celery, mustard, lupin, molluscs, sulphites and gluten cereals (rye, barley, oats); the US list has no such entries."},"declared":{"type":"array","items":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"maxItems":15,"description":"Allergen keys the label declares. Any detected, non-precautionary allergen missing from this list fails. For jurisdictions=eu, wheat and gluten-cereal cover each other (one Annex II entry)."},"extraTerms":{"type":"array","items":{"type":"object","properties":{"term":{"type":"string","maxLength":60,"description":"Extra term, at most 6 words."},"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]}},"required":["term","allergen"]},"maxItems":100,"description":"Caller synonyms (for example a brand's own ingredient name), matched as literal words."}}},"example":{"ingredients":"Wheat flour, skimmed milk powder, soy lecithin, sesame seeds. May contain nuts.","declared":["wheat","milk"]}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"jurisdictions":{"type":"array","items":{"type":"string"}},"tokenCount":{"type":"integer","description":"Words scanned."},"matches":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"term":{"type":"string","description":"The lexicon term matched."},"text":{"type":"string","description":"The matched text as written."},"start":{"type":"integer","description":"UTF-16 offset of the span start."},"end":{"type":"integer","description":"UTF-16 offset of the span end (exclusive)."},"regimes":{"type":"array","items":{"type":"string"}},"kind":{"type":"string","description":"category, example, derivative, synonym, e-number or caller."},"source":{"type":"string","description":"Which source the term comes from."},"precautionary":{"type":"boolean","description":"True when a 'may contain' / 'traces of' / shared-facility phrase precedes it in the same sentence (heuristic phrase list)."}}}},"allergens":{"type":"array","items":{"type":"object","properties":{"allergen":{"type":"string","enum":["milk","egg","fish","crustacean","mollusc","peanut","tree-nut","wheat","gluten-cereal","soy","sesame","celery","mustard","lupin","sulphites"]},"listedIn":{"type":"array","items":{"type":"string"}},"references":{"type":"object","description":"Per regime: the legal entry that lists this allergen."},"matchCount":{"type":"integer"},"firstOffset":{"type":"integer"},"precautionaryOnly":{"type":"boolean"},"notes":{"type":"array","items":{"type":"string"},"description":"Exceptions and caveats quoted from the regulation or FDA guidance for this allergen."}}}},"undeclared":{"type":"array","items":{"type":"string"},"description":"Detected, non-precautionary allergens missing from declared (only when declared is given)."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/allergen-flag/","docsJson":"https://agents.writerslogic.com/docs/allergen-flag.json","sample":"https://agents.writerslogic.com/api/v1/samples/allergen-flag","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}