{"openapi":"3.1.0","info":{"title":"Outrings API","version":"2.0.0","description":"Measured website analysis. Every result is produced by deterministic server-side code, not by a model: the same observations under the same ruleset produce the same result. Anything that could not be determined is returned with a status outside pass/warn/fail and scored:false, and must never be read as a pass.","contact":{"url":"https://www.outrings.com/docs"},"license":{"name":"Free to use, no key required"}},"servers":[{"url":"https://www.outrings.com"}],"paths":{"/api/v1/score":{"get":{"summary":"Overall and per-category scores.","description":"Cheapest useful call. No findings or prose.","operationId":"getScore","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreResult"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/summary":{"get":{"summary":"Scores plus ranked priority actions.","description":"Best default for an assistant: enough to answer and to advise, without the full report.","operationId":"getSummary","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditSummary"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/full":{"get":{"summary":"Complete report including inventories and share previews.","description":"Everything the engine produced. Accepts format=compact, failedOnly and minSeverity to trim it.","operationId":"getFull","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditSummary"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/changes":{"get":{"summary":"What changed since this site was last audited.","description":"Re-audits, then diffs against the previous snapshot. comparable=false means history starts now.","operationId":"getChanges","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeSet"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/history":{"get":{"summary":"Stored snapshots for this site.","description":"Reads history only and never fetches the target, so it works while the site is down.","operationId":"getHistory","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/llm":{"get":{"summary":"The audit as Markdown written for a language model.","operationId":"getLlmReport","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"passes","in":"query","required":false,"description":"Include passing checks as well as problems.","schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Markdown report","content":{"text/markdown":{"schema":{"type":"string"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/seo":{"get":{"summary":"Verdict and findings for SEO.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getSeo","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"SEO result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/local":{"get":{"summary":"Verdict and findings for Local & Regional.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getLocal","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Local & Regional result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/ai":{"get":{"summary":"Verdict and findings for AI Visibility.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getAi","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"AI Visibility result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/dns":{"get":{"summary":"Verdict and findings for DNS & Email.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getDns","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"DNS & Email result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/tls":{"get":{"summary":"Verdict and findings for TLS & Certificate.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getTls","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"TLS & Certificate result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/security":{"get":{"summary":"Verdict and findings for Security.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getSecurity","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Security result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/privacy":{"get":{"summary":"Verdict and findings for Privacy & Policies.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getPrivacy","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Privacy & Policies result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/infra":{"get":{"summary":"Verdict and findings for Infrastructure.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getInfra","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Infrastructure result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/tech":{"get":{"summary":"Verdict and findings for Tech Stack & APIs.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getTech","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Tech Stack & APIs result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/content":{"get":{"summary":"Verdict and findings for Content Quality.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getContent","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Content Quality result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/slop":{"get":{"summary":"Verdict and findings for AI-Slop Detector.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getSlop","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"AI-Slop Detector result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/design":{"get":{"summary":"Verdict and findings for Design & UX.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getDesign","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Design & UX result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/a11y":{"get":{"summary":"Verdict and findings for Accessibility.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getA11y","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Accessibility result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/credibility":{"get":{"summary":"Verdict and findings for Credibility.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getCredibility","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Credibility result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/correlation":{"get":{"summary":"Verdict and findings for Title-Content Match.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getCorrelation","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Title-Content Match result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/faq":{"get":{"summary":"Verdict and findings for FAQ & Questions.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getFaq","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"FAQ & Questions result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/discoverability":{"get":{"summary":"Verdict and findings for Discoverability.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getDiscoverability","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Discoverability result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/v1/contact":{"get":{"summary":"Verdict and findings for Contact & Exposure.","description":"Single-category result. Undetermined checks are returned in their own bucket and must not be read as passes.","operationId":"getContact","parameters":[{"name":"url","in":"query","required":true,"description":"Target URL. The scheme may be omitted (example.com works).","schema":{"type":"string","example":"example.com"}},{"name":"failedOnly","in":"query","required":false,"schema":{"type":"boolean","default":false}},{"name":"minSeverity","in":"query","required":false,"schema":{"type":"string","enum":["low","medium","high","critical"]}}],"responses":{"200":{"description":"Contact & Exposure result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryResponse"}}}},"400":{"description":"Invalid target URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Target resolves to a private or reserved address","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limited: 40 audits per hour, 200 per day, per caller","headers":{"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitError"}}}},"502":{"description":"Target could not be fetched","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"schemas":{"Provenance":{"type":"object","description":"How a value was arrived at. Lets a caller weight claims differently instead of treating every field as equally certain.","properties":{"classification":{"type":"string","enum":["measured","derived","inferred","external"],"description":"measured: observed directly in a response. derived: computed deterministically from observations. inferred: heuristic, can be wrong. external: from a third party (none currently used)."},"confidence":{"type":"number","format":"float","minimum":0,"maximum":1},"method":{"type":"string","nullable":true,"description":"The observation that produced it, e.g. robots_rule_match, dns_query, tls_handshake."}}},"Evidence":{"description":"Raw material behind a verdict. Shape varies by check; always JSON.","nullable":true,"oneOf":[{"type":"object"},{"type":"array","items":[]},{"type":"string"}]},"CheckResult":{"type":"object","required":["id","title","status","scored","tested","found","why"],"properties":{"id":{"type":"string","example":"sec.csp"},"title":{"type":"string"},"status":{"type":"string","enum":["pass","warn","fail","info","na","unknown","blocked","timeout","inconclusive","requires_browser"]},"scored":{"type":"boolean","description":"False for every status outside pass/warn/fail. An unscored check must never be read as a pass."},"severity":{"type":"string","enum":["low","medium","high","critical"],"nullable":true},"effort":{"type":"string","enum":["trivial","low","medium","high"],"nullable":true},"tested":{"type":"string","description":"What was examined."},"found":{"type":"string","description":"What was observed."},"why":{"type":"string"},"fix":{"type":"string"},"weight":{"type":"number","format":"float"},"group":{"type":"string","nullable":true,"description":"Sub-group within the category, where the category declares them."},"classification":{"type":"string","enum":["measured","derived","inferred","external"]},"confidence":{"type":"number","format":"float"},"method":{"type":"string","nullable":true},"evidence":{"$ref":"#/components/schemas/Evidence"}}},"UndeterminedCheck":{"type":"object","description":"A check that reached no verdict. Kept in its own bucket precisely so it cannot be mistaken for a pass.","required":["id","title","status"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"status":{"type":"string","enum":["unknown","blocked","timeout","inconclusive","requires_browser"]},"reason":{"type":"string"},"why":{"type":"string"}}},"Counts":{"type":"object","additionalProperties":{"type":"integer"},"description":"Number of checks per status. Keys are the status enum."},"Coverage":{"type":"number","format":"float","minimum":0,"maximum":1,"description":"Share of checks that reached a verdict. Below 1 means part of the picture is missing, not that it passed."},"CategoryGroup":{"type":"object","description":"A sub-group within a category, scored separately because its checks are not equally knowable.","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"epistemic":{"type":"string","description":"What kind of claim this group makes, in plain words."},"score":{"type":"number","format":"float","nullable":true},"checks":{"type":"integer"},"scoredChecks":{"type":"integer"},"counts":{"$ref":"#/components/schemas/Counts"},"checkIds":{"type":"array","items":{"type":"string"}}}},"CategoryResult":{"type":"object","required":["id","name","score"],"properties":{"id":{"type":"string","enum":["seo","local","ai","dns","tls","security","privacy","infra","tech","content","slop","design","a11y","credibility","correlation","faq","discoverability","contact"]},"name":{"type":"string"},"description":{"type":"string"},"weight":{"type":"number","format":"float"},"score":{"type":"number","format":"float","nullable":true,"description":"null when no check in the category reached a verdict."},"coverage":{"$ref":"#/components/schemas/Coverage"},"counts":{"$ref":"#/components/schemas/Counts"},"note":{"type":"string","nullable":true},"groups":{"type":"array","items":{"$ref":"#/components/schemas/CategoryGroup"}},"checks":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}}}},"PriorityAction":{"type":"object","properties":{"rank":{"type":"integer"},"title":{"type":"string"},"category":{"type":"string"},"categoryId":{"type":"string","enum":["seo","local","ai","dns","tls","security","privacy","infra","tech","content","slop","design","a11y","credibility","correlation","faq","discoverability","contact"]},"severity":{"type":"string","enum":["low","medium","high","critical"]},"effort":{"type":"string","enum":["trivial","low","medium","high"]},"pointsIfFixed":{"type":"number","format":"float"},"found":{"type":"string"},"why":{"type":"string"},"action":{"type":"string"}}},"Versions":{"type":"object","description":"Published because a score legitimately moves when either the observed system or the ruleset changes.","properties":{"schema":{"type":"string","example":"2.0"},"ruleset":{"type":"string","example":"2026.08.2"},"collector":{"type":"string","example":"2.0"}}},"Grade":{"type":"string","enum":["A+","A","A-","B+","B","B-","C+","C","C-","D+","D","D-","F"]},"Verdict":{"type":"string","enum":["excellent","good","fair","needs work","poor","critical"]},"NotCovered":{"type":"array","items":{"type":"string"},"description":"Stated on every response so a model cannot over-claim from this data."},"ScoreResult":{"type":"object","required":["ok","url","score","grade"],"properties":{"ok":{"type":"boolean"},"url":{"type":"string","format":"uri"},"score":{"type":"number","format":"float","minimum":0,"maximum":100},"grade":{"$ref":"#/components/schemas/Grade"},"verdict":{"$ref":"#/components/schemas/Verdict"},"counts":{"$ref":"#/components/schemas/Counts"},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","nullable":true},"weight":{"type":"number"}}}},"auditedAt":{"type":"string","format":"date-time"},"notCovered":{"$ref":"#/components/schemas/NotCovered"}}},"AuditSummary":{"type":"object","required":["ok","url","score","grade","priorityActions"],"properties":{"ok":{"type":"boolean"},"url":{"type":"string","format":"uri"},"score":{"type":"number","format":"float"},"grade":{"$ref":"#/components/schemas/Grade"},"verdict":{"$ref":"#/components/schemas/Verdict"},"counts":{"$ref":"#/components/schemas/Counts"},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"score":{"type":"number","nullable":true},"verdict":{"type":"string"},"affects":{"type":"array","items":{"type":"string"}}}}},"priorityActions":{"type":"array","items":{"$ref":"#/components/schemas/PriorityAction"}},"opportunity":{"type":"object"},"auditedAt":{"type":"string","format":"date-time"},"notCovered":{"$ref":"#/components/schemas/NotCovered"}}},"CategoryResponse":{"type":"object","required":["ok","category","score"],"properties":{"ok":{"type":"boolean"},"url":{"type":"string","format":"uri"},"category":{"type":"string","enum":["seo","local","ai","dns","tls","security","privacy","infra","tech","content","slop","design","a11y","credibility","correlation","faq","discoverability","contact"]},"name":{"type":"string"},"score":{"type":"number","nullable":true},"verdict":{"type":"string"},"weight":{"type":"number"},"counts":{"$ref":"#/components/schemas/Counts"},"groups":{"type":"array","items":{"$ref":"#/components/schemas/CategoryGroup"}},"affects":{"type":"array","items":{"type":"string"}},"impact":{"type":"string"},"ifIgnored":{"type":"string"},"methodNote":{"type":"string","nullable":true},"aliasedFrom":{"type":"string","nullable":true},"problems":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}},"passing":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}},"notApplicable":{"type":"array","items":{"$ref":"#/components/schemas/CheckResult"}},"undetermined":{"type":"array","items":{"$ref":"#/components/schemas/UndeterminedCheck"}},"priorityActions":{"type":"array","items":{"$ref":"#/components/schemas/PriorityAction"}},"auditedAt":{"type":"string","format":"date-time"},"notCovered":{"$ref":"#/components/schemas/NotCovered"}}},"Snapshot":{"type":"object","properties":{"at":{"type":"string","format":"date-time"},"score":{"type":"number","nullable":true},"grade":{"$ref":"#/components/schemas/Grade"},"categories":{"type":"object","additionalProperties":{"type":"number","nullable":true}},"problemCount":{"type":"integer"},"source":{"type":"string","enum":["audit","api","cron"]}}},"ChangeSet":{"type":"object","properties":{"ok":{"type":"boolean"},"host":{"type":"string"},"comparable":{"type":"boolean","description":"False when there is no earlier snapshot. Not an error."},"from":{"$ref":"#/components/schemas/Snapshot"},"to":{"$ref":"#/components/schemas/Snapshot"},"spanHours":{"type":"number","nullable":true},"scoreDelta":{"type":"number","nullable":true},"direction":{"type":"string","enum":["improved","regressed","stable","unknown"]},"summary":{"type":"string"},"newProblems":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["fail","warn"]}}}},"resolved":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"was":{"type":"string","enum":["fail","warn"]}}}},"worsened":{"type":"array","items":{"type":"object"}},"partlyImproved":{"type":"array","items":{"type":"object"}},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"from":{"type":"number","nullable":true},"to":{"type":"number","nullable":true},"delta":{"type":"number","nullable":true},"note":{"type":"string"}}}},"note":{"type":"string"}}},"HistoryResponse":{"type":"object","properties":{"ok":{"type":"boolean"},"host":{"type":"string","description":"The host that was asked for."},"snapshotHost":{"type":"string","nullable":true,"description":"The host snapshots are filed under \u2014 the host an audit ended on after redirects, which is often the www form."},"points":{"type":"integer"},"note":{"type":"string"},"history":{"type":"array","items":{"$ref":"#/components/schemas/Snapshot"}},"timeline":{"type":"array","items":{"$ref":"#/components/schemas/ChangeSet"}}}},"ApiError":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"detail":{"description":"Optional extra context.","oneOf":[{"type":"string"},{"type":"array","items":[]},{"type":"object"}]}}},"RateLimitError":{"allOf":[{"$ref":"#/components/schemas/ApiError"},{"type":"object","properties":{"retryAfter":{"type":"integer","description":"Seconds until the window resets."},"limit":{"type":"integer"},"window":{"type":"string","enum":["hour","day"]}}}]}}},"x-rulesetVersion":"2026.08.2","x-mcpEndpoint":"https://www.outrings.com/mcp"}