{"openapi":"3.1.0","info":{"title":"Visora — free AI visibility & agent-readiness endpoints","version":"1.0.0","description":"Free, unauthenticated endpoints for measuring how AI engines and AI agents see a website. Visora is a Hong Kong AI visibility (GEO) and agent-readiness platform. An MCP server is available at https://visoraco.com/mcp — see https://visoraco.com/.well-known/mcp.json. llms.txt: https://visoraco.com/llms.txt","contact":{"name":"Visora","url":"https://visoraco.com","email":"info@visoraco.com"}},"servers":[{"url":"https://visoraco.com"}],"paths":{"/api/scan/free":{"post":{"operationId":"startFreeAiVisibilityScan","summary":"Start a free 6-engine AI Visibility Scan (0–100 score, ~60s)","description":"Queries ChatGPT, Google AI, Gemini, Copilot, Perplexity and Doubao for a business and returns a scanId to poll at GET /api/scan/{scanId}.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"website":{"type":"string","description":"Business website domain","example":"example.hk"},"email":{"type":"string","format":"email","description":"Report delivery email (rate-limited per address)"},"businessName":{"type":"string","description":"Business name (improves engine matching)"},"city":{"type":"string","example":"Hong Kong"},"category":{"type":"string","example":"restaurant"}},"required":["website","email"]}}}},"responses":{"200":{"description":"Scan created — poll GET /api/scan/{scanId} until status=complete","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/scan/{scanId}":{"get":{"operationId":"getScanResult","summary":"Poll a free scan by id","parameters":[{"name":"scanId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Scan status and results when complete","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Unknown scanId"}}}},"/api/tools/agent-readiness":{"post":{"operationId":"quickAgentReadiness","summary":"Quick Agent Readiness check — can AI agents access and read this site?","description":"Checks robots.txt against a ~35-token AI bot taxonomy (training/search/agent buckets), no-JS readability, semantic HTML, token budget, llms.txt and markdown delivery. Returns a 0–100 score with per-check fixes. Full 5-dimension audit (3 credits) is available in the platform.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL or bare domain (https:// is prepended when missing)","example":"example.hk"}},"required":["url"]}}}},"responses":{"200":{"description":"Agent Readiness result","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"422":{"description":"Target URL unreachable"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/tools/robots-test":{"post":{"operationId":"testRobotsPath","summary":"Test whether a path is allowed for a given crawler per robots.txt (RFC 9309)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL or bare domain (https:// is prepended when missing)","example":"example.hk"},"path":{"type":"string","example":"/pricing"},"userAgent":{"type":"string","example":"GPTBot"}},"required":["url"]}}}},"responses":{"200":{"description":"Allow/deny verdict with the matched rule","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/tools/seo-audit":{"post":{"operationId":"quickSeoAudit","summary":"Quick on-page SEO audit (title, meta, headings, links)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL or bare domain (https:// is prepended when missing)","example":"example.hk"}},"required":["url"]}}}},"responses":{"200":{"description":"Audit findings","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/pagespeed":{"post":{"operationId":"pageSpeed","summary":"PageSpeed Insights scores for a URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL or bare domain (https:// is prepended when missing)","example":"example.hk"},"strategy":{"type":"string","enum":["mobile","desktop"],"default":"mobile"}},"required":["url"]}}}},"responses":{"200":{"description":"Core Web Vitals + Lighthouse scores","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/meta-preview":{"post":{"operationId":"metaPreview","summary":"Preview how a page’s title/meta render in Google and social cards","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Absolute URL or bare domain (https:// is prepended when missing)","example":"example.hk"}},"required":["url"]}}}},"responses":{"200":{"description":"Extracted title, description, OG/Twitter tags","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/api/som":{"post":{"operationId":"aiMentionCheck","summary":"AI Mention Checker — do AI engines name this business? (share-of-model)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","format":"email"},"businessName":{"type":"string"},"category":{"type":"string"},"city":{"type":"string","example":"Hong Kong"}},"required":["email","businessName"]}}}},"responses":{"200":{"description":"Mention verdicts across AI engines","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request — check the `error` code in the JSON body"},"429":{"description":"Rate limited — back off and retry later"}}}},"/mcp":{"post":{"operationId":"mcpEndpoint","summary":"Model Context Protocol endpoint (JSON-RPC 2.0, streamable-http)","description":"Methods: initialize, tools/list, tools/call, ping. Tools: visora_agent_readiness, visora_check_robots, visora_free_scan, visora_bot_taxonomy. No auth. 60 requests/hour/IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON-RPC 2.0 message (batch arrays accepted)"}}}},"responses":{"200":{"description":"JSON-RPC 2.0 response"},"405":{"description":"GET (SSE streaming) not supported"}}}}}}