{"openapi":"3.1.0","info":{"title":"Sailop API","version":"1.0.0","summary":"Scan a public web page for the design defaults AI site builders leave behind.","description":"One operation: fetch a public page and up to six of its stylesheets, check eight AI-builder design signatures, and return the evidence and a fix kit. Anonymous, no key. The same scan is available as an MCP tool at https://sailop.com/api/mcp. Docs: https://sailop.com/docs/api","contact":{"name":"Sailop support","email":"contact@sailop.com","url":"https://sailop.com/contact"},"termsOfService":"https://sailop.com/terms"},"externalDocs":{"description":"API documentation","url":"https://sailop.com/docs/api"},"servers":[{"url":"https://sailop.com"}],"paths":{"/api/scan/url":{"post":{"operationId":"scanUrl","summary":"Scan one public page","description":"Rate limited per client address: 6 scans a minute, 60 an hour. Only public http(s) pages on standard ports; private networks are refused. The page and the result are not stored.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048,"description":"Full URL or bare domain (https is assumed)","examples":["example.com"]}},"required":["url"]}}}},"responses":{"200":{"description":"Scan result","headers":{"X-RateLimit-Remaining":{"schema":{"type":"integer"},"description":"Scans left in the tightest window"}},"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"Final URL after redirects"},"bytes":{"type":"integer","description":"Size of the HTML read"},"stylesheets":{"type":"integer","description":"Stylesheets fetched (at most 6)"},"slopScore":{"type":"integer","minimum":0,"maximum":100,"description":"Sum of the weights of the signatures found"},"grade":{"type":"string","enum":["A","B","C","D","F"]},"detected":{"type":"integer","minimum":0,"maximum":8},"total":{"type":"integer","const":8},"signatures":{"type":"array","items":{"type":"string","enum":["tailwind-blue","blue-purple-gradient","default-font","three-card-grid","fade-up-motion","glassmorphism","generic-cta","rounded-shadow-card"]}},"tells":{"type":"array","items":{"type":"object","properties":{"severity":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","description":"ai-<signature id>","examples":["ai-tailwind-blue"]},"weight":{"type":"integer"},"message":{"type":"string"},"suggestion":{"type":"string"},"count":{"type":"integer","description":"Occurrences in markup and stylesheets together"},"matched":{"type":"string","description":"First literal token matched on the page"}},"required":["severity","category","weight","message","suggestion","count","matched"]}},"buckets":{"type":"object","additionalProperties":{"type":"array","items":{"type":"object","properties":{"severity":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","description":"ai-<signature id>","examples":["ai-tailwind-blue"]},"weight":{"type":"integer"},"message":{"type":"string"},"suggestion":{"type":"string"},"count":{"type":"integer","description":"Occurrences in markup and stylesheets together"},"matched":{"type":"string","description":"First literal token matched on the page"}},"required":["severity","category","weight","message","suggestion","count","matched"]}}},"other":{"type":"array","items":{"type":"object","properties":{"severity":{"type":"string","enum":["high","medium","low"]},"category":{"type":"string","description":"ai-<signature id>","examples":["ai-tailwind-blue"]},"weight":{"type":"integer"},"message":{"type":"string"},"suggestion":{"type":"string"},"count":{"type":"integer","description":"Occurrences in markup and stylesheets together"},"matched":{"type":"string","description":"First literal token matched on the page"}},"required":["severity","category","weight","message","suggestion","count","matched"]}},"fix":{"description":"Fix kit, null when nothing was found. Design system seeded from the hostname, swaps, theme, fonts and an agent brief.","oneOf":[{"type":"null"},{"type":"object","properties":{"seed":{"type":"string"},"system":{"type":"object"},"artifacts":{"type":"object","properties":{"themeCss":{"type":"string"},"rootCss":{"type":"string"},"tailwindConfig":{"type":"string"},"fontHtml":{"type":"string"},"fontNext":{"type":"string"}}},"steps":{"type":"array","items":{"type":"object"}},"agentPrompt":{"type":"string"},"summary":{"type":"object"}}}]}},"required":["url","slopScore","grade","detected","total","signatures","tells","fix"]}}}},"400":{"description":"Bad address, page unreachable or refused. The message is written for the caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited. See Retry-After.","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Scanner at capacity, retry in a few seconds.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}