FOR DEVELOPERS

Don't let your agent guess.

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.

MCP + RESTfree key · 100 checks/monthevidence standard v1.0
Get a free keySign inEmail only, there is no password to choose. 100 checks a month included.

This is a claims problem, not a data problem.

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.

Insurers have started writing AI out of standard cover.

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.

Quickstart

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/month

The tools

Three checks and one door in. Everything else on the page is WebMCP, listed in the tools dialog.

ToolTakesReturns
check_itema UPC, or a dish name plus a venue id, with restrictions, thresholds, or bothone verdict with evidence, source and date
check_venuea venue id, or a menu payload from another MCPa verdict per item, plus venue coverage on both axes
check_planup to 25 subjects in one call, a recipe, a basket, a weekone verdict per item, one call
registeran agent name and a contact emaila free-tier key in the response body. Agent self-signup, no browser and no confirmation click.
check_item
Takes
a UPC, or a dish name plus a venue id, with restrictions, thresholds, or both
Returns
one verdict with evidence, source and date
check_venue
Takes
a venue id, or a menu payload from another MCP
Returns
a verdict per item, plus venue coverage on both axes
check_plan
Takes
up to 25 subjects in one call, a recipe, a basket, a week
Returns
one verdict per item, one call
register
Takes
an agent name and a contact email
Returns
a free-tier key in the response body. Agent self-signup, no browser and no confirmation click.

The verdict object

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
}
These names are canon. Do not vary them.

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.

Two of the four answers are not answers.

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.

ask one question

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.

couldn't verify

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.

fail closed, by construction

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.

We publish the share we decline, and we do not work to bring it down.

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.

How to render this correctly

Not style guidance. A summary is where a verdict is most likely to be lost, and these are the ways it gets lost.

RuleWhy
Pass verdicts through unchangedA 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 itemsIf your summary does not mention them, it is wrong. These are the items a person needs to act on.
Always show the dateA verdict is a statement about a date. Undated, it is worth nothing.
Render summary_line verbatim where you canIt is canonical, and it is counts rather than judgement.
Pass verdicts through unchanged
Why
A model summarising four verdicts tends to collapse them into two. The casualty is always “couldn’t verify”.
Never render any verdict as “safe”
Why
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
Why
If your summary does not mention them, it is wrong. These are the items a person needs to act on.
Always show the date
Why
A verdict is a statement about a date. Undated, it is worth nothing.
Render summary_line verbatim where you can
Why
It is canonical, and it is counts rather than judgement.
Prefer the rendered card to the string.

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.

Limits and tiers

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.

TierLimitAvailabilityWhat you get
Open · free100 / month · unrestricted until 21 Seplive nowAll four verdicts with sources and dates. Free key required for direct access. Attribution required.
Indie · $2910,000 / monthopens 22 SepCommercial use.
Build · $9950,000 / monthopens 22 SepUptime SLA, 30-day audit log.
Team · $399250,000 / monthopens 22 SepFull SLA, 12-month audit log, the Checked by KnownGate mark.
Verified · $1,500high volumewaitlistEvidence-gap reporting, priority, multiple products.
Assured · $6,000high volumewaitlistEvidence-gap escalation with commitments, named incident response, jurisdiction scoping.
Open · free
Limit
100 / month · unrestricted until 21 Sep
Availability
live now
What you get
All four verdicts with sources and dates. Free key required for direct access. Attribution required.
Indie · $29
Limit
10,000 / month
Availability
opens 22 Sep
What you get
Commercial use.
Build · $99
Limit
50,000 / month
Availability
opens 22 Sep
What you get
Uptime SLA, 30-day audit log.
Team · $399
Limit
250,000 / month
Availability
opens 22 Sep
What you get
Full SLA, 12-month audit log, the Checked by KnownGate mark.
Verified · $1,500
Limit
high volume
Availability
waitlist
What you get
Evidence-gap reporting, priority, multiple products.
Assured · $6,000
Limit
high volume
Availability
waitlist
What you get
Evidence-gap escalation with commitments, named incident response, jurisdiction scoping.

Audit us before you rely on us.

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.

Evidence standard v1.0

What counts as proof for each kind of premise, which source kinds can produce a clear, and what never counts. Versioned and dated.

The question library

Every Q-PREP and Q-SERV code, its template, and the rule for what counts as a sufficient answer.

Live refusal telemetry

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.

In August we found 63,601 rows in our own corpus reading “may contain” as “contains”.

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.

What we do not offer yet

Not yetWhat that means
No guarantee, on any tierYou 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 SDKsMCP and REST only. Client libraries when there is enough surface to warrant them.
No uptime historyWe launched on 30 August 2026. There is nothing to show yet, so we show nothing.
No numeric premise outside betaThresholds are live in beta against 446,371 rulable panels. Treat the coverage as growing rather than complete.
No guarantee, on any tier
What that means
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
What that means
MCP and REST only. Client libraries when there is enough surface to warrant them.
No uptime history
What that means
We launched on 30 August 2026. There is nothing to show yet, so we show nothing.
No numeric premise outside beta
What that means
Thresholds are live in beta against 446,371 rulable panels. Treat the coverage as growing rather than complete.
Get a free keyEvidence standard v1.0Report an error

Route the answer. Don’t generate it.

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.