{"openapi":"3.0.3","info":{"title":"Seenkite API","version":"1.0.0","description":"Fetch reports, verify fixes and log applied fixes. Authenticate with an organisation API key: Authorization: Bearer $SEENKITE_API_KEY"},"servers":[{"url":"https://seenkite.com/api/v1"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Keys start with skt_live_"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false},"Site":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"schedule":{"type":"string"},"next_run_at":{"nullable":true,"type":"string"},"last_run_at":{"nullable":true,"type":"string"},"search_console":{"type":"boolean"}},"required":["id","name","url","schedule","next_run_at","last_run_at","search_console"],"additionalProperties":false},"Run":{"type":"object","properties":{"id":{"type":"string"},"site_id":{"type":"string"},"status":{"type":"string","enum":["queued","running","succeeded","partial","failed","cancelled"]},"trigger":{"type":"string"},"created_at":{"type":"string"},"started_at":{"nullable":true,"type":"string"},"finished_at":{"nullable":true,"type":"string"},"error":{"nullable":true,"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"step":{"type":"string"},"status":{"type":"string"},"message":{"nullable":true,"type":"string"},"at":{"type":"string"}},"required":["step","status","message","at"],"additionalProperties":false}}},"required":["id","site_id","status","trigger","created_at","started_at","finished_at","error","steps"],"additionalProperties":false},"Fix":{"type":"object","properties":{"uuid":{"type":"string","description":"Use this in /fixes/{fixId} URLs."},"id":{"type":"string","description":"Stable id, the same across runs (e.g. TTL-3fa9c21b)."},"status":{"type":"string"},"rule":{"type":"string"},"title":{"type":"string"},"category":{"type":"string"},"severity":{"type":"string"},"priority":{"type":"number"},"url":{"type":"string"},"location":{"type":"object","properties":{"kind":{"type":"string","enum":["url","file","site"]},"url":{"type":"string"},"file":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"selector":{"type":"string"},"hint":{"type":"string"}},"required":["kind"],"additionalProperties":false},"current":{"nullable":true,"type":"string"},"proposed":{"nullable":true,"type":"string"},"why":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"detail":{"type":"string"},"url":{"type":"string"}},"required":["source","detail"],"additionalProperties":false}},"risk":{"type":"string"},"effort":{"type":"string"},"needs_human":{"type":"boolean"},"verify":{"type":"object","properties":{"check":{"type":"string","enum":["status_ok","title_present","title_length","title_unique","meta_description_present","h1_single","canonical_present","not_noindex","no_nosnippet","lang_present","alt_text_present","og_tags_present","structured_data_present","robots_allows_bot","bot_fetch_ok","sitemap_present","llms_txt_present","server_rendered_content","no_broken_links","manual"]},"url":{"type":"string"},"args":{"default":{},"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"required":["check","url","args"],"additionalProperties":false}},"required":["uuid","id","status","rule","title","category","severity","priority","url","location","current","proposed","why","evidence","risk","effort","needs_human","verify"],"additionalProperties":false},"Outcome":{"type":"object","properties":{"fix_uuid":{"type":"string"},"fix_id":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"verdict":{"type":"string"},"before":{"nullable":true,"type":"object","additionalProperties":{}},"after":{"nullable":true,"type":"object","additionalProperties":{}}},"required":["fix_uuid","fix_id","title","url","verdict","before","after"],"additionalProperties":false},"AppliedBody":{"type":"object","properties":{"commit":{"type":"string","maxLength":80},"note":{"type":"string","maxLength":500}},"additionalProperties":false},"VerifyResult":{"type":"object","properties":{"pass":{"type":"boolean"},"detail":{"type":"string"}},"required":["pass","detail"],"additionalProperties":false},"Report":{"type":"object","properties":{"schema_version":{"type":"number","enum":[1]},"generated_at":{"type":"string"},"site":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"name":{"type":"string"}},"required":["id","url","name"],"additionalProperties":false},"run":{"type":"object","properties":{"id":{"type":"string"},"trigger":{"type":"string"},"status":{"type":"string","enum":["succeeded","partial","failed"]},"started_at":{"type":"string"},"finished_at":{"type":"string"},"steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string","enum":["succeeded","skipped","failed"]},"detail":{"nullable":true,"type":"string"},"ms":{"type":"number"}},"required":["name","status","detail","ms"],"additionalProperties":false}}},"required":["id","trigger","status","started_at","finished_at","steps"],"additionalProperties":false},"summary":{"type":"object","properties":{"pages_crawled":{"type":"number"},"fixes_total":{"type":"number"},"by_severity":{"type":"object","properties":{"critical":{"type":"number"},"warning":{"type":"number"},"info":{"type":"number"}},"required":["critical","warning","info"],"additionalProperties":false},"ai_bots_blocked":{"type":"number"},"gsc":{"nullable":true,"type":"object","properties":{"clicks_28d":{"type":"number"},"impressions_28d":{"type":"number"},"clicks_prev_28d":{"type":"number"},"impressions_prev_28d":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"}},"required":["clicks_28d","impressions_28d","clicks_prev_28d","impressions_prev_28d","ctr","position"],"additionalProperties":false},"psi":{"nullable":true,"type":"object","properties":{"performance":{"nullable":true,"type":"number"},"seo":{"nullable":true,"type":"number"},"accessibility":{"nullable":true,"type":"number"},"lcp_ms":{"nullable":true,"type":"number"},"cls":{"nullable":true,"type":"number"},"inp_ms":{"nullable":true,"type":"number"},"field_data":{"type":"boolean"}},"required":["performance","seo","accessibility","lcp_ms","cls","inp_ms","field_data"],"additionalProperties":false}},"required":["pages_crawled","fixes_total","by_severity","ai_bots_blocked","gsc","psi"],"additionalProperties":false},"ai_access":{"type":"object","properties":{"bots":{"type":"array","items":{"type":"object","properties":{"bot":{"type":"string"},"owner":{"type":"string"},"purpose":{"type":"string","enum":["search","training","user_fetch"]},"robots":{"type":"string","enum":["allowed","blocked","not_specified"]},"live_status":{"nullable":true,"type":"number"},"live_blocked":{"type":"boolean"},"severity":{"type":"string","enum":["critical","warning","info"]}},"required":["bot","owner","purpose","robots","live_status","live_blocked","severity"],"additionalProperties":false}},"flags":{"type":"object","properties":{"cdn_block":{"type":"boolean"},"nosnippet":{"type":"boolean"},"js_only":{"type":"boolean"},"llms_txt":{"type":"boolean"}},"required":["cdn_block","nosnippet","js_only","llms_txt"],"additionalProperties":false}},"required":["bots","flags"],"additionalProperties":false},"fixes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"rule":{"type":"string"},"title":{"type":"string"},"category":{"type":"string","enum":["technical","content","ai_access","performance","structured_data","search_console"]},"severity":{"type":"string","enum":["critical","warning","info"]},"url":{"type":"string"},"location":{"type":"object","properties":{"kind":{"type":"string","enum":["url","file","site"]},"url":{"type":"string"},"file":{"type":"string"},"line":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"selector":{"type":"string"},"hint":{"type":"string"}},"required":["kind"],"additionalProperties":false},"current":{"nullable":true,"type":"string"},"proposed":{"nullable":true,"type":"string"},"why":{"type":"string"},"evidence":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"detail":{"type":"string"},"url":{"type":"string"}},"required":["source","detail"],"additionalProperties":false}},"risk":{"type":"string","enum":["low","medium","high"]},"effort":{"type":"string","enum":["S","M","L"]},"needs_human":{"type":"boolean"},"priority":{"type":"number"},"verify":{"type":"object","properties":{"check":{"type":"string","enum":["status_ok","title_present","title_length","title_unique","meta_description_present","h1_single","canonical_present","not_noindex","no_nosnippet","lang_present","alt_text_present","og_tags_present","structured_data_present","robots_allows_bot","bot_fetch_ok","sitemap_present","llms_txt_present","server_rendered_content","no_broken_links","manual"]},"url":{"type":"string"},"args":{"default":{},"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}}},"required":["check","url","args"],"additionalProperties":false}},"required":["id","rule","title","category","severity","url","location","current","proposed","why","evidence","risk","effort","needs_human","priority","verify"],"additionalProperties":false}},"content_opportunities":{"type":"array","items":{"type":"object","properties":{"query":{"type":"string"},"intent":{"type":"string","enum":["informational","commercial","transactional","navigational"]},"page":{"nullable":true,"type":"string"},"position":{"type":"number"},"impressions":{"type":"number"},"clicks":{"type":"number"},"ctr":{"type":"number"},"action":{"type":"string"},"sub_questions":{"type":"array","items":{"type":"string"}},"brief":{"nullable":true,"type":"string"},"link_from":{"type":"array","items":{"type":"string"}}},"required":["query","intent","page","position","impressions","clicks","ctr","action","sub_questions","brief","link_from"],"additionalProperties":false}},"ai_citations":{"nullable":true,"type":"object","properties":{"engine":{"type":"string"},"checked":{"type":"number"},"cited":{"type":"number"},"queries":{"type":"array","items":{"type":"object","properties":{"query":{"type":"string"},"cited":{"type":"boolean"},"cited_urls":{"type":"array","items":{"type":"string"}},"sources":{"type":"array","items":{"type":"object","properties":{"domain":{"type":"string"},"title":{"type":"string"},"url":{"nullable":true,"type":"string"}},"required":["domain","title","url"],"additionalProperties":false}}},"required":["query","cited","cited_urls","sources"],"additionalProperties":false}}},"required":["engine","checked","cited","queries"],"additionalProperties":false},"competitors":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"domain":{"type":"string"},"is_self":{"type":"boolean"},"reachable":{"type":"boolean"},"ai_search_bots_allowed":{"type":"number"},"ai_search_bots_total":{"type":"number"},"llms_txt":{"type":"boolean"},"structured_data":{"type":"array","items":{"type":"string"}},"title":{"nullable":true,"type":"string"},"word_count":{"type":"number"},"response_ms":{"nullable":true,"type":"number"},"performance":{"nullable":true,"type":"number"},"lcp_ms":{"nullable":true,"type":"number"},"cited_in":{"nullable":true,"type":"number"}},"required":["url","domain","is_self","reachable","ai_search_bots_allowed","ai_search_bots_total","llms_txt","structured_data","title","word_count","response_ms","performance","lcp_ms","cited_in"],"additionalProperties":false}}},"required":["schema_version","generated_at","site","run","summary","ai_access","fixes","content_opportunities"],"additionalProperties":false}}},"paths":{"/sites":{"get":{"summary":"List sites","parameters":[],"responses":{"200":{"description":"Sites","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Site"}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{siteId}":{"get":{"summary":"Get a site","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Site"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{siteId}/runs":{"post":{"summary":"Start an audit (counts against the monthly quota)","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Run queued","content":{"application/json":{"schema":{"type":"object","properties":{"run_id":{"type":"string"},"existing":{"type":"boolean"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/runs/{runId}":{"get":{"summary":"Run status and step events","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Run","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Run"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/runs/{runId}/report.json":{"get":{"summary":"Report (JSON)","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/runs/{runId}/report.md":{"get":{"summary":"Report (Markdown)","parameters":[{"name":"runId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report","content":{"text/markdown":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{siteId}/reports/latest.md":{"get":{"summary":"Latest report (Markdown)","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report","content":{"text/markdown":{"schema":{"type":"string"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/sites/{siteId}/fixes":{"get":{"summary":"List fixes","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","schema":{"type":"string","default":"open"},"description":"open, all, or a single status"}],"responses":{"200":{"description":"Fixes","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Fix"}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/fixes/{fixId}/verify":{"post":{"summary":"Run the fix’s verify check against the live site","parameters":[{"name":"fixId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyResult"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/fixes/{fixId}/applied":{"post":{"summary":"Mark a fix as applied","parameters":[{"name":"fixId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Applied","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppliedBody"}}}}}},"/sites/{siteId}/outcomes":{"get":{"summary":"Before/after metrics for applied fixes","parameters":[{"name":"siteId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Outcomes","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Outcome"}}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found (also returned for other organisations’ resources)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limited (60/min per key) or run quota reached","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}