{"openapi":"3.1.0","info":{"title":"QlooVibe","version":"1.0","description":"Audience-grounded design direction for coding agents, from Qloo taste data. Qloo supplies ranked tags and entities; tokens come from a published rule table. MCP (Streamable HTTP) is served at /mcp."},"paths":{"/api/vibe":{"post":{"summary":"Choose project styles with font pairs, palettes and design tokens","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["audience"]},{"required":["seeds"]},{"required":["project"]},{"required":["project_markdown"]}],"properties":{"audience":{"type":"string","minLength":2,"maxLength":300,"example":"fans of Slowdive, Aesop, A24","description":"Name 1-5 things the audience loves, separated by commas, semicolons or newlines. Quote names containing delimiters. Conjunctions stay within names. Each parsed name must be 2-60 characters."},"seeds":{"type":"array","items":{"type":"string","minLength":2,"maxLength":60,"description":"A nonblank entity name. Optional type hint, e.g. Slowdive (artist)."},"minItems":1,"maxItems":5,"description":"Explicit audience names. Overrides parsing audience when supplied."},"project":{"type":"string","minLength":20,"maxLength":8000,"description":"Project description or Markdown text. Used for audience inference when explicit names are absent and always retained as design context."},"project_markdown":{"type":"string","minLength":20,"maxLength":8000,"description":"Actual project Markdown text, not a local path. Alias for project; do not supply both."},"source_name":{"type":"string","maxLength":120,"description":"Optional .md, .markdown or .txt filename only; no directory paths."},"fresh":{"type":"boolean","description":"Bypass the 6-hour provider cache. Default false."}}}}}},"responses":{"200":{"description":"Inspect status: complete, partial, or insufficient_evidence. Partial data is disclosed in caveats, unresolved, and per-result notes."},"413":{"description":"Request payload too large"},"422":{"description":"Invalid JSON or input outside the documented bounds"},"429":{"description":"Rate limited; Retry-After specifies seconds to wait"},"500":{"description":"Unexpected server error"}}}},"/api/vibe/{id}":{"get":{"summary":"Retrieve a stored brief","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"brief"},"404":{"description":"missing or expired"}}}},"/api/audit":{"post":{"summary":"Audit generated UI code against a chosen direction (deterministic, no model, no Qloo call)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["code","reference"],"properties":{"code":{"type":"string","minLength":20,"maxLength":200000,"description":"CSS, HTML, JSX or Tailwind source the agent generated."},"reference":{"type":"string","minLength":20,"maxLength":40000,"description":"The selected direction's agent_brief, css_qv or css_shadcn."}}}}}},"responses":{"200":{"description":"Inspect status: complete, partial, or insufficient_evidence. Partial data is disclosed in caveats, unresolved, and per-result notes."},"413":{"description":"Request payload too large"},"422":{"description":"Invalid JSON or input outside the documented bounds"},"429":{"description":"Rate limited; Retry-After specifies seconds to wait"},"500":{"description":"Unexpected server error"}}}},"/api/check":{"post":{"summary":"Score references against an audience (critic)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["candidates"],"anyOf":[{"required":["audience"]},{"required":["seeds"]},{"required":["project"]},{"required":["project_markdown"]}],"properties":{"audience":{"type":"string","minLength":2,"maxLength":300,"example":"fans of Slowdive, Aesop, A24","description":"Name 1-5 things the audience loves, separated by commas, semicolons or newlines. Quote names containing delimiters. Conjunctions stay within names. Each parsed name must be 2-60 characters."},"seeds":{"type":"array","items":{"type":"string","minLength":2,"maxLength":60,"description":"A nonblank entity name. Optional type hint, e.g. Slowdive (artist)."},"minItems":1,"maxItems":5,"description":"Explicit audience names. Overrides parsing audience when supplied."},"project":{"type":"string","minLength":20,"maxLength":8000,"description":"Project description or Markdown text. Used for audience inference when explicit names are absent and always retained as design context."},"project_markdown":{"type":"string","minLength":20,"maxLength":8000,"description":"Actual project Markdown text, not a local path. Alias for project; do not supply both."},"source_name":{"type":"string","maxLength":120,"description":"Optional .md, .markdown or .txt filename only; no directory paths."},"fresh":{"type":"boolean","description":"Bypass the 6-hour provider cache. Default false."},"candidates":{"type":"array","items":{"type":"string","minLength":2,"maxLength":60,"description":"A nonblank entity name. Optional type hint, e.g. Slowdive (artist)."},"minItems":1,"maxItems":12}}}}}},"responses":{"200":{"description":"Inspect status: complete, partial, or insufficient_evidence. Partial data is disclosed in caveats, unresolved, and per-result notes."},"413":{"description":"Request payload too large"},"422":{"description":"Invalid JSON or input outside the documented bounds"},"429":{"description":"Rate limited; Retry-After specifies seconds to wait"},"500":{"description":"Unexpected server error"}}}},"/api/rules":{"get":{"summary":"The published rule table","responses":{"200":{"description":"rules"}}}},"/api/benchmark":{"get":{"summary":"Latest measured Qloo vs LLM-only comparison (batch run)","responses":{"200":{"description":"benchmark"},"404":{"description":"not yet run"}}}},"/health":{"get":{"summary":"Health","responses":{"200":{"description":"ok"}}}}}}