{"openapi":"3.1.0","info":{"title":"GlyphGuard Unicode Security API","version":"0.1.0","description":"Detect Unicode confusables, invisible characters, bidi controls, mixed scripts, and IDN lookalikes.","license":{"name":"Proprietary"}},"servers":[{"url":"/","description":"Current origin"}],"paths":{"/health":{"get":{"operationId":"health","summary":"Service health","responses":{"200":{"description":"Healthy"}}}},"/v1/info":{"get":{"operationId":"info","summary":"Service and payment metadata","responses":{"200":{"description":"Metadata"}}}},"/v1/demo":{"post":{"operationId":"demo","summary":"Run one free, rate-limited Unicode inspection","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","minLength":1,"maxLength":256},"mode":{"type":"string","enum":["text","domain"],"default":"text"},"trusted_domain":{"type":"string"}}}}}},"responses":{"200":{"description":"Demo analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"429":{"description":"Demo rate limit exceeded"}}}},"/v1/analyze-text":{"post":{"operationId":"analyzeText","summary":"Analyze Unicode text","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","maxLength":10000},"identifier":{"type":"boolean","default":false}}}}}},"responses":{"200":{"description":"Analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"x402 payment required"},"429":{"description":"Rate limit exceeded"}}}},"/v1/analyze-domain":{"post":{"operationId":"analyzeDomain","summary":"Analyze an internationalized domain or URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"additionalProperties":false,"properties":{"domain":{"type":"string"},"trusted_domains":{"type":"array","maxItems":100,"items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"x402 payment required"},"429":{"description":"Rate limit exceeded"}}}},"/v1/compare":{"post":{"operationId":"compare","summary":"Compare two strings for visual confusability","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["left","right"],"additionalProperties":false,"properties":{"left":{"type":"string","maxLength":10000},"right":{"type":"string","maxLength":10000}}}}}},"responses":{"200":{"description":"Analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"x402 payment required"},"429":{"description":"Rate limit exceeded"}}}},"/v1/sanitize":{"post":{"operationId":"sanitize","summary":"Remove unsafe controls and normalize text","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","maxLength":10000},"options":{"type":"object","additionalProperties":false,"properties":{"remove_controls":{"type":"boolean","default":true},"replace_confusables":{"type":"boolean","default":false},"normalization":{"type":"string","enum":["NFC","NFD","NFKC","NFKD"],"default":"NFC"}}}}}}}},"responses":{"200":{"description":"Analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"x402 payment required"},"429":{"description":"Rate limit exceeded"}}}},"/v1/batch":{"post":{"operationId":"batch","summary":"Run up to 50 Unicode security operations","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["operations"],"additionalProperties":false,"properties":{"operations":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["operation"],"properties":{"operation":{"enum":["analyze-text","analyze-domain","compare","sanitize"]}},"additionalProperties":true}}}}}}},"responses":{"200":{"description":"Analysis completed"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"},"request_id":{"type":"string","format":"uuid"}}}}}},"402":{"description":"x402 payment required"},"429":{"description":"Rate limit exceeded"}}}}}}