{"openapi":"3.1.0","info":{"title":"Unicode Text Safety Tools","version":"1.0.0","description":"Hidden-character, bidi, confusable, script-mix, normalization and grapheme checks for text an agent is about to trust. One call, one computed answer, no accounts or API keys. Machine-payable over x402.","x-guidance":"Unicode Text Safety Tools: Hidden-character, bidi, confusable, script-mix, normalization and grapheme checks for text an agent is about to trust. Unicode Text Safety Tools finds characters that hide from human readers but not from models or parsers: /hidden-characters (zero-width, bidi, tag characters used to smuggle instructions), /bidi-check (Trojan Source bidi overrides, CVE-2021-42574), /confusables (homoglyph skeletons per UTS #39), /script-mix (mixed-script and restriction level), /normalize (NFC, NFD, NFKC, NFKD), /grapheme-count (user-perceived characters vs code points vs bytes), /utf8-bytes (encode text or validate hex bytes) and /text-sanitize (strip the invisible characters). Each paid GET returns a computed verdict with the reasons, the source and what was NOT checked. A verdict of UNVERIFIED means a lookup failed: treat it as unknown. No account or key: pay per call in USDC over x402."},"servers":[{"url":"https://unicode-text-tools.x402tookit.com"}],"paths":{"/bidi-check":{"get":{"operationId":"bidi_check","summary":"Detect Trojan Source bidi controls (CVE-2021-42574): overrides, isolates, unbalanced openers, stray closers, with positions.","description":"Detect Trojan Source bidi controls (CVE-2021-42574): overrides, isolates, unbalanced openers, stray closers, with positions.","tags":["unicode","bidi","trojan-source","code-review","security"],"parameters":[{"name":"text","in":"query","required":true,"description":"Source code or text to scan, up to 20000 characters (longer is refused with 400)","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"controlCount":{"type":["null","number"]},"overrideCount":{"type":["null","number"]},"unbalancedCount":{"type":["null","number"]},"controls":{"type":["array","null"],"items":{"type":"object","properties":{"index":{"type":["null","number"]},"utf16Index":{"type":["null","number"]},"line":{"type":["null","number"]},"column":{"type":["null","number"]},"codepoint":{"type":["null","string"]},"name":{"type":["null","string"]}}}},"problems":{"type":["array","null"],"items":{"type":"object","properties":{"kind":{"type":["null","string"]},"index":{"type":["null","number"]},"utf16Index":{"type":["null","number"]},"line":{"type":["null","number"]},"column":{"type":["null","number"]},"codepoint":{"type":["null","string"]},"note":{"type":["null","string"]}}}},"truncated":{"type":["boolean","null"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"TROJAN_SOURCE_PATTERN","summary":"4 bidi control(s), 2 unbalanced or stray, 1 override(s): this can make displayed text differ from what a parser reads.","reasons":["Bidi overrides and unclosed isolates reorder displayed characters (Trojan Source, CVE-2021-42574): a reviewer sees different code from the compiler."],"controlCount":4,"overrideCount":1,"unbalancedCount":2,"controls":[{"index":19,"utf16Index":19,"line":1,"column":20,"codepoint":"U+202E","name":"RIGHT-TO-LEFT OVERRIDE"},{"index":21,"utf16Index":21,"line":1,"column":22,"codepoint":"U+2066","name":"LEFT-TO-RIGHT ISOLATE"}],"problems":[{"kind":"UNTERMINATED","index":19,"utf16Index":19,"line":1,"column":20,"codepoint":"U+202E","note":"U+202E RIGHT-TO-LEFT OVERRIDE is never closed before the end of the line, so it affects following text."},{"kind":"UNTERMINATED","index":38,"utf16Index":38,"line":1,"column":39,"codepoint":"U+2066","note":"U+2066 LEFT-TO-RIGHT ISOLATE is never closed before the end of the line, so it affects following text."}],"truncated":false,"degraded":false,"notChecked":["whether the control sits inside a comment or string (that needs a language parser)","the visual order a given editor would display","…1 more"],"source":"computed locally","asOf":"2026-10-21T01:34:51.193Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/bidi-check"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/bidi-check"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/bidi-check"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/bidi-check"}}]}}},"/confusables":{"get":{"operationId":"confusables","summary":"UTS #39 skeleton and homoglyph check: which characters look like others, and whether two strings are confusable.","description":"UTS #39 skeleton and homoglyph check: which characters look like others, and whether two strings are confusable.","tags":["unicode","homoglyph","confusables","spoofing","uts39"],"parameters":[{"name":"text","in":"query","required":true,"description":"String to check, up to 500 characters (longer is refused with 400)","schema":{"type":"string"}},{"name":"other","in":"query","required":false,"description":"Optional second string, up to 500 characters; reports whether the two skeletons match","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"skeleton":{"type":["null","string"]},"skeletonCodePoints":{"type":["array","null"],"items":{"type":"string"}},"mappedCharacters":{"type":["array","null"],"items":{"type":"object","properties":{"index":{"type":["null","number"]},"char":{"type":["null","string"]},"codepoint":{"type":["null","string"]},"script":{"type":["null","string"]},"looksLike":{"type":["null","string"]},"looksLikeCodepoints":{"type":["array","null"],"items":{"type":"string"}}}}},"scripts":{"type":["array","null"],"items":{"type":"string"}},"mixedScripts":{"type":["boolean","null"]},"confusablesDataVersion":{"type":["null","string"]},"nonAsciiLookingAscii":{"type":["null","number"]},"other":{"type":["null","object"],"properties":{"skeleton":{"type":["null","string"]},"scripts":{"type":["array","null"],"items":{"type":"string"}}}},"skeletonsMatch":{"type":["boolean","null"]},"identicalStrings":{"type":["boolean","null"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"CONFUSABLE","summary":"The strings are different but have the same UTS #39 skeleton: they can look alike to a reader.","reasons":["Different code points that map to the same skeleton are the basis of homograph spoofing."],"skeleton":"paypal","skeletonCodePoints":["U+0070","U+0061","…4 more"],"mappedCharacters":[{"index":1,"char":"а","codepoint":"U+0430","script":"Cyrillic","looksLike":"a","looksLikeCodepoints":["U+0061"]}],"scripts":["Latin","Cyrillic"],"mixedScripts":true,"confusablesDataVersion":"18.0.0","nonAsciiLookingAscii":1,"other":{"skeleton":"paypal","scripts":["Latin"]},"skeletonsMatch":true,"identicalStrings":false,"degraded":false,"notChecked":["whether the string is a real brand or domain","confusables across more than the single-character mapping (for example rn versus m is covered only where the data lists it)","…1 more"],"source":"computed locally","asOf":"2026-10-21T01:34:51.461Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/confusables"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/confusables"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/confusables"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/confusables"}}]}}},"/grapheme-count":{"get":{"operationId":"grapheme_count","summary":"Count grapheme clusters, code points, UTF-16 units and UTF-8 bytes of text, and list each cluster's code points.","description":"Count grapheme clusters, code points, UTF-16 units and UTF-8 bytes of text, and list each cluster's code points.","tags":["unicode","graphemes","length","emoji","utf-8"],"parameters":[{"name":"text","in":"query","required":true,"description":"Text to measure, up to 5000 characters (longer is refused with 400)","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"graphemeClusters":{"type":["null","number"]},"codePoints":{"type":["null","number"]},"utf16Units":{"type":["null","number"]},"utf8Bytes":{"type":["null","number"]},"clusters":{"type":["array","null"],"items":{"type":"object","properties":{"text":{"type":["null","string"]},"codePoints":{"type":["array","null"],"items":{"type":"string"}},"utf16Units":{"type":["null","number"]}}}},"clustersTruncated":{"type":["boolean","null"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"COUNTS_DIFFER","summary":"7 grapheme cluster(s), 15 code point(s), 20 UTF-16 unit(s), 41 UTF-8 byte(s).","reasons":["The measures differ: use grapheme clusters for what a person counts as characters, UTF-16 units for JavaScript .length, UTF-8 bytes for storage and API limits."],"graphemeClusters":7,"codePoints":15,"utf16Units":20,"utf8Bytes":41,"clusters":[{"text":"é","codePoints":["U+0065","U+0301"],"utf16Units":2},{"text":" ","codePoints":["U+0020"],"utf16Units":1}],"clustersTruncated":false,"degraded":false,"notChecked":["how any particular font renders a cluster","language-specific tailoring (clusters follow the default Unicode UAX #29 rules in this runtime's Unicode version)"],"source":"computed locally","asOf":"2026-10-21T01:34:51.728Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/grapheme-count"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/grapheme-count"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/grapheme-count"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/grapheme-count"}}]}}},"/hidden-characters":{"get":{"operationId":"hidden_characters","summary":"Scan text for zero-width, bidi, tag-block, variation-selector and other invisible characters, each with position and verdict.","description":"Scan text for zero-width, bidi, tag-block, variation-selector and other invisible characters, each with position and verdict.","tags":["unicode","prompt-injection","security","invisible-text"],"parameters":[{"name":"text","in":"query","required":true,"description":"Text to scan, up to 20000 characters (longer is refused with 400)","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"codePointCount":{"type":["null","number"]},"hiddenCount":{"type":["null","number"]},"counts":{"type":["null","object"],"properties":{"SUSPICIOUS":{"type":["null","number"]},"REVIEW":{"type":["null","number"]},"BENIGN_LIKELY":{"type":["null","number"]}}},"byClass":{"type":["null","object"],"properties":{"ZERO_WIDTH":{"type":["null","number"]},"BIDI_CONTROL":{"type":["null","number"]},"UNUSUAL_SPACE":{"type":["null","number"]},"TAG_CHARACTER":{"type":["null","number"]}}},"hiddenTagMessage":{"type":["null","string"]},"findings":{"type":["array","null"],"items":{"type":"object","properties":{"index":{"type":["null","number"]},"utf16Index":{"type":["null","number"]},"line":{"type":["null","number"]},"column":{"type":["null","number"]},"codepoint":{"type":["null","string"]},"name":{"type":["null","string"]},"class":{"type":["null","string"]},"verdict":{"type":["null","string"]},"note":{"type":["null","string"]}}}},"findingsTruncated":{"type":["boolean","null"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"SUSPICIOUS_FOUND","summary":"9 hidden or unusual character(s) among 57 code points: 8 suspicious, 1 to review, 0 normal in context.","reasons":["8 character(s) with no ordinary reason to be in plain text.","Tag characters spell a hidden ASCII message: \"ignore\". Hidden characters like these are used to smuggle instructions that an AI agent reads but a person never sees.","…1 more"],"codePointCount":57,"hiddenCount":9,"counts":{"SUSPICIOUS":8,"REVIEW":1,"BENIGN_LIKELY":0},"byClass":{"ZERO_WIDTH":1,"BIDI_CONTROL":1,"UNUSUAL_SPACE":1,"TAG_CHARACTER":6},"hiddenTagMessage":"ignore","findings":[{"index":21,"utf16Index":21,"line":1,"column":22,"codepoint":"U+200B","name":"ZERO WIDTH SPACE","class":"ZERO_WIDTH","verdict":"SUSPICIOUS","note":"Zero width space: invisible; used to split words so filters and matches miss them."},{"index":27,"utf16Index":27,"line":1,"column":28,"codepoint":"U+202E","name":"RIGHT-TO-LEFT OVERRIDE","class":"BIDI_CONTROL","verdict":"SUSPICIOUS","note":"Bidirectional override: reorders how text is displayed (Trojan Source, CVE-2021-42574)."}],"findingsTruncated":false,"degraded":false,"notChecked":["look-alike letters from other scripts (use /confusables)","unassigned code points","…2 more"],"source":"computed locally","asOf":"2026-10-21T01:34:51.981Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/hidden-characters"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/hidden-characters"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/hidden-characters"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/hidden-characters"}}]}}},"/normalize":{"get":{"operationId":"normalize","summary":"Normalize text to NFC, NFD, NFKC and NFKD, show code points of each, and whether the text changed.","description":"Normalize text to NFC, NFD, NFKC and NFKD, show code points of each, and whether the text changed.","tags":["unicode","normalization","nfc","nfkc"],"parameters":[{"name":"text","in":"query","required":true,"description":"Text to normalize, up to 2000 characters (longer is refused with 400)","schema":{"type":"string"}},{"name":"form","in":"query","required":false,"description":"One of NFC, NFD, NFKC, NFKD; default all four","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"inputCodePoints":{"type":["array","null"],"items":{"type":"string"}},"inputIsNormalized":{"type":["null","object"],"properties":{"NFC":{"type":["boolean","null"]},"NFD":{"type":["boolean","null"]},"NFKC":{"type":["boolean","null"]},"NFKD":{"type":["boolean","null"]}}},"results":{"type":["null","object"],"properties":{"NFC":{"type":["null","object"],"properties":{"text":{"type":["null","string"]},"changed":{"type":["boolean","null"]},"codePoints":{"type":["array","null"],"items":{"type":"string"}},"codePointCount":{"type":["null","number"]}}},"NFD":{"type":["null","object"],"properties":{"text":{"type":["null","string"]},"changed":{"type":["boolean","null"]},"codePoints":{"type":["array","null"],"items":{"type":"string"}},"codePointCount":{"type":["null","number"]}}},"NFKC":{"type":["null","object"],"properties":{"text":{"type":["null","string"]},"changed":{"type":["boolean","null"]},"codePoints":{"type":["array","null"],"items":{"type":"string"}},"codePointCount":{"type":["null","number"]}}},"NFKD":{"type":["null","object"],"properties":{"text":{"type":["null","string"]},"changed":{"type":["boolean","null"]},"codePoints":{"type":["array","null"],"items":{"type":"string"}},"codePointCount":{"type":["null","number"]}}}}},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"CHANGES_UNDER_NORMALIZATION","summary":"The text changes under NFC, NFD, NFKC, NFKD.","reasons":["Two strings that look the same can differ in code points; compare after normalizing, and use NFKC/NFKD only when losing formatting distinctions (ligatures, width, super/subscripts) is acceptable."],"inputCodePoints":["U+1E9B","U+0323","…4 more"],"inputIsNormalized":{"NFC":false,"NFD":false,"NFKC":false,"NFKD":false},"results":{"NFC":{"text":"ẛ̣ ﬁ Å","changed":true,"codePoints":["U+1E9B","U+0323","…4 more"],"codePointCount":6},"NFD":{"text":"ẛ̣ ﬁ Å","changed":true,"codePoints":["U+017F","U+0323","…6 more"],"codePointCount":8},"NFKC":{"text":"ṩ fi Å","changed":true,"codePoints":["U+1E69","U+0020","…4 more"],"codePointCount":6},"NFKD":{"text":"ṩ fi Å","changed":true,"codePoints":["U+0073","U+0323","…7 more"],"codePointCount":9}},"degraded":false,"notChecked":["locale-specific case or collation rules","normalization of text that is not valid Unicode (lone surrogates pass through unchanged)"],"source":"computed locally","asOf":"2026-10-21T01:34:52.245Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/normalize"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/normalize"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/normalize"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/normalize"}}]}}},"/script-mix":{"get":{"operationId":"script_mix","summary":"List the Unicode scripts in text and its UTS #39 restriction level; flags mixed-script words such as Latin plus Cyrillic.","description":"List the Unicode scripts in text and its UTS #39 restriction level; flags mixed-script words such as Latin plus Cyrillic.","tags":["unicode","scripts","homoglyph","idn","uts39"],"parameters":[{"name":"text","in":"query","required":true,"description":"Identifier, domain label or text, up to 5000 characters (longer is refused with 400)","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"level":{"type":["null","string"]},"characterCount":{"type":["null","number"]},"scripts":{"type":["array","null"],"items":{"type":"object","properties":{"script":{"type":["null","string"]},"count":{"type":["null","number"]}}}},"resolvedScriptSet":{"type":["array","null"]},"mixedScriptWords":{"type":["array","null"],"items":{"type":"object","properties":{"word":{"type":["null","string"]},"level":{"type":["null","string"]},"scripts":{"type":["array","null"],"items":{"type":"string"}}}}},"whole_text_note":{"type":["null","string"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"MINIMALLY_RESTRICTIVE","summary":"Restriction level minimally restrictive; scripts: Latin, Han, Cyrillic; at least one word mixes scripts in a spoofable way.","reasons":["Scripts are mixed beyond the safe combinations (for example Latin with Cyrillic or Greek); homoglyph spoofing is possible."],"level":"MINIMALLY_RESTRICTIVE","characterCount":21,"scripts":[{"script":"Latin","count":16},{"script":"Common","count":2}],"resolvedScriptSet":[],"mixedScriptWords":[{"word":"pаypal","level":"MINIMALLY_RESTRICTIVE","scripts":["Latin","Cyrillic"]},{"word":"東京tokyo","level":"HIGHLY_RESTRICTIVE","scripts":["Han","Latin"]}],"whole_text_note":"Level is computed over the whole text; UTS #39 applies it per identifier, so for a sentence read mixedScriptWords.","degraded":false,"notChecked":["the exact Identifier_Status table of UTS #39 (the minimally-restrictive test uses ID_Continue as an approximation)","whether the mix is deliberate"],"source":"computed locally","asOf":"2026-10-21T01:34:52.529Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/script-mix"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/script-mix"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/script-mix"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/script-mix"}}]}}},"/text-sanitize":{"get":{"operationId":"text_sanitize","summary":"Strip zero-width, bidi, tag, stray variation-selector and control characters; returns cleaned text and what was removed.","description":"Strip zero-width, bidi, tag, stray variation-selector and control characters; returns cleaned text and what was removed.","tags":["unicode","sanitize","prompt-injection","security"],"parameters":[{"name":"text","in":"query","required":true,"description":"Text to clean, up to 20000 characters (longer is refused with 400)","schema":{"type":"string"}},{"name":"spaces","in":"query","required":false,"description":"ascii (default) turns unusual spaces such as NBSP into U+0020; keep leaves them","schema":{"type":"string"}},{"name":"keep","in":"query","required":false,"description":"emoji (default) keeps joiners and variation selectors that are normal in emoji and CJK text; none removes them all","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"cleaned":{"type":["null","string"]},"changed":{"type":["boolean","null"]},"removedCount":{"type":["null","number"]},"replacedCount":{"type":["null","number"]},"removed":{"type":["array","null"],"items":{"type":"object","properties":{"index":{"type":["null","number"]},"utf16Index":{"type":["null","number"]},"line":{"type":["null","number"]},"column":{"type":["null","number"]},"codepoint":{"type":["null","string"]},"name":{"type":["null","string"]},"class":{"type":["null","string"]},"action":{"type":["null","string"]}}}},"replaced":{"type":["array","null"],"items":{"type":"object","properties":{"index":{"type":["null","number"]},"utf16Index":{"type":["null","number"]},"line":{"type":["null","number"]},"column":{"type":["null","number"]},"codepoint":{"type":["null","string"]},"name":{"type":["null","string"]},"class":{"type":["null","string"]},"action":{"type":["null","string"]}}}},"hiddenTagMessage":{"type":["null","string"]},"listsTruncated":{"type":["boolean","null"]},"inputCodePoints":{"type":["null","number"]},"outputCodePoints":{"type":["null","number"]},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"CLEANED","summary":"Removed 4 and replaced 1 character(s); 19 code point(s) remain.","reasons":["Removed tag characters that spelled a hidden message: \"hi\".","Joiners and variation selectors that are normal in emoji and CJK text were kept; pass keep=none to remove them too."],"cleaned":"Hello world ok 👨‍👩️","changed":true,"removedCount":4,"replacedCount":1,"removed":[{"index":5,"utf16Index":5,"line":1,"column":6,"codepoint":"U+200B","name":"ZERO WIDTH SPACE","class":"ZERO_WIDTH","action":"removed"},{"index":12,"utf16Index":12,"line":1,"column":13,"codepoint":"U+202E","name":"RIGHT-TO-LEFT OVERRIDE","class":"BIDI_CONTROL","action":"removed"}],"replaced":[{"index":13,"utf16Index":13,"line":1,"column":14,"codepoint":"U+00A0","name":"NO-BREAK SPACE","class":"UNUSUAL_SPACE","action":"replaced with U+0020"}],"hiddenTagMessage":"hi","listsTruncated":false,"inputCodePoints":23,"outputCodePoints":19,"degraded":false,"notChecked":["look-alike letters from other scripts (use /confusables)","instructions written in visible characters","…1 more"],"source":"computed locally","asOf":"2026-10-21T01:34:52.788Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/text-sanitize"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/text-sanitize"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/text-sanitize"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/text-sanitize"}}]}}},"/utf8-bytes":{"get":{"operationId":"utf8_bytes","summary":"UTF-8 bytes of text, or validate a hex byte string as UTF-8 and name overlong, surrogate and truncated sequences.","description":"UTF-8 bytes of text, or validate a hex byte string as UTF-8 and name overlong, surrogate and truncated sequences.","tags":["unicode","utf-8","encoding","validation","bytes"],"parameters":[{"name":"text","in":"query","required":false,"description":"Text to encode, up to 2000 characters. Give text or hex","schema":{"type":"string"}},{"name":"hex","in":"query","required":false,"description":"Hex bytes to validate, up to 4000 bytes, e.g. \"E2 82 AC\" or \"C0 80\". Give text or hex","schema":{"type":"string"}}],"responses":{"200":{"description":"The answer.","content":{"application/json":{"schema":{"type":"object","properties":{"verdict":{"type":["null","string"]},"summary":{"type":["null","string"]},"reasons":{"type":["array","null"],"items":{"type":"string"}},"mode":{"type":["null","string"]},"byteCount":{"type":["null","number"]},"valid":{"type":["boolean","null"]},"errors":{"type":["array","null"],"items":{"type":"object","properties":{"offset":{"type":["null","number"]},"byte":{"type":["null","string"]},"kind":{"type":["null","string"]},"note":{"type":["null","string"]}}}},"decodedText":{},"decodedCodePoints":{},"degraded":{"type":["boolean","null"]},"notChecked":{"type":["array","null"],"items":{"type":"string"}},"source":{"type":["null","string"]},"asOf":{"type":["null","string"]},"disclaimer":{"type":["null","string"]}}},"example":{"verdict":"INVALID_UTF8","summary":"6 error(s) in 11 byte(s); first at offset 3: OVERLONG.","reasons":["Overlong forms and surrogates are rejected by the standard because they let one character be written several ways, which has been used to bypass filters."],"mode":"validate","byteCount":11,"valid":false,"errors":[{"offset":3,"byte":"C0","kind":"OVERLONG","note":"C0 can only start an overlong 2-byte encoding of an ASCII character; it is never valid UTF-8."},{"offset":4,"byte":"80","kind":"UNEXPECTED_CONTINUATION","note":"A continuation byte (80..BF) with no leading byte before it."}],"decodedText":null,"decodedCodePoints":null,"degraded":false,"notChecked":["whether the bytes are meant to be UTF-8 at all (legacy encodings such as Latin-1 fail validation)","normalization or visual meaning of the decoded text"],"source":"computed locally","asOf":"2026-10-21T01:34:53.054Z","disclaimer":"Screening signal computed from the named public source. Not financial, legal or investment advice; provided as is. Verify at the source before acting."}}}},"400":{"description":"A parameter was missing or out of range."},"402":{"description":"Payment Required"},"502":{"description":"The upstream source failed or timed out."}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.0200"},"protocols":[{"x402":{"network":"eip155:8453","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/utf8-bytes"}},{"x402":{"network":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/utf8-bytes"}},{"x402":{"network":"eip155:137","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/utf8-bytes"}},{"x402":{"network":"eip155:42161","scheme":"exact","currency":"USDC","endpoint":"https://unicode-text-tools.x402tookit.com/utf8-bytes"}}]}}}}}