{"components":{"schemas":{"AnalyzeRequest":{"properties":{"categories":{"description":"Restrict findings to these categories (omit for all)","items":{"enum":["a11y","geo","usability","legal","seo"],"type":"string"},"type":"array"},"max_pages":{"default":5,"description":"Max pages to follow from the start URL","maximum":20,"minimum":1,"type":"integer"},"url":{"description":"Page URL to crawl and analyse","format":"uri","type":"string"}},"required":["url"],"type":"object"},"Error":{"properties":{"error":{"type":"string"}},"type":"object"},"Finding":{"properties":{"category":{"enum":["a11y","geo","usability","legal","seo"],"type":"string"},"id":{"type":"string"},"remediation":{"type":"string"},"severity":{"enum":["Critical","High","Medium","Low"],"type":"string"},"status":{"enum":["FAIL","POTENTIAL FAIL","PASS"],"type":"string"},"title":{"type":"string"},"url":{"format":"uri","type":"string"}},"type":"object"},"PaginatedResults":{"properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"results":{"items":{"properties":{"crawled_at":{"type":"string"},"pages_crawled":{"type":"integer"},"scores":{"$ref":"#/components/schemas/Scores"}},"type":"object"},"type":"array"},"total":{"type":"integer"}},"type":"object"},"Scores":{"properties":{"a11y":{"maximum":100,"minimum":0,"type":"integer"},"geo":{"maximum":100,"minimum":0,"type":"integer"},"legal":{"maximum":100,"minimum":0,"type":"integer"},"overall":{"maximum":100,"minimum":0,"type":"integer"},"seo":{"maximum":100,"minimum":0,"type":"integer"},"usability":{"maximum":100,"minimum":0,"type":"integer"}},"type":"object"},"Target":{"properties":{"id":{"type":"integer"},"last_crawled":{"format":"date-time","type":"string"},"last_crawled_pages":{"type":"integer"},"latest_scores":{"$ref":"#/components/schemas/Scores"},"name":{"type":"string"},"url":{"format":"uri","type":"string"}},"type":"object"}},"securitySchemes":{"ApiKeyAuth":{"in":"header","name":"X-API-Key","type":"apiKey"}}},"info":{"contact":{"name":"Crownpeak Sales Engineering"},"description":"Programmatic access to audit results, findings, cluster aggregates, and on-demand page analysis.\n\n**Authentication:** all endpoints require an `X-API-Key` header. Generate keys in the dashboard under Settings \u2192 API Keys (admin).\n\n**Rate limit:** 60 requests per minute per key.","title":"Site Quality Audit API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/analyze":{"post":{"description":"Synchronously crawls a URL and returns findings and scores. Expect 5\u201330 s response time depending on page count and server speed. Useful for preview/staging hooks or one-off checks.","operationId":"analyzeUrl","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeRequest"}}},"required":true},"responses":{"200":{"description":"Analysis result with scores and findings"},"400":{"description":"Invalid request \u2014 url missing"},"500":{"description":"Crawl error"}},"summary":"Ad-hoc page analysis"}},"/clusters":{"get":{"operationId":"listClusters","responses":{"200":{"description":"Array of cluster objects with averaged scores"}},"summary":"List all clusters with aggregated scores"}},"/clusters/{id}/results":{"get":{"description":"Returns averaged scores and merged findings across all targets assigned to the cluster.","operationId":"getClusterResults","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"description":"Filter merged findings by category","in":"query","name":"category","schema":{"type":"string"}}],"responses":{"200":{"description":"Aggregated scores, finding count, and merged findings"},"404":{"description":"Cluster not found"}},"summary":"Aggregated results for a cluster"}},"/targets":{"get":{"description":"Returns every configured target with its latest overall and per-category scores.","operationId":"listTargets","responses":{"200":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Target"},"type":"array"}}},"description":"Array of Target objects"},"401":{"description":"Missing or invalid API key"}},"summary":"List all audit targets"}},"/targets/{id}":{"get":{"operationId":"getTarget","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Target object"},"404":{"description":"Not found"}},"summary":"Get a single target"}},"/targets/{id}/findings":{"get":{"description":"Returns findings from the most recent completed crawl, optionally filtered.","operationId":"getFindings","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"query","name":"category","schema":{"type":"string"}},{"in":"query","name":"severity","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"}}],"responses":{"200":{"description":"Filtered findings list"}},"summary":"Findings from the latest crawl"}},"/targets/{id}/results":{"get":{"operationId":"getResultHistory","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"in":"query","name":"page","schema":{"default":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"default":20,"maximum":50,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedResults"}}},"description":"Paginated results"}},"summary":"Paginated crawl history"}},"/targets/{id}/results/latest":{"get":{"description":"Returns scores and findings from the most recent completed crawl. Supports query-string filters.","operationId":"getLatestResult","parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"integer"}},{"description":"a11y | geo | usability | legal | seo","in":"query","name":"category","schema":{"type":"string"}},{"description":"Critical | High | Medium | Low","in":"query","name":"severity","schema":{"type":"string"}},{"description":"FAIL | POTENTIAL FAIL | PASS","in":"query","name":"status","schema":{"type":"string"}}],"responses":{"200":{"description":"Result with scores and filtered findings"},"404":{"description":"No completed results"}},"summary":"Latest completed crawl result"}}},"security":[{"ApiKeyAuth":[]}],"servers":[{"description":"Current server","url":"/api/v1"}]}
