{"openapi":"3.1.0","info":{"title":"Jank Reports — Test Reports API","version":"1.0.0","description":"AI-powered website quality scan. Submit a URL, get a scored report (0–100 jank score), bug list with fix prompts, persona feedback, test flows, and category baselines. Each issue includes prompt_to_fix_this_issue for direct paste into Claude Code / Cursor / Copilot.","contact":{"email":"jason@testers.ai"}},"servers":[{"url":"https://reports.jank.ai"}],"x-llm-guide":"POST /api/reports → poll GET /api/reports/:id until status=done → read analysis.issues. Each issue.prompt_to_fix_this_issue is pre-written for an AI coding agent. Machine-readable report at /r/:id.json and /r/:id.md.","paths":{"/api/reports":{"post":{"operationId":"submitReport","summary":"Submit a new quality scan","description":"Submit 1–25 URLs. Returns report IDs immediately; analysis is async. Poll GET /api/reports/:id for status. Demo: 1 URL/day, no personas; API key: up to 25 URLs/request.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"array","items":{"type":"string","format":"uri"},"minItems":1,"maxItems":25},"visibility":{"type":"string","enum":["public","private"],"default":"public"},"label":{"type":"string"},"subpages":{"description":"false | {enabled,count(0-20)}","default":{"enabled":true,"count":2}},"flows":{"description":"false | {enabled,count(1-10),customPrompt}","default":{"enabled":true,"count":5}},"personas":{"description":"false | {enabled,count(1-10),customPrompt}","default":"off in demo"},"provider":{"type":"string","enum":["gemini","openai","anthropic"],"default":"gemini"},"model":{"type":"string","description":"e.g. gemini-2.0-flash, gpt-4o-mini, claude-3-5-sonnet-latest"},"emails":{"type":"array","items":{"type":"string","format":"email"}},"account":{"type":"string","format":"email","description":"Required for demo mode"}}}}}},"responses":{"200":{"description":"Reports created","content":{"application/json":{"schema":{"type":"object","properties":{"created":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"visibility":{"type":"string"},"viewUrl":{"type":"string","description":"e.g. /r/:id"}}}}}}}}},"400":{"description":"Invalid request"},"401":{"description":"Auth required"},"403":{"description":"Plan cap exceeded"},"429":{"description":"Daily quota exhausted"}},"security":[{"ApiKeyAuth":[],"AccountHeader":[]}]},"get":{"operationId":"listReports","summary":"List your reports","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":20}}],"responses":{"200":{"description":"Array of reports"}},"security":[{"BearerAuth":[]}]}},"/api/reports/{id}":{"get":{"operationId":"getReport","summary":"Fetch a report by ID","description":"Returns full JSON. Poll every 5s while status is queued|running. Public reports are world-readable.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report JSON with status, analysis.score, analysis.issues, personaFeedback, testFlows, baselines, artifacts"}}}},"/api/reports/{id}/chat":{"post":{"operationId":"chatWithReport","summary":"Chat with a report","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"messages":{"type":"array","maxItems":12,"items":{"type":"object","properties":{"role":{"type":"string"},"content":{"type":"string","maxLength":600}}}},"brand":{"type":"string","enum":["jank","testers.ai","icebergqa.com"],"default":"jank"}}}}}},"responses":{"200":{"description":"{ reply: string }"}}}},"/r/{id}.json":{"get":{"operationId":"getReportJson","summary":"Full report as JSON — includes all issues with prompt_to_fix_this_issue","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Report JSON"}}}},"/r/{id}.md":{"get":{"operationId":"getReportMarkdown","summary":"Full report as Markdown — ready to paste into Claude Code / Copilot","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Markdown"}}}},"/api/providers":{"get":{"operationId":"listProviders","summary":"List available LLM providers and models","responses":{"200":{"description":"{ providers, default, models }"}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"jk_... API key"},"AccountHeader":{"type":"apiKey","in":"header","name":"X-Account","description":"Your email address"},"BearerAuth":{"type":"http","scheme":"bearer","description":"Bearer jk_... token"}}}}