What must not be present. The FDA-9 keys, plus any other name you send. In-group specifics are recorded, never silently widened.
"restrictions": [ "peanut", "sesame" ]
A premise has two parts and you may send either, or both, in the same call.
What must not be present. The FDA-9 keys, plus any other name you send. In-group specifics are recorded, never silently widened.
"restrictions": [ "peanut", "sesame" ]
What must stay under, or over, a number. Stated per serving, with the unit and the basis explicit.
"thresholds": [
{ "nutrient": "added_sugar",
"max": 2, "unit": "g",
"basis": "per_serving" }
]Pick by where your agent already lives. The engine, the verdicts and the evidence rules are identical across all three.
If you are rendering this page, the tools are already in your model context. Nothing to install and no key.
get_premise set_restrictions load_subject check_item check_venue check_plan get_result answer_question save_record
Use when: a person is watching, and you want them to see the premise before the answer.
A hosted server. Five lines of config and your agent never opens a browser.
mcp.knowngate.com check_item check_venue check_plan register
A free key is required; your agent creates one with the register tool, without leaving MCP.
Use when: your agent runs tool-only, in Claude Desktop, Cursor or any MCP client.
Two check endpoints and the public stats feed.
POST /v0/check_item POST /v0/check_venue POST /v0/check_plan GET /v0/stats POST /v0/keys
Use when: you are not on MCP, or you are calling from a server you control.
A real product against a real premise. One conflict and one refusal come back in the same response, each with the source it rests on and the date that source was read.
POST /v0/check_item
Authorization: Bearer kg_live_••••
{
"subject": { "upc": "0 51500 25551 8" },
"restrictions": [],
"thresholds": [
{ "nutrient": "added_sugar", "max": 2,
"unit": "g", "basis": "per_serving" },
{ "nutrient": "trans_fat", "max": 0,
"unit": "g", "basis": "per_serving" }
]
}{
"subject": "Jif Creamy Peanut Butter",
"verdict": "conflict_found",
"threshold_hits": [
{ "nutrient": "added_sugar", "found": 3,
"max": 2, "unit": "g",
"basis": "per_serving",
"verdict": "conflict_found" },
{ "nutrient": "trans_fat", "found": null,
"max": 0, "unit": "g",
"verdict": "couldnt_verify",
"reason": "panel_declares_zero_under_rounding" }
],
"source": { "kind": "nutrition_panel",
"read_at": "2026-08-14" },
"summary_line": "1 ruled · 0 no conflict · 1 conflict",
"must_not_omit": [ "trans_fat, couldn’t verify" ]
}The panel declares zero. US rounding rules permit anything below half a gram per serving to be declared as zero, so a panel reading zero does not establish that the value is zero. The gate will not clear a threshold of zero against a figure that cannot distinguish zero from almost zero. It says couldn't verify and tells you why.
Four values, and only four. They are never free text, and two of them are not answers.
no_conflict_foundEverything the premise asked about was covered by a source at ceiling, and nothing conflicted.conflict_foundA restriction is present, or a threshold is exceeded. Named, sourced and dated.ask_one_questionOne thing is missing and can be closed. The question and its sufficient-answer rule are in the response.couldnt_verifyThe gap cannot be closed by any question that exists. This is a finding. Give it somewhere to go in your interface.Fail closed is the construction, not a setting. There is no flag that makes this more permissive.
An advisory line is a declared possibility. It cannot produce no_conflict_found for the allergen it names.
The word is not a valid rendering of any of the four values. Do not introduce it in your own copy.
If your agent can make an HTTP request it can sign itself up. There is no confirmation click in the way, because a verification wall is the human login wearing a costume.
FOR AGENTS
The email is for contact and recovery. It is not a wall you have to clear before the key works.
POST /v0/keys
{
"agent_name": "cardia-meal-agent",
"contact_email": "team@cardia.app"
}201 Created
{
"key": "kg_live_••••",
"tier": "open",
"included_per_month": 100,
"created_by": "agent"
}On MCP already? Call the register tool and skip the HTTP entirely.
One key per email, rate limited per IP, and every key starts on the free tier. Upgrades are where a human and a payment method come in.
FOR HUMANS
Create and manage keys, see usage by tool and by premise type, and revoke anything you no longer want live.
Go to /developersIf your agent made a key first, sign in with the same email and it will be waiting for you. The agent signs up, the human claims the account afterwards.
Nothing on knowngate.com itself needs a key. The workspace, the record pages and the published standard are all open.
Pulled from /stats. Zero is a true number and this page is built to show it.
See the refusal rateEvery saved record is a dated page anyone can re-check without an account.
See a sample recordThe evidence standard, versioned and public, including what never counts.
Read the standard