{"id":"citation-span","title":"Locate quoted text in a source with exact offsets, or classify it as normalized, elided, paraphrased or absent","description":"Finds each quote an agent attributes to a source text and returns where it sits: exact offsets in UTF-16, code points, UTF-8 bytes and graphemes, so the span slices back to the matched text. Tries an exact match, then a match tolerant of whitespace, curly vs straight quotes, dash types, ellipses, invisible characters and Unicode forms (NFC/NFD, ligatures), naming which normalizations were needed, then bracket-ellipsis elisions, then flags a probable paraphrase by word overlap, else not-present. Does not judge whether the source is true or the quote is representative; a paraphrase is reported with its nearest span but never counted as a match.","roi":"Catches fabricated and paraphrased citations before they reach a user. 50 quotes per $0.005 call.","audience":"agent-infra","package":"context-evidence-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/citation-span","path":"/api/v1/citation-span","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["source","quotes"],"properties":{"source":{"type":"string","maxLength":100000,"minLength":1,"description":"Text the quotes are claimed to come from."},"quotes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","maxLength":2000,"minLength":1,"description":"The quoted text."},"id":{"type":"string","maxLength":100,"description":"Echoed back."}},"required":["text"]},"maxItems":50,"minItems":1,"description":"Up to 50 quotes, 40000 characters in total."},"ignoreCase":{"type":"boolean","description":"Also tolerate case differences (reported as a normalization). Default false."},"tolerate":{"type":"array","items":{"type":"string","enum":["whitespace","quotes","dashes","ellipsis","invisible","unicode"]},"maxItems":6,"description":"Normalizations that still count as a match. Default: all six."},"exactOnly":{"type":"boolean","description":"Count only byte-identical matches as pass; normalized matches become fail. Default false."},"minLength":{"type":"integer","minimum":1,"maximum":200,"description":"Quotes shorter than this many characters (after trimming quote marks) are too-short and give unknown. Default 8."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"results":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"classification":{"type":"string","enum":["verbatim","normalized","elided","case-differs","paraphrase","not-present","too-short"]},"occurrences":{"type":"integer","description":"Matches found, counted to 50. More than one means the citation is ambiguous."},"spans":{"type":"array","items":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}},"maxItems":5,"description":"Matched source ranges (one per segment for elided quotes; otherwise up to five occurrences)."},"matchedText":{"type":"string"},"normalizations":{"type":"array","items":{"type":"string","enum":["whitespace","quotes","dashes","ellipsis","invisible","unicode","case"]},"maxItems":7,"description":"Normalizations that made the quote equal the source text."},"trimmedWrapper":{"type":"boolean","description":"Surrounding quote marks or edge ellipses were removed before matching."},"overlap":{"type":"number","description":"Share of the quote's content words found in the nearest window (paraphrase and not-present only)."},"nearest":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}}}},"maxItems":50},"counts":{"type":"object","additionalProperties":false,"properties":{"verbatim":{"type":"integer"},"normalized":{"type":"integer"},"elided":{"type":"integer"},"case-differs":{"type":"integer"},"paraphrase":{"type":"integer"},"not-present":{"type":"integer"},"too-short":{"type":"integer"}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"results":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"classification":{"type":"string","enum":["verbatim","normalized","elided","case-differs","paraphrase","not-present","too-short"]},"occurrences":{"type":"integer","description":"Matches found, counted to 50. More than one means the citation is ambiguous."},"spans":{"type":"array","items":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}},"maxItems":5,"description":"Matched source ranges (one per segment for elided quotes; otherwise up to five occurrences)."},"matchedText":{"type":"string"},"normalizations":{"type":"array","items":{"type":"string","enum":["whitespace","quotes","dashes","ellipsis","invisible","unicode","case"]},"maxItems":7,"description":"Normalizations that made the quote equal the source text."},"trimmedWrapper":{"type":"boolean","description":"Surrounding quote marks or edge ellipses were removed before matching."},"overlap":{"type":"number","description":"Share of the quote's content words found in the nearest window (paraphrase and not-present only)."},"nearest":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}}}},"maxItems":50},"counts":{"type":"object","additionalProperties":false,"properties":{"verbatim":{"type":"integer"},"normalized":{"type":"integer"},"elided":{"type":"integer"},"case-differs":{"type":"integer"},"paraphrase":{"type":"integer"},"not-present":{"type":"integer"},"too-short":{"type":"integer"}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"source":"The committee said the “pilot” would run for six months — ending in March — before a review.","quotes":[{"id":"q1","text":"the \"pilot\" would run for six months - ending in March"},{"id":"q2","text":"the pilot will last half a year"}]},"openapiOperation":{"operationId":"citation_span","summary":"Locate quoted text in a source with exact offsets, or classify it as normalized, elided, paraphrased or absent","description":"Finds each quote an agent attributes to a source text and returns where it sits: exact offsets in UTF-16, code points, UTF-8 bytes and graphemes, so the span slices back to the matched text. Tries an exact match, then a match tolerant of whitespace, curly vs straight quotes, dash types, ellipses, invisible characters and Unicode forms (NFC/NFD, ligatures), naming which normalizations were needed, then bracket-ellipsis elisions, then flags a probable paraphrase by word overlap, else not-present. Does not judge whether the source is true or the quote is representative; a paraphrase is reported with its nearest span but never counted as a match.\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/citation-span","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["source","quotes"],"properties":{"source":{"type":"string","maxLength":100000,"minLength":1,"description":"Text the quotes are claimed to come from."},"quotes":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"text":{"type":"string","maxLength":2000,"minLength":1,"description":"The quoted text."},"id":{"type":"string","maxLength":100,"description":"Echoed back."}},"required":["text"]},"maxItems":50,"minItems":1,"description":"Up to 50 quotes, 40000 characters in total."},"ignoreCase":{"type":"boolean","description":"Also tolerate case differences (reported as a normalization). Default false."},"tolerate":{"type":"array","items":{"type":"string","enum":["whitespace","quotes","dashes","ellipsis","invisible","unicode"]},"maxItems":6,"description":"Normalizations that still count as a match. Default: all six."},"exactOnly":{"type":"boolean","description":"Count only byte-identical matches as pass; normalized matches become fail. Default false."},"minLength":{"type":"integer","minimum":1,"maximum":200,"description":"Quotes shorter than this many characters (after trimming quote marks) are too-short and give unknown. Default 8."}}},"example":{"source":"The committee said the “pilot” would run for six months — ending in March — before a review.","quotes":[{"id":"q1","text":"the \"pilot\" would run for six months - ending in March"},{"id":"q2","text":"the pilot will last half a year"}]}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"results":{"type":"array","items":{"type":"object","additionalProperties":false,"properties":{"index":{"type":"integer"},"id":{"type":"string"},"classification":{"type":"string","enum":["verbatim","normalized","elided","case-differs","paraphrase","not-present","too-short"]},"occurrences":{"type":"integer","description":"Matches found, counted to 50. More than one means the citation is ambiguous."},"spans":{"type":"array","items":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}},"maxItems":5,"description":"Matched source ranges (one per segment for elided quotes; otherwise up to five occurrences)."},"matchedText":{"type":"string"},"normalizations":{"type":"array","items":{"type":"string","enum":["whitespace","quotes","dashes","ellipsis","invisible","unicode","case"]},"maxItems":7,"description":"Normalizations that made the quote equal the source text."},"trimmedWrapper":{"type":"boolean","description":"Surrounding quote marks or edge ellipses were removed before matching."},"overlap":{"type":"number","description":"Share of the quote's content words found in the nearest window (paraphrase and not-present only)."},"nearest":{"type":"object","description":"Half-open [start,end) range in four coordinate systems: UTF-16 code units, code points, UTF-8 bytes, extended grapheme clusters (Intl.Segmenter).","properties":{"utf16":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"codePoint":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"utf8":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"grapheme":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}},"graphemeAligned":{"type":"boolean"}}}}},"maxItems":50},"counts":{"type":"object","additionalProperties":false,"properties":{"verbatim":{"type":"integer"},"normalized":{"type":"integer"},"elided":{"type":"integer"},"case-differs":{"type":"integer"},"paraphrase":{"type":"integer"},"not-present":{"type":"integer"},"too-short":{"type":"integer"}}},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/citation-span/","docsJson":"https://agents.writerslogic.com/docs/citation-span.json","sample":"https://agents.writerslogic.com/api/v1/samples/citation-span","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}