{
  "openapi": "3.1.0",
  "info": {
    "title": "REVIEWR Public API",
    "version": "1.0.0",
    "description": "Public, anonymous-readable endpoints for the REVIEWR AI photo critique platform. This spec covers ONLY discovery and public read-only resources. Authenticated critique generation, follow-ups, billing, and account endpoints are intentionally not documented here — they are reserved for the REVIEWR web app and require user authentication.",
    "contact": {
      "name": "REVIEWR Support",
      "email": "support@reviewr.studio",
      "url": "https://reviewr.studio"
    },
    "license": {
      "name": "Proprietary",
      "url": "https://reviewr.studio/terms"
    }
  },
  "servers": [
    { "url": "https://reviewr.studio", "description": "Production website" }
  ],
  "paths": {
    "/llms.txt": {
      "get": {
        "summary": "LLM-friendly product summary",
        "description": "Markdown document with canonical product description, key features, pricing, and links.",
        "responses": { "200": { "description": "OK", "content": { "text/plain": { "schema": { "type": "string" } } } } }
      }
    },
    "/llms-full.txt": {
      "get": {
        "summary": "Extended LLM-friendly product information",
        "responses": { "200": { "description": "OK", "content": { "text/plain": { "schema": { "type": "string" } } } } }
      }
    },
    "/sitemap.xml": {
      "get": {
        "summary": "Sitemap index",
        "responses": { "200": { "description": "OK", "content": { "application/xml": { "schema": { "type": "string" } } } } }
      }
    },
    "/gallery": {
      "get": {
        "summary": "Public community gallery (HTML)",
        "description": "HTML page listing the most recent public, AI-critiqued photos shared to the REVIEWR community gallery.",
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/c/{postId}": {
      "get": {
        "summary": "Public critique page (HTML)",
        "description": "Public, indexable page rendering a single AI critique with scores, written feedback, and tags.",
        "parameters": [
          { "name": "postId", "in": "path", "required": true, "schema": { "type": "string" }, "description": "Gallery post identifier." }
        ],
        "responses": {
          "200": { "description": "OK" },
          "404": { "description": "Critique not found or has been made private." }
        }
      }
    },
    "/faq": {
      "get": {
        "summary": "FAQ page (HTML, FAQPage JSON-LD embedded)",
        "responses": { "200": { "description": "OK" } }
      }
    },
    "/pricing": {
      "get": {
        "summary": "Pricing page (HTML, Offer JSON-LD embedded)",
        "responses": { "200": { "description": "OK" } }
      }
    }
  },
  "components": {
    "schemas": {
      "Critique": {
        "type": "object",
        "description": "Public representation of an AI photo critique.",
        "properties": {
          "id": { "type": "string" },
          "imageUrl": { "type": "string", "format": "uri" },
          "overallScore": { "type": "number", "minimum": 1.0, "maximum": 10.0 },
          "starRating": { "type": "integer", "minimum": 1, "maximum": 5 },
          "introSentence": { "type": "string" },
          "tags": { "type": "array", "items": { "type": "string" } },
          "createdAt": { "type": "string", "format": "date-time" },
          "categories": {
            "type": "object",
            "properties": {
              "composition": { "type": "number" },
              "lighting": { "type": "number" },
              "colorTone": { "type": "number" },
              "focus": { "type": "number" },
              "storyMood": { "type": "number" },
              "technical": { "type": "number" }
            }
          }
        }
      }
    }
  }
}