Use before citing a page, sharing links or installing a suggested package. Signed receipts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Judges one page URL against its site's robots.txt for GPTBot, ClaudeBot, PerplexityBot, Google-Extended and CCBot: allowed or not, with the deciding line, the per-crawler reason and Crawl-delay; plus the site's Sitemap URLs, content_signal and llms_txt (whether /llms.txt is served). US$0.002 per call; POST url. Costs US$0.002 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/llms.txt
The http(s) page URL to judge (max 2,048 characters). Only its site's /robots.txt and /llms.txt are read; the page is not fetched.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Judges one page URL against its site's robots.txt for GPTBot, ClaudeBot, PerplexityBot, Google-Extended and CCBot: allowed or not, with the deciding line, the per-crawler reason and Crawl-delay; plus the site's Sitemap URLs, content_signal and llms_txt (whether /llms.txt is served). US$0.002 per call; POST url. Costs US$0.002 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/llms.txt
| Argument | Type | Description |
|---|---|---|
| url* | string | The http(s) page URL to judge (max 2,048 characters). Only its site's /robots.txt and /llms.txt are read; the page is not fetched. |
{
"type": "object",
"examples": [
{
"url": "https://www.iana.org/help/example-domains"
}
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The http(s) page URL to judge (max 2,048 characters). Only its site's /robots.txt and /llms.txt are read; the page is not fetched."
}
},
"additionalProperties": false
}Signs a timestamped receipt for a file's sha256, proving it existed unchanged then. US$0.002 per call; POST the hash. Costs US$0.002 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/attest
| Argument | Type | Description |
|---|---|---|
| note | string | Optional note; only its SHA-256 goes in the receipt. |
| sha256* | string | SHA-256 (hex) of the thing being attested. |
| idempotency_key | string | Optional, x402 payments only (keys are scoped to the paying address; trial and L402 calls get 400). Retries with the same key and sha256 get the same attestation (the receipt names that call own payment tx); a different sha256 gets 409. |
{
"type": "object",
"examples": [
{
"note": "example note: replace me",
"sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
}
],
"required": [
"sha256"
],
"properties": {
"note": {
"type": "string",
"maxLength": 280,
"description": "Optional note; only its SHA-256 goes in the receipt."
},
"sha256": {
"type": "string",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "SHA-256 (hex) of the thing being attested."
},
"idempotency_key": {
"type": "string",
"maxLength": 128,
"description": "Optional, x402 payments only (keys are scoped to the paying address; trial and L402 calls get 400). Retries with the same key and sha256 get the same attestation (the receipt names that call own payment tx); a different sha256 gets 409."
}
},
"additionalProperties": false
}Checks up to 10 URLs: ok, broken, moved or unknown for each, with final URL and title. US$0.005 per call; POST URLs. Costs US$0.005 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/check-links
| Argument | Type | Description |
|---|---|---|
| urls* | array | 1 to 10 items, each an http(s) URL string or { "url", "expected_text" }. Dead domains are reported as results; if none resolves, 422 and no charge. |
{
"type": "object",
"examples": [
{
"urls": [
"https://www.iana.org/help/example-domains",
"https://www.iana.org/domains/reserved"
]
}
],
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"minLength": 1
},
"expected_text": {
"type": "string",
"description": "Optional text the page should contain (fuzzy match). Reported as expected_text.match; it does not change the link verdict."
}
},
"additionalProperties": false
}
]
},
"maxItems": 10,
"minItems": 1,
"description": "1 to 10 items, each an http(s) URL string or { \"url\", \"expected_text\" }. Dead domains are reported as results; if none resolves, 422 and no charge."
}
},
"additionalProperties": false
}Checks up to 10 npm, PyPI or crates names: listed, version, licence, OSV.dev advisories. US$0.005 per call; POST names. Costs US$0.005 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/check-packages
| Argument | Type | Description |
|---|---|---|
| packages* | array | 1 to 10 packages to look up. Each is { ecosystem, name, version? }; ecosystem is npm, pypi or crates. |
{
"type": "object",
"examples": [
{
"packages": [
{
"name": "left-pad",
"ecosystem": "npm"
},
{
"name": "requests",
"ecosystem": "pypi"
},
{
"name": "serde",
"ecosystem": "crates"
}
]
}
],
"required": [
"packages"
],
"properties": {
"packages": {
"type": "array",
"items": {
"type": "object",
"required": [
"ecosystem",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Package name as you would install it (npm names may be scoped: @scope/name)."
},
"version": {
"type": "string",
"maxLength": 64,
"description": "Optional: the version you will install (e.g. a pinned 4.17.20). Advisories are then listed for this version; without it, for the latest."
},
"ecosystem": {
"enum": [
"npm",
"pypi",
"crates"
],
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "1 to 10 packages to look up. Each is { ecosystem, name, version? }; ecosystem is npm, pypi or crates."
}
},
"additionalProperties": false
}Returns a web page as clean text, with title, hashes and a signed receipt. US$0.002 per URL; POST up to 10 URLs. Costs US$0.002 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/fetch
| Argument | Type | Description |
|---|---|---|
| url | string | http(s) URL to fetch (max 2,048 characters). Send url or urls, not both. |
| urls | array | Instead of url: 1 to 10 distinct http(s) URLs in one call, priced per URL (the route price × the count). The answer is results[], one per URL, each with its own receipt. |
| return_text | boolean | Return up to 20,000 characters of clean text (per page). Default true; send false to leave the text out. |
{
"type": "object",
"oneOf": [
{
"required": [
"url"
]
},
{
"required": [
"urls"
]
}
],
"examples": [
{
"urls": [
"https://www.iana.org/help/example-domains"
],
"return_text": true
}
],
"properties": {
"url": {
"type": "string",
"description": "http(s) URL to fetch (max 2,048 characters). Send url or urls, not both."
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "Instead of url: 1 to 10 distinct http(s) URLs in one call, priced per URL (the route price × the count). The answer is results[], one per URL, each with its own receipt."
},
"return_text": {
"type": "boolean",
"description": "Return up to 20,000 characters of clean text (per page). Default true; send false to leave the text out."
}
},
"additionalProperties": false
}Use before paying for POST /v1/verify/document: send the same body, and get back the quote and link pairs it would check, what was skipped and why, the number of parts and the exact price. Nothing is fetched, signed or charged. Free. Free. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-document
| Argument | Type | Description |
|---|---|---|
| part | integer | 0-based part to check, default 0; call POST /v1/verify/document/preview first to see how many parts there are. |
| match | string | For every pair: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). With "passages", each sentence that carries a link is a claim. |
| format | string | markdown (default), text (only bare URLs and [n] references are links) or html (<a href> links, <blockquote> and <q> quotes; other tags are dropped). |
| document* | string | The answer or report as written, 1 character to 60000 bytes (UTF-8), and the whole request body is capped at 256 KB. Its quotes and their links are found by fixed rules (extractor doc-v1). |
| min_words | integer | A quoted span with fewer words is skipped as too_short (default 4). |
| part_size | integer |
Send the same body as POST /v1/verify/text-quote (start and end are ignored) and get back exact, fuzzy or none, the score and the occurrences. Free, 30 a day per IP address. The answer is not signed and has no offsets or receipt; the paid route returns those. Free. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-text-quote
| Argument | Type | Description |
|---|---|---|
| end | integer | Optional, with start: the declared end offset, raw code points, exclusive. Give both or neither; not with match "passages". |
| text* | string | The source text you already hold, as sent (max 50,000 characters, and the whole request body is capped at 256 KB of UTF-8, so 50,000 characters of 4-byte text fit; no fetch, no normalising before hashing). Offsets count characters (code points). |
| match | string | exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages of the text that share most of its words, scored, as evidence for you to judge (not a verdict). Not with start and end. |
| quote* | string | Text to look for in the source, or with match "passages" the claim to find support for (max 1,000 characters after normalisation). |
| start | integer | Optional, with end: the declared start offset of the quote in text, raw code points, 0-based. Only that slice is matched (max 1,000 code points), so the answer is whether the text at these offsets says the quote. Declared offsets are raw; result offsets are into the normalised text. If the slice misses but the quote is elsewhere in the text, result.located gives its position in the whole text. On a slice miss where a number differs, the answer carries match_verdict changed_number and nearest, the closest span on the slice with its diff. nearest offsets count into the slice's normalised text, not the whole text. |
Reports if a page changed since a receipt: unchanged, changed, gone, unreadable. US$0.003 per call; POST receipt, or url with content_sha256 (not both). Costs US$0.003 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/recheck
| Argument | Type | Description |
|---|---|---|
| url | string | Only without receipt: the http(s) URL to re-check (max 2,048 characters). |
| quote | string | Only with a verify/quote receipt in exact or fuzzy mode: the quote exactly as it was sent to verify/quote. Must match the one the receipt signed. We re-test it on the live page and answer quote.verdict: still_exact, now_exact, now_fuzzy, now_missing or unchecked. |
| quotes | array | Only with a verify/quotes receipt in exact or fuzzy mode: all of its quotes, exactly as sent to verify/quotes, in the same order. Each must match the one the receipt signed. We re-test each on the live page and answer quotes[i].verdict (same values as quote.verdict). Not with quote. |
| history | array | Optional: up to 10 earlier receipts of this service for the same url, oldest first (fetch, verify/quote or recheck; paid or trial). Adds a timeline. Not stored. |
| receipt | string | Compact JWS receipt from an earlier /v1/fetch, /v1/verify/quote, /v1/verify/quotes or /v1/recheck call of this service (paid or trial; not a sample). Max 160 KB. |
Scans a bot's draft reply before sending: pass, caution or block, with findings on links, lookalike hosts, injection and prices. US$0.003 per call; POST text. Costs US$0.003 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/scan-reply
| Argument | Type | Description |
|---|---|---|
| text* | string | The draft reply your bot is about to send (1 to 10,000 characters). Plain text, Markdown or HTML. |
| source_text | string | Optional: the text the bot was given to answer from (max 40,000 characters). Links whose host is not in it, and price or discount numbers not in it, are findings. The request body is capped at 64 KB. |
| allowed_urls | array | Optional: up to 50 URLs or bare hosts the bot may link to. A link is allowed when its host is one of these or a subdomain of one (paths are not compared). With allowed_urls, a link outside them is a high finding. |
{
"type": "object",
"examples": [
{
"text": "Your refund of $25 is on its way. Track it at https://shop.example.net/orders or confirm your card at https://shop-example.net.verify-account.io/login.",
"source_text": "Refund approved: $25, back to the original card in 5 to 7 days. Order page: https://shop.example.net/orders",
"allowed_urls": [
"https://shop.example.net"
]
}
],
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The draft reply your bot is about to send (1 to 10,000 characters). Plain text, Markdown or HTML."
},
"source_text": {
"type": "string",
"description": "Optional: the text the bot was given to answer from (max 40,000 characters). Links whose host is not in it, and price or discount numbers not in it, are findings. The request body is capped at 64 KB."
},
"allowed_urls": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Optional: up to 50 URLs or bare hosts the bot may link to. A link is allowed when its host is one of these or a subdomain of one (paths are not compared). With allowed_urls, a link outside them is a high finding."
}
},
"additionalProperties": false
}Checks up to 10 quote and URL pairs on live pages: exact, fuzzy or none, one receipt. US$0.10 per call; POST citations. Costs US$0.10 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-citations
| Argument | Type | Description |
|---|---|---|
| match | string | For every citation: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). |
| citations* | array | 1 to 10 citations. Each URL is fetched once however many quotes cite it. Dead domains are reported as results; if none resolves, 422 and no charge. |
| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"match": "fuzzy",
"citations": [
{
"url": "https://www.iana.org/help/example-domains",
"quote": "These domains may be used as illustrative examples in documents"
},
{
"url": "https://www.iana.org/domains/reserved",
"quote": "IANA-managed Reserved Domains"
}
]
}
],
"required": [
"citations"
],
"properties": {
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "For every citation: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict)."
},
"citations": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"quote"
],
"properties": {
"url": {
"type": "string",
"description": "http(s) URL of the cited page (max 2,048 characters)."
},
"quote": {
"type": "string",
"description": "Text the answer says is on that page, or with match \"passages\" the claim it says the page supports (max 1,000 characters after normalisation)."
}
},
"additionalProperties": false
},
"maxItems": 10,
"minItems": 1,
"description": "1 to 10 citations. Each URL is fetched once however many quotes cite it. Dead domains are reported as results; if none resolves, 422 and no charge."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}Checks one part of a document's quotes on live pages. US$0.10 per part of up to 10 pairs; POST document and part. Costs US$0.10 per part of 10 pairs in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-document
| Argument | Type | Description |
|---|---|---|
| part | integer | 0-based part to check, default 0; call POST /v1/verify/document/preview first to see how many parts there are. |
| match | string | For every pair: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). With "passages", each sentence that carries a link is a claim. |
| format | string | markdown (default), text (only bare URLs and [n] references are links) or html (<a href> links, <blockquote> and <q> quotes; other tags are dropped). |
| document* | string | The answer or report as written, 1 character to 60000 bytes (UTF-8), and the whole request body is capped at 256 KB. Its quotes and their links are found by fixed rules (extractor doc-v1). |
| min_words | integer | A quoted span with fewer words is skipped as too_short (default 4). |
| part_size | integer |
Checks a quote on its live page: exact, fuzzy or none, offsets and a signed receipt. US$0.01 per call; POST url, quote. Costs US$0.01 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-quote
| Argument | Type | Description |
|---|---|---|
| url* | string | http(s) URL of the page to check (max 2,048 characters). The whole request body is capped at 64 KB. |
| match | string | exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). |
| quote* | string | Text to look for on the page, or with match "passages" the claim to find support for (max 1,000 characters after normalisation). |
| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"url": "https://www.iana.org/help/example-domains",
"match": "fuzzy",
"quote": "These domains may be used as illustrative examples in documents",
"case_sensitive": false
}
],
"required": [
"url",
"quote"
],
"properties": {
"url": {
"type": "string",
"description": "http(s) URL of the page to check (max 2,048 characters). The whole request body is capped at 64 KB."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict)."
},
"quote": {
"type": "string",
"description": "Text to look for on the page, or with match \"passages\" the claim to find support for (max 1,000 characters after normalisation)."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}Checks up to 20 quotes on one page: exact, fuzzy or none, offsets, signed receipt. US$0.02 per call; POST url, quotes. Costs US$0.02 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-quotes
| Argument | Type | Description |
|---|---|---|
| url* | string | http(s) URL of the page to check (max 2,048 characters). Fetched once for all the quotes. |
| match | string | For every quote: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). |
| quotes* | array | 1 to 20 quotes to look for on that page, or with match "passages" claims to find support for (each max 1,000 characters after normalisation). One price for the call however many. |
| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"url": "https://www.iana.org/help/example-domains",
"match": "fuzzy",
"quotes": [
"These domains may be used as illustrative examples in documents",
"without prior coordination with us"
]
}
],
"required": [
"url",
"quotes"
],
"properties": {
"url": {
"type": "string",
"description": "http(s) URL of the page to check (max 2,048 characters). Fetched once for all the quotes."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "For every quote: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict)."
},
"quotes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"description": "1 to 20 quotes to look for on that page, or with match \"passages\" claims to find support for (each max 1,000 characters after normalisation). One price for the call however many."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}Use when you are handed a QuoteProof evidence receipt and need to check it before relying on it: verifies the compact JWS against this service's published keys and returns its payload, so a forged or altered receipt is caught. Free. Free. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/receipt-verify
| Argument | Type | Description |
|---|---|---|
| receipt* | string | The compact JWS from the "receipt" field of a response. |
{
"type": "object",
"examples": [
{
"receipt": "eyJhbGciOiJFZERTQSIs…"
}
],
"required": [
"receipt"
],
"properties": {
"receipt": {
"type": "string",
"maxLength": 163840,
"description": "The compact JWS from the \"receipt\" field of a response."
}
},
"additionalProperties": false
}Checks a quote word for word against text you hold: exact, fuzzy or none, offsets. US$0.005 per call; POST text, quote. Costs US$0.005 per call in USDC via x402 (Base), charged when the call answers below 400 (a no-match or not-found result is charged too); a bad request is refused unpaid. Pay by putting an x402 payment payload in _meta["x402/payment"]. Without one it returns the payment requirements. Docs: https://vehcdj664efetfrsolne5umanq.srv.us/docs/verify-text-quote
| Argument | Type | Description |
|---|---|---|
| end | integer | Optional, with start: the declared end offset, raw code points, exclusive. Give both or neither; not with match "passages". |
| text* | string | The source text you already hold, as sent (max 50,000 characters, and the whole request body is capped at 256 KB of UTF-8, so 50,000 characters of 4-byte text fit; no fetch, no normalising before hashing). Offsets count characters (code points). |
| match | string | exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages of the text that share most of its words, scored, as evidence for you to judge (not a verdict). Not with start and end. |
| quote* | string | Text to look for in the source, or with match "passages" the claim to find support for (max 1,000 characters after normalisation). |
| start | integer | Optional, with end: the declared start offset of the quote in text, raw code points, 0-based. Only that slice is matched (max 1,000 code points), so the answer is whether the text at these offsets says the quote. Declared offsets are raw; result offsets are into the normalised text. If the slice misses but the quote is elsewhere in the text, result.located gives its position in the whole text. On a slice miss where a number differs, the answer carries match_verdict changed_number and nearest, the closest span on the slice with its diff. nearest offsets count into the slice's normalised text, not the whole text. |
| Pairs per part, default 10. A free trial call takes at most the size in extensions.trial.info.max_batch_items of the 402 offer. |
| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"part": 0,
"match": "fuzzy",
"format": "markdown",
"document": "WHO says \"Air pollution kills an estimated seven million people every year\" ([WHO](https://www.who.int/health-topics/air-pollution)).\n\n> These domains may be used as illustrative examples in documents\n> — [IANA](https://www.iana.org/help/example-domains)"
}
],
"required": [
"document"
],
"properties": {
"part": {
"type": "integer",
"minimum": 0,
"description": "0-based part to check, default 0; call POST /v1/verify/document/preview first to see how many parts there are."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "For every pair: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). With \"passages\", each sentence that carries a link is a claim."
},
"format": {
"enum": [
"markdown",
"text",
"html"
],
"type": "string",
"description": "markdown (default), text (only bare URLs and [n] references are links) or html (<a href> links, <blockquote> and <q> quotes; other tags are dropped)."
},
"document": {
"type": "string",
"description": "The answer or report as written, 1 character to 60000 bytes (UTF-8), and the whole request body is capped at 256 KB. Its quotes and their links are found by fixed rules (extractor doc-v1)."
},
"min_words": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "A quoted span with fewer words is skipped as too_short (default 4)."
},
"part_size": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Pairs per part, default 10. A free trial call takes at most the size in extensions.trial.info.max_batch_items of the 402 offer."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"text": "Refunds are paid within 14 days of purchase, to the card that was used.",
"match": "fuzzy",
"quote": "refunds are paid within 14 days",
"case_sensitive": false
}
],
"required": [
"text",
"quote"
],
"properties": {
"end": {
"type": "integer",
"minimum": 1,
"description": "Optional, with start: the declared end offset, raw code points, exclusive. Give both or neither; not with match \"passages\"."
},
"text": {
"type": "string",
"description": "The source text you already hold, as sent (max 50,000 characters, and the whole request body is capped at 256 KB of UTF-8, so 50,000 characters of 4-byte text fit; no fetch, no normalising before hashing). Offsets count characters (code points)."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages of the text that share most of its words, scored, as evidence for you to judge (not a verdict). Not with start and end."
},
"quote": {
"type": "string",
"description": "Text to look for in the source, or with match \"passages\" the claim to find support for (max 1,000 characters after normalisation)."
},
"start": {
"type": "integer",
"minimum": 0,
"description": "Optional, with end: the declared start offset of the quote in text, raw code points, 0-based. Only that slice is matched (max 1,000 code points), so the answer is whether the text at these offsets says the quote. Declared offsets are raw; result offsets are into the normalised text. If the slice misses but the quote is elsewhere in the text, result.located gives its position in the whole text. On a slice miss where a number differs, the answer carries match_verdict changed_number and nearest, the closest span on the slice with its diff. nearest offsets count into the slice's normalised text, not the whole text."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}| return_text |
| boolean |
| Also return up to 20,000 characters of the new clean text. Default false. |
| content_sha256 | string | Only with url: the page.content_sha256 from our own fetch (64 hex). Other tools hash other text. |
{
"type": "object",
"oneOf": [
{
"required": [
"receipt"
]
},
{
"required": [
"url",
"content_sha256"
]
}
],
"examples": [
{
"url": "https://www.iana.org/help/example-domains",
"return_text": false,
"content_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
],
"properties": {
"url": {
"type": "string",
"description": "Only without receipt: the http(s) URL to re-check (max 2,048 characters)."
},
"quote": {
"type": "string",
"description": "Only with a verify/quote receipt in exact or fuzzy mode: the quote exactly as it was sent to verify/quote. Must match the one the receipt signed. We re-test it on the live page and answer quote.verdict: still_exact, now_exact, now_fuzzy, now_missing or unchecked."
},
"quotes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"description": "Only with a verify/quotes receipt in exact or fuzzy mode: all of its quotes, exactly as sent to verify/quotes, in the same order. Each must match the one the receipt signed. We re-test each on the live page and answer quotes[i].verdict (same values as quote.verdict). Not with quote."
},
"history": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "Optional: up to 10 earlier receipts of this service for the same url, oldest first (fetch, verify/quote or recheck; paid or trial). Adds a timeline. Not stored."
},
"receipt": {
"type": "string",
"description": "Compact JWS receipt from an earlier /v1/fetch, /v1/verify/quote, /v1/verify/quotes or /v1/recheck call of this service (paid or trial; not a sample). Max 160 KB."
},
"return_text": {
"type": "boolean",
"description": "Also return up to 20,000 characters of the new clean text. Default false."
},
"content_sha256": {
"type": "string",
"description": "Only with url: the page.content_sha256 from our own fetch (64 hex). Other tools hash other text."
}
},
"additionalProperties": false
}| Pairs per part, default 10. A free trial call takes at most the size in extensions.trial.info.max_batch_items of the 402 offer. |
| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"part": 0,
"match": "fuzzy",
"format": "markdown",
"document": "WHO says \"Air pollution kills an estimated seven million people every year\" ([WHO](https://www.who.int/health-topics/air-pollution)).\n\n> These domains may be used as illustrative examples in documents\n> — [IANA](https://www.iana.org/help/example-domains)"
}
],
"required": [
"document"
],
"properties": {
"part": {
"type": "integer",
"minimum": 0,
"description": "0-based part to check, default 0; call POST /v1/verify/document/preview first to see how many parts there are."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "For every pair: exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages that share most of its words, scored, as evidence for you to judge (not a verdict). With \"passages\", each sentence that carries a link is a claim."
},
"format": {
"enum": [
"markdown",
"text",
"html"
],
"type": "string",
"description": "markdown (default), text (only bare URLs and [n] references are links) or html (<a href> links, <blockquote> and <q> quotes; other tags are dropped)."
},
"document": {
"type": "string",
"description": "The answer or report as written, 1 character to 60000 bytes (UTF-8), and the whole request body is capped at 256 KB. Its quotes and their links are found by fixed rules (extractor doc-v1)."
},
"min_words": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "A quoted span with fewer words is skipped as too_short (default 4)."
},
"part_size": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "Pairs per part, default 10. A free trial call takes at most the size in extensions.trial.info.max_batch_items of the 402 offer."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}| threshold | number | Fuzzy similarity needed, default 0.9. |
| case_sensitive | boolean | Default false; must be false with match "passages". |
{
"type": "object",
"examples": [
{
"text": "Refunds are paid within 14 days of purchase, to the card that was used.",
"match": "fuzzy",
"quote": "refunds are paid within 14 days",
"case_sensitive": false
}
],
"required": [
"text",
"quote"
],
"properties": {
"end": {
"type": "integer",
"minimum": 1,
"description": "Optional, with start: the declared end offset, raw code points, exclusive. Give both or neither; not with match \"passages\"."
},
"text": {
"type": "string",
"description": "The source text you already hold, as sent (max 50,000 characters, and the whole request body is capped at 256 KB of UTF-8, so 50,000 characters of 4-byte text fit; no fetch, no normalising before hashing). Offsets count characters (code points)."
},
"match": {
"enum": [
"exact",
"fuzzy",
"passages"
],
"type": "string",
"description": "exact; fuzzy (default), which also accepts small differences; or passages, for a paraphrased claim: the 3 passages of the text that share most of its words, scored, as evidence for you to judge (not a verdict). Not with start and end."
},
"quote": {
"type": "string",
"description": "Text to look for in the source, or with match \"passages\" the claim to find support for (max 1,000 characters after normalisation)."
},
"start": {
"type": "integer",
"minimum": 0,
"description": "Optional, with end: the declared start offset of the quote in text, raw code points, 0-based. Only that slice is matched (max 1,000 code points), so the answer is whether the text at these offsets says the quote. Declared offsets are raw; result offsets are into the normalised text. If the slice misses but the quote is elsewhere in the text, result.located gives its position in the whole text. On a slice miss where a number differs, the answer carries match_verdict changed_number and nearest, the closest span on the slice with its diff. nearest offsets count into the slice's normalised text, not the whole text."
},
"threshold": {
"type": "number",
"maximum": 1,
"minimum": 0.5,
"description": "Fuzzy similarity needed, default 0.9."
},
"case_sensitive": {
"type": "boolean",
"description": "Default false; must be false with match \"passages\"."
}
},
"additionalProperties": false
}