# BOZOS Quote Checker: headless instructions

Page: https://bozos.si/tools/quote-checker
API: https://bozos.si/api/v1/quote-check (GET / POST)
MCP: https://bozos.si/api/mcp (checkQuote)
Updated: 2026-10-24. No authentication, API key, installation, or AI model.

## Check supplied text

```sh
curl -sS 'https://bozos.si/api/v1/quote-check' -H 'Content-Type: application/json' --data '{"quote":"A source can contain line breaks.","source_text":"A source can contain\nline breaks."}'
```

This returns normalized_match. The original passage retains its newline. Supplied text is checked literally, including any markup, and makes no network requests. If supplying a partial extraction, set source_truncated:true.

## Check a public source

```json
{"quote":"A match does not establish truth","url":"https://bozos.si/tools/quote-checker.md"}
```

Use the actual quotation and its public HTTPS source. URL checks use BOZOSReader and inherit Source Reader's DNS/address restrictions, robots.txt checks, redirect limit, 2 MiB source limit, and 15-second timeout. No cookies, credentials, private destinations, page scripts, or PDFs. A page that requires JavaScript or login may be unavailable or incomplete.

HTML is checked as extracted main text with block separators and decoded entities, without Markdown syntax, generated titles, link destinations, or metadata. Plain text and Markdown are checked literally; Markdown syntax may interrupt a quotation. Offsets refer to the checked representation, never raw HTML or Source Reader's public Markdown output. Extraction can omit content; not_found means absent from the checked representation.

## GET and MCP

Plain URL example (no POST or JavaScript):

https://bozos.si/api/v1/quote-check?quote=Agents%20can%20check%20quotations.&source_text=Agents%20can%20check%20quotations.

GET also accepts url, normalize_whitespace=true/false, source_truncated=true/false, max_characters, max_matches, and context_characters, or the full JSON body as ?json= / ?b64=. GET URLs can appear in history and hosting logs; prefer POST for larger text or when the text should not be in the incoming request URL. Typical URL limits are smaller than the POST body limit.

MCP tools/call parameters:

```json
{"name":"checkQuote","arguments":{"quote":"A source can contain line breaks.","source_text":"A source can contain\nline breaks."}}
```

The page also has a native GET form that opens JSON results without JavaScript. With JavaScript, results display passages and source context. Full schema: https://bozos.si/openapi.json.

## Matching rules

- Exact matches preserve every character. By default, a second matching form collapses JavaScript Unicode whitespace runs (including line breaks, tabs, NBSP, and BOM) to one ASCII space, and trims the quotation for lookup. Set normalize_whitespace:false for exact-only checks.
- Case and punctuation are always preserved. No smart-quote replacement, accent folding, case folding, fuzzy matches, paraphrase grading, or truth verdicts.
- Word-like quotation edges (Unicode letters, marks, numbers, underscore) cannot cut into source words: significant does not match insignificant, and 42 does not match 142. A cut-off word at a truncated source boundary cannot be confirmed.
- Each occurrence is labelled exact_match or normalized_match; both can appear in one result. The top-level status is exact_match when any exact occurrence exists, otherwise normalized_match when one exists.
- start/end use zero-based Unicode code points with an exclusive end. utf16_start/end are JavaScript string offsets. Lines start at 1; CRLF is one line break. The returned text is always the original source span, not a rewritten quotation.

## Results and limits

matched:true establishes textual presence only. A complete check with no matches returns status:not_found and matched:false. If a source was truncated and no match can be confirmed, status:source_truncated and matched:null keep absence inconclusive. A positive match in a partial source still carries source.truncated:true.

match_counts covers all occurrences. matches returns the first max_matches passages in source order; matches_truncated indicates omitted passages, separately from source truncation. before/after contain source context. checked_text_sha256 hashes the checked text in UTF-8; URL mode also returns original source hash, final URL, retrieval time, citation metadata, redirects, HTTP validators, and robots checks.

Limits: 64 KiB POST body; quotation 1–4000 code points; supplied text up to 100000 code points; URL checks default to 100000, configurable from 1000; 5 passages by default, up to 20; 120 context characters each side by default, up to 500. No application-level content retention; hosting logs may exist.

Input errors use 400/413/415 with error and message. Retrieval/extraction failures use non-2xx with status:source_unavailable, matched:null, and the underlying error code; they are never not_found. MCP errors set isError:true and keep the explanation in text content. A robots denial is 403; source failures can be 413, 415, 422, or 424 (upstream failure or timeout; read the error field). Honor Retry-After on 429.

A match does not establish truth, authorship, or that the quotation supports a claim. Preserve source context and cite the original URL.
