THE ASSUMPTION
“I need better data.”Every provider in this category sells rows, and the floor is a free government dataset. Buying more rows moves the ceiling on coverage. It does not move the authorship of the sentence.
FOR DEVELOPERS
Every food answer your product gives is a sentence your company said. It will sound exactly as confident when it is wrong. This page covers why that is a claims problem rather than a data problem, what one call returns, what happens when nothing can be verified, how to render a verdict without losing it, and what you can audit before you rely on any of it.

Most teams arrive comparing food databases on breadth and price per row. That comparison answers the wrong question, because rows do not tell you whether the evidence behind them was good enough to answer with.
THE ASSUMPTION
“I need better data.”Every provider in this category sells rows, and the floor is a free government dataset. Buying more rows moves the ceiling on coverage. It does not move the authorship of the sentence.
WHAT ACTUALLY SHIPS
A boolean, wrapped in prose.A flag comes back with no provenance and no date. Your model writes a fluent sentence around it. That sentence is now yours, and there is nothing behind it to point at.
WHAT A VERDICT CHANGES
You quote a finding.The answer arrives with the source it rests on and the date that source was read. You are passing on a determination rather than making a claim of your own.
Exclusions are appearing across general liability, errors and omissions, and directors and officers lines. What gets re-admitted is exposure with a named, documented control behind it. We are not offering you an undertaking, and there is none on any tier. We are offering you something you can name.
Hosted MCP server, WebMCP, or REST, same engine. An agent with no browser integrates in five lines. Restrictions and thresholds travel with every call; the gate is stateless.
// MCP, the key travels in the server config
{ "mcpServers": { "knowngate": {
"url": "https://mcp.knowngate.com",
"headers": { "Authorization": "Bearer kg_live_…" }
} } }
// or REST, absence and threshold in one call
curl https://www.knowngate.com/api/knowngate/v0/check_item \
-H "Authorization: Bearer kg_live_…" \
-d '{"subject":{"upc":"0 78742 11934 6"},
"restrictions":["peanut","sesame"],
"thresholds":[{"nutrient":"sodium","max":600,
"unit":"mg","basis":"per_serving"}]}'
// no key yet? knowngate.com/signup, free, 100 checks/monthThree checks and one door in. Everything else on the page is WebMCP, listed in the tools dialog.
| Tool | Takes | Returns |
|---|---|---|
| check_item | a UPC, or a dish name plus a venue id, with restrictions, thresholds, or both | one verdict with evidence, source and date |
| check_venue | a venue id, or a menu payload from another MCP | a verdict per item, plus venue coverage on both axes |
| check_plan | up to 25 subjects in one call, a recipe, a basket, a week | one verdict per item, one call |
| register | an agent name and a contact email | a free-tier key in the response body. Agent self-signup, no browser and no confirmation click. |
Fields, never prose. Nothing is written by a model at request time, your UI renders these. The thresholds input is optional; send it, and numeric limits are ruled alongside the absence premise in the same call.
// REQUEST, restrictions travel with every call
{
"subject": { "upc": "0 78742 11934 6" },
"restrictions": ["peanut", "sesame"],
"thresholds": [ // optional, the numeric premise
{ "nutrient": "sodium", "max": 600, "unit": "mg", "basis": "per_serving" }
]
}
// RESPONSE, fields, never prose
{
"verdict": "conflict_found", // one of four, never free text
"allergen_hits": [],
"threshold_hits": [
{ "nutrient": "sodium", "found": 890, "unit": "mg", "basis": "per_serving", "max": 600 }
],
"axes": { "composition": "covered", "preparation": "covered" },
"source": { "kind": "nutrition_panel", "read_at": "2026-08-14" },
"question": null,
"summary_line": "1 ruled · 0 no conflict · 1 conflict",
"must_not_omit": [],
"certificate_url": null // set only after save_record
}Axis values are covered and not_covered. The save call is save_record and the field it populates is certificate_url. Question codes are the 16 defined in the question library. A threshold is ruled on the panel alone, the preparation axis does not apply to a numeric premise.
Ask one question and couldn't verify are what make the other two worth anything. A checker that clears everything is indistinguishable from no checker at all, and your users will work that out faster than you would like.
One axis is covered and the other is reachable. You get the literal question to put to a kitchen or read off a pack, plus the rule for what counts as a sufficient answer, so a half answer is detectable in your own code.
The gap cannot be closed by any question that exists. A deli soup has no panel and never will. This is a finding, not an error state, and it needs somewhere to go in your interface.
Unknown counts as no. It is not a setting, a confidence threshold or a strictness slider, because a checker whose rigour can be tuned has none. There is no flag that makes this more permissive.
The easy way to improve that number is to clear things on thinner evidence, which would make the figure look better and every verdict worth less. If it ever drops sharply without coverage rising, something is wrong and you should tell us.
Not style guidance. A summary is where a verdict is most likely to be lost, and these are the ways it gets lost.
| Rule | Why |
|---|---|
| Pass verdicts through unchanged | A model summarising four verdicts tends to collapse them into two. The casualty is always “couldn’t verify”. |
| Never render any verdict as “safe” | The word is not used anywhere in this system and is not a valid rendering of any of the four. |
| Never drop must_not_omit items | If your summary does not mention them, it is wrong. These are the items a person needs to act on. |
| Always show the date | A verdict is a statement about a date. Undated, it is worth nothing. |
| Render summary_line verbatim where you can | It is canonical, and it is counts rather than judgement. |
Where your surface supports it, render the returned component rather than handing the model text to reword. That removes paraphrase drift entirely, summary_line is the fallback for surfaces that cannot.
Free and unrestricted through 21 Sep 2026 while the WebMCP Challenge runs. A free key is required for direct API and MCP access. Paid tiers open 22 Sep.
| Tier | Limit | Availability | What you get |
|---|---|---|---|
| Open · free | 100 / month · unrestricted until 21 Sep | live now | All four verdicts with sources and dates. Free key required for direct access. Attribution required. |
| Indie · $29 | 10,000 / month | opens 22 Sep | Commercial use. |
| Build · $99 | 50,000 / month | opens 22 Sep | Uptime SLA, 30-day audit log. |
| Team · $399 | 250,000 / month | opens 22 Sep | Full SLA, 12-month audit log, the Checked by KnownGate mark. |
| Verified · $1,500 | high volume | waitlist | Evidence-gap reporting, priority, multiple products. |
| Assured · $6,000 | high volume | waitlist | Evidence-gap escalation with commitments, named incident response, jurisdiction scoping. |
Everything that governs a verdict is published, including the parts that do not flatter us. You should read them before you put this in front of a user.
What counts as proof for each kind of premise, which source kinds can produce a clear, and what never counts. Versioned and dated.
Every Q-PREP and Q-SERV code, its template, and the rule for what counts as a sufficient answer.
The share we decline, updated daily, with the named cause of every refusal. Zero is a true number and the page is built to show it.
We fixed the reading, re-derived every affected row, and published the correction on the refusals page. We would rather you heard it from us, and it is a reasonable thing to hold us to.
| Not yet | What that means |
|---|---|
| No guarantee, on any tier | You get verdicts with their sources and dates. You do not get an undertaking from us, and nothing here should be presented to your users as one. |
| No SDKs | MCP and REST only. Client libraries when there is enough surface to warrant them. |
| No uptime history | We launched on 30 August 2026. There is nothing to show yet, so we show nothing. |
| No numeric premise outside beta | Thresholds are live in beta against 446,371 rulable panels. Treat the coverage as growing rather than complete. |
One call returns a determination with its source and its date, for what must be absent and for what must stay under a number. When nothing can be verified it says so, and that refusal is the reason the clears are worth anything. The rules are published, the refusal rate is published, and our own mistakes are published. Nothing here is promised that does not already exist.