{"openapi":"3.1.0","info":{"title":"Unicode Confusable and Invisible Guard API","version":"1.0.0","description":"Inspect hidden and mixed-script Unicode text, normalize with an explicit change map, compare UTS #39 confusable skeletons, and check identifier policies using pinned Unicode 17.0.0 data. Processing is bounded and stateless; payloads are not stored and no model or network lookup is used. Results are evidence, not a font-dependent visual guarantee or malware verdict."},"paths":{"/marketplace/rapid/unicode/v1/inspect":{"post":{"tags":["Unicode Text Inspect"],"summary":"Inspect Unicode text","description":"Find exact bidi controls, invisible/default-ignorable characters, control or unassigned code points, mixed-script tokens, and mixed digit systems using pinned Unicode 17 data.","operationId":"inspectUnicodeText","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnicodeInspectRequest"},"examples":{"example":{"summary":"Inspect Unicode text","value":{"text":"Approve paypаl after review‮","allow_line_breaks":true}}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnicodeInspectResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/rapid/unicode/v1/normalize":{"post":{"tags":["Unicode Text Normalize"],"summary":"Normalize Unicode text","description":"Return NFC or NFKC text with a bounded code-point change map and a post-normalization security inspection; characters are never silently stripped.","operationId":"normalizeUnicodeText","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NormalizeRequest"},"examples":{"example":{"summary":"Normalize Unicode text","value":{"text":"Café and Ａgent","form":"NFC"}}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NormalizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/rapid/unicode/v1/confusables/compare":{"post":{"tags":["Unicode Confusable Compare"],"summary":"Compare confusable identifiers","description":"Compare two bounded strings with the Unicode 17 UTS #39 skeleton transform and distinguish exact, canonical-equivalent, and confusable results.","operationId":"compareUnicodeConfusables","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfusableCompareRequest"},"examples":{"example":{"summary":"Compare confusable identifiers","value":{"left":"paypal","right":"paypаl"}}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfusableCompareResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/marketplace/rapid/unicode/v1/identifiers/check":{"post":{"tags":["Unicode Identifier Check"],"summary":"Check an identifier policy","description":"Check Unicode 17 XID syntax, NFC, UTS #39 allowed status, caller-supplied script policy, and collisions against up to 100 protected identifiers.","operationId":"checkUnicodeIdentifier","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifierCheckRequest"},"examples":{"example":{"summary":"Check an identifier policy","value":{"identifier":"paypаl","protected_identifiers":["paypal"],"allowed_scripts":["Latin"],"require_nfc":true,"require_uts39_allowed":true,"allow_mixed_scripts":false}}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentifierCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ConfusableCompareRequest":{"properties":{"left":{"type":"string","maxLength":8192,"minLength":1,"title":"Left"},"right":{"type":"string","maxLength":8192,"minLength":1,"title":"Right"}},"additionalProperties":false,"type":"object","required":["left","right"],"title":"ConfusableCompareRequest"},"ConfusableCompareResponse":{"properties":{"status":{"type":"string","const":"COMPLETED","title":"Status","default":"COMPLETED"},"decision":{"type":"string","enum":["CLEAR","REVIEW_REQUIRED","BLOCKED"],"title":"Decision"},"exact_equal":{"type":"boolean","title":"Exact Equal"},"canonical_equal":{"type":"boolean","title":"Canonical Equal"},"confusable":{"type":"boolean","title":"Confusable"},"skeleton_equal":{"type":"boolean","title":"Skeleton Equal"},"left_skeleton":{"type":"string","title":"Left Skeleton"},"right_skeleton":{"type":"string","title":"Right Skeleton"},"left_scripts":{"items":{"type":"string"},"type":"array","title":"Left Scripts"},"right_scripts":{"items":{"type":"string"},"type":"array","title":"Right Scripts"},"left_mapped_codepoints":{"type":"integer","title":"Left Mapped Codepoints"},"right_mapped_codepoints":{"type":"integer","title":"Right Mapped Codepoints"},"issues":{"items":{"$ref":"#/components/schemas/UnicodeIssue"},"type":"array","title":"Issues"},"unicode_version":{"type":"string","title":"Unicode Version","default":"17.0.0"},"ruleset_version":{"type":"string","title":"Ruleset Version","default":"2026-08-10"},"visual_guarantee":{"type":"boolean","const":false,"title":"Visual Guarantee","default":false},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["decision","exact_equal","canonical_equal","confusable","skeleton_equal","left_skeleton","right_skeleton","left_scripts","right_scripts","left_mapped_codepoints","right_mapped_codepoints","issues","next_action"],"title":"ConfusableCompareResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentifierCheckRequest":{"properties":{"identifier":{"type":"string","maxLength":8192,"minLength":1,"title":"Identifier"},"protected_identifiers":{"items":{"type":"string"},"type":"array","maxItems":100,"title":"Protected Identifiers"},"allowed_scripts":{"items":{"type":"string"},"type":"array","maxItems":32,"title":"Allowed Scripts"},"require_nfc":{"type":"boolean","title":"Require Nfc","default":true},"require_uts39_allowed":{"type":"boolean","title":"Require Uts39 Allowed","default":true},"allow_mixed_scripts":{"type":"boolean","title":"Allow Mixed Scripts","default":false}},"additionalProperties":false,"type":"object","required":["identifier"],"title":"IdentifierCheckRequest"},"IdentifierCheckResponse":{"properties":{"status":{"type":"string","const":"COMPLETED","title":"Status","default":"COMPLETED"},"decision":{"type":"string","enum":["CLEAR","REVIEW_REQUIRED","BLOCKED"],"title":"Decision"},"syntax_valid":{"type":"boolean","title":"Syntax Valid"},"nfc_normalized":{"type":"boolean","title":"Nfc Normalized"},"uts39_status_allowed":{"type":"boolean","title":"Uts39 Status Allowed"},"scripts":{"items":{"type":"string"},"type":"array","title":"Scripts"},"mixed_scripts":{"type":"boolean","title":"Mixed Scripts"},"script_policy_allowed":{"type":"boolean","title":"Script Policy Allowed"},"skeleton":{"type":"string","title":"Skeleton"},"restricted_codepoints":{"items":{"type":"string"},"type":"array","title":"Restricted Codepoints"},"collisions":{"items":{"$ref":"#/components/schemas/ProtectedCollision"},"type":"array","title":"Collisions"},"issues":{"items":{"$ref":"#/components/schemas/UnicodeIssue"},"type":"array","title":"Issues"},"unicode_version":{"type":"string","title":"Unicode Version","default":"17.0.0"},"ruleset_version":{"type":"string","title":"Ruleset Version","default":"2026-08-10"},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["decision","syntax_valid","nfc_normalized","uts39_status_allowed","scripts","mixed_scripts","script_policy_allowed","skeleton","restricted_codepoints","collisions","issues","next_action"],"title":"IdentifierCheckResponse"},"NormalizationChange":{"properties":{"operation":{"type":"string","enum":["REPLACE","INSERT","DELETE"],"title":"Operation"},"input_start":{"type":"integer","minimum":0.0,"title":"Input Start"},"input_end":{"type":"integer","minimum":0.0,"title":"Input End"},"output_start":{"type":"integer","minimum":0.0,"title":"Output Start"},"output_end":{"type":"integer","minimum":0.0,"title":"Output End"},"input_codepoints":{"items":{"type":"string"},"type":"array","title":"Input Codepoints"},"output_codepoints":{"items":{"type":"string"},"type":"array","title":"Output Codepoints"},"evidence_truncated":{"type":"boolean","title":"Evidence Truncated","default":false}},"additionalProperties":false,"type":"object","required":["operation","input_start","input_end","output_start","output_end","input_codepoints","output_codepoints"],"title":"NormalizationChange"},"NormalizeRequest":{"properties":{"text":{"type":"string","maxLength":262144,"minLength":1,"title":"Text"},"form":{"type":"string","enum":["NFC","NFKC"],"title":"Form","default":"NFC"},"allow_line_breaks":{"type":"boolean","title":"Allow Line Breaks","default":true}},"additionalProperties":false,"type":"object","required":["text"],"title":"NormalizeRequest"},"NormalizeResponse":{"properties":{"status":{"type":"string","const":"COMPLETED","title":"Status","default":"COMPLETED"},"decision":{"type":"string","enum":["CLEAR","REVIEW_REQUIRED","BLOCKED"],"title":"Decision"},"form":{"type":"string","enum":["NFC","NFKC"],"title":"Form"},"changed":{"type":"boolean","title":"Changed"},"normalized_text":{"type":"string","title":"Normalized Text"},"change_count":{"type":"integer","title":"Change Count"},"changes":{"items":{"$ref":"#/components/schemas/NormalizationChange"},"type":"array","title":"Changes"},"post_normalization_findings":{"items":{"$ref":"#/components/schemas/UnicodeFinding"},"type":"array","title":"Post Normalization Findings"},"unicode_version":{"type":"string","title":"Unicode Version","default":"17.0.0"},"ruleset_version":{"type":"string","title":"Ruleset Version","default":"2026-08-10"},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["decision","form","changed","normalized_text","change_count","changes","post_normalization_findings","next_action"],"title":"NormalizeResponse"},"ProtectedCollision":{"properties":{"protected_index":{"type":"integer","minimum":0.0,"title":"Protected Index"},"protected_identifier_sha256":{"type":"string","title":"Protected Identifier Sha256"},"exact_equal":{"type":"boolean","title":"Exact Equal"},"canonical_equal":{"type":"boolean","title":"Canonical Equal"},"confusable":{"type":"boolean","title":"Confusable"}},"additionalProperties":false,"type":"object","required":["protected_index","protected_identifier_sha256","exact_equal","canonical_equal","confusable"],"title":"ProtectedCollision"},"UnicodeFinding":{"properties":{"id":{"type":"string","title":"Id"},"signal":{"type":"string","enum":["BIDI_CONTROL","ZERO_WIDTH_OR_JOIN_CONTROL","DEFAULT_IGNORABLE","CONTROL_OR_FORMAT","NONCHARACTER","PRIVATE_USE","UNASSIGNED","MIXED_SCRIPT_TOKEN","MIXED_DIGIT_SYSTEM"],"title":"Signal"},"severity":{"type":"string","enum":["LOW","MEDIUM","HIGH"],"title":"Severity"},"codepoint_start":{"type":"integer","minimum":0.0,"title":"Codepoint Start"},"codepoint_end":{"type":"integer","minimum":0.0,"title":"Codepoint End"},"utf8_start":{"type":"integer","minimum":0.0,"title":"Utf8 Start"},"utf8_end":{"type":"integer","minimum":0.0,"title":"Utf8 End"},"codepoints":{"items":{"type":"string"},"type":"array","title":"Codepoints"},"evidence_truncated":{"type":"boolean","title":"Evidence Truncated","default":false},"scripts":{"items":{"type":"string"},"type":"array","title":"Scripts"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["id","signal","severity","codepoint_start","codepoint_end","utf8_start","utf8_end","codepoints","next_action"],"title":"UnicodeFinding"},"UnicodeInspectRequest":{"properties":{"text":{"type":"string","maxLength":262144,"minLength":1,"title":"Text"},"allow_line_breaks":{"type":"boolean","title":"Allow Line Breaks","default":true}},"additionalProperties":false,"type":"object","required":["text"],"title":"UnicodeInspectRequest"},"UnicodeInspectResponse":{"properties":{"status":{"type":"string","const":"COMPLETED","title":"Status","default":"COMPLETED"},"decision":{"type":"string","enum":["CLEAR","REVIEW_REQUIRED","BLOCKED"],"title":"Decision"},"finding_count":{"type":"integer","title":"Finding Count"},"counts_by_signal":{"additionalProperties":{"type":"integer"},"type":"object","title":"Counts By Signal"},"findings":{"items":{"$ref":"#/components/schemas/UnicodeFinding"},"type":"array","title":"Findings"},"issues":{"items":{"$ref":"#/components/schemas/UnicodeIssue"},"type":"array","title":"Issues"},"input_bytes":{"type":"integer","title":"Input Bytes"},"nfc_changed":{"type":"boolean","title":"Nfc Changed"},"nfkc_changed":{"type":"boolean","title":"Nfkc Changed"},"unicode_version":{"type":"string","title":"Unicode Version","default":"17.0.0"},"ruleset_version":{"type":"string","title":"Ruleset Version","default":"2026-08-10"},"scan_complete":{"type":"boolean","title":"Scan Complete","default":true},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["decision","finding_count","counts_by_signal","findings","issues","input_bytes","nfc_changed","nfkc_changed","next_action"],"title":"UnicodeInspectResponse"},"UnicodeIssue":{"properties":{"code":{"type":"string","title":"Code"},"severity":{"type":"string","enum":["LOW","MEDIUM","HIGH"],"title":"Severity"},"message":{"type":"string","title":"Message"},"evidence":{"additionalProperties":true,"type":"object","title":"Evidence"},"next_action":{"type":"string","title":"Next Action"}},"additionalProperties":false,"type":"object","required":["code","severity","message","next_action"],"title":"UnicodeIssue"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"Unicode Text Inspect","description":"A bounded, stateless Unicode 17 text and identifier security utility for agents, authentication flows, code review, and workflow automation."},{"name":"Unicode Text Normalize","description":"A bounded, stateless Unicode 17 text and identifier security utility for agents, authentication flows, code review, and workflow automation."},{"name":"Unicode Confusable Compare","description":"A bounded, stateless Unicode 17 text and identifier security utility for agents, authentication flows, code review, and workflow automation."},{"name":"Unicode Identifier Check","description":"A bounded, stateless Unicode 17 text and identifier security utility for agents, authentication flows, code review, and workflow automation."}],"servers":[{"url":"https://api-production-9502.up.railway.app"}]}