Tested by TNT Review — record TNT-TEST-2026-10-04-001, 4 October 2026. We validated this workflow against n8n’s node catalogue and executed the checking logic against a live page. Exactly what we did and did not test is set out in Verification.
The problem
You wire a model into n8n, ask it to pull a price or a feature list off a vendor page, and route the answer straight into a document, a spreadsheet or a published post. Most of the time it is right. Occasionally it returns a number that was never on the page, phrased with exactly the same confidence as the numbers that were.
That is the dangerous failure. A workflow that breaks loudly gets fixed. A workflow that quietly invents a student discount that does not exist keeps running, and the wrong figure travels downstream into something a person reads and believes.
Asking the model to “only use information from the page” does not fix it. Lowering the temperature does not fix it. Neither is a check; both are requests, and the output looks identical whether the request was honoured or not.
Expected outcome
By the end of this article you will have a node chain in n8n that does one thing: it refuses to pass on any claim it cannot find on the source page. Claims that survive carry their evidence with them. Claims that do not are marked UNSUPPORTED, their values are discarded, and the workflow branches to a hold instead of continuing.
You can confirm it works before you trust it, because the download includes a script that runs the same check outside n8n against any page you choose.
Requirements and costs
- n8n — self-hosted or cloud. The workflow uses only core nodes: Manual Trigger, Set, HTTP Request, Code and If.
- Node 18 or newer — only if you want to run the reproduction script outside n8n.
- Cost: free. No API keys, no credentials, no paid service. The check itself never calls a model — it only reads the page your model claimed to be reading.
How the check works
The idea is small enough to state in one sentence: make the model quote the page, then check the quote.
Instead of asking for a value, you ask for two things — the value, and a verbatim_support snippet the model says it copied from the page. The snippet is the part that can be checked mechanically. If the model invented the value, it has to invent a snippet to go with it, and that snippet will not be on the page.
So the model’s job becomes falsifiable. It is no longer “please be accurate”; it is “show me where you got that”, answered in a form a string search can audit.
Step-by-step implementation
- Import the workflow. In n8n, open Workflows → Import from File and select
tnt-verbatim-support-check.jsonfrom the download below. - Point the Claims To Check node at your own model step. The imported version carries two sample claims so you can see both outcomes immediately. Replace them with the output of whatever model node you already use. Each claim needs three fields:
field,valueandverbatim_support. - Ask your model for the snippet. In your prompt, require it explicitly: for every field, return a verbatim_support string copied exactly from the page; if the page does not state the field, return null rather than a guess. This instruction is what makes the whole thing work, and it is the step people skip.
- Set the source URL. The HTTP Request node fetches whatever
source_urlyou set. It retries once and continues on error, so a timeout is reported as an unreadable page rather than silently behaving like a page with no matches. - Wire the two branches. Hold For Review is the branch that fires when anything failed verification — connect it wherever your workflow would otherwise have published or written. Proceed With Verified Facts carries only the claims that survived.
The verification itself lives in one Code node. It strips the HTML to text, normalises whitespace and case, and then does a literal substring search for each snippet. There is deliberately no fuzzy matching: “close enough” is precisely how an invented figure survives a check like this.
A real example
The download runs against a live page with two claims: one a model could only make by actually reading the page, and one it could only make by inventing it.
$ node verify-workflow.js
{
"source_url": "https://n8n.io/pricing/",
"http_status": 200,
"page_readable": true,
"page_chars": 17279,
"checked": 2,
"verified": 1,
"unsupported": 1,
"results": [
{ "field": "page_names_its_own_product", "status": "VERIFIED", "value": "the page is about n8n" },
{ "field": "invented_student_discount", "status": "UNSUPPORTED", "value": null }
]
}
DEMO EXPECTATION: real claim VERIFIED, invented claim UNSUPPORTED
DEMO RESULT: PASS
Note what happened to the invented claim: its status changed and its value became null. The workflow does not pass along a figure it could not evidence, even flagged. A flagged wrong number still gets copied into something eventually.
Verification and troubleshooting
What we tested, on 4 October 2026 (record TNT-TEST-2026-10-04-001):
- The workflow imports cleanly. We validated the JSON against n8n’s node catalogue. The first version failed with two errors — the If node was missing
conditions.options.leftValueandtypeValidation. We fixed those and revalidated: 0 errors. That is why you are downloading version two. - The logic does what it claims. The reproduction script lifts the code straight out of the Code node and runs it unchanged against a live fetch of the n8n pricing page. Real claim verified, invented claim rejected, exit code 0.
What we did not test: the whole workflow running end to end inside an n8n instance against your model, and nothing on the source page is endorsed by us — the page is only the thing being quoted.
Troubleshooting:
- Everything comes back UNSUPPORTED. Check
page_chars. If it is 0 the page was not readable — often a site that returns JavaScript rather than HTML to a plain request. The check cannot see text the browser would have rendered later. - A claim you know is true fails. The snippet probably spans an element boundary, or contains a character the page writes differently (a non-breaking hyphen, a different currency symbol). Shorten the snippet to the shortest distinctive fragment.
- Everything passes, including nonsense. Your snippets are too short. A one-word snippet like “the” matches any page. Require a distinctive phrase.
Limitations and alternatives
This is a check on quoting, not on reasoning. A model can quote a real sentence and still draw a wrong conclusion from it, and this workflow will happily pass that through. It catches fabricated specifics — prices, limits, feature names, dates — which is the failure that does the most damage downstream, but it is not a general correctness oracle.
It also cannot read pages that render their content in the browser. For those you need a rendering fetch step, which costs either a browser service or a heavier self-hosted setup.
The alternatives worth knowing: a second model grading the first is popular but expensive and fails in correlated ways; structured output alone constrains the shape of an answer but says nothing about its truth. A literal string check is cruder than both and is the only one of the three that cannot itself hallucinate.
Free resources
The download contains the importable workflow, the reproduction script and a README. No sign-up, no email required.
Download the verbatim support check (ZIP, 5 KB)
Is there a paid version?
Not yet, and we would rather say so than imply one. The free article above is the whole method — nothing has been held back to sell you.
If we do build a paid kit later it would be the things that genuinely take extra work to produce: a rendering fetch variant for JavaScript-heavy pages, a conflict resolver for when two sources disagree, sample claim sets to test against, and documented failure cases. TNT Review has sold nothing to date and has no checkout, so treat any price you see us discuss as a hypothesis we have not tested.