{
  "openapi": "3.1.0",
  "info": {
    "title": "WowMakers Public Content API",
    "version": "1.0.0",
    "description": "Read-only JSON mirror of already-public content on wowmakers.com — service lines, portfolio case studies, and blog posts. No authentication, no write access. Generated at build time from the same content the website renders.",
    "contact": {
      "name": "WowMakers",
      "url": "https://www.wowmakers.com/developers/",
      "email": "hello@wowmakers.com"
    }
  },
  "servers": [{ "url": "https://www.wowmakers.com" }],
  "paths": {
    "/api/v1/services.json": {
      "get": {
        "operationId": "listServices",
        "summary": "List WowMakers' service lines",
        "description": "Returns every service line WowMakers offers (design, video, product, web), each with its own service-page URL.",
        "responses": {
          "200": {
            "description": "Services retrieved successfully.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ServicesResponse" }
              }
            }
          },
          "404": {
            "description": "No resource at this path.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ErrorResponse" }
              }
            }
          }
        }
      }
    },
    "/api/v1/case-studies.json": {
      "get": {
        "operationId": "listCaseStudies",
        "summary": "List portfolio case studies",
        "description": "Returns every published case study with its client, industry, service category, and case-study page URL.",
        "responses": {
          "200": {
            "description": "Case studies retrieved successfully.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/CaseStudiesResponse" }
              }
            }
          },
          "404": {
            "description": "No resource at this path.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ErrorResponse" }
              }
            }
          }
        }
      }
    },
    "/api/v1/blog-posts.json": {
      "get": {
        "operationId": "listBlogPosts",
        "summary": "List recent blog posts",
        "description": "Returns up to the 50 most recently published blog posts, newest first, each with its excerpt, publish/modified dates, categories, tags, and post URL.",
        "responses": {
          "200": {
            "description": "Blog posts retrieved successfully.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/BlogPostsResponse" }
              }
            }
          },
          "404": {
            "description": "No resource at this path.",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ErrorResponse" }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Service": {
        "type": "object",
        "required": ["slug", "title", "description", "url"],
        "properties": {
          "slug": { "type": "string", "description": "URL slug of the service page.", "example": "ui-ux-design" },
          "title": { "type": "string", "description": "Service name." },
          "description": { "type": "string", "description": "One-sentence summary of the service." },
          "url": { "type": "string", "format": "uri", "description": "Absolute URL of the service's page." }
        }
      },
      "ServicesResponse": {
        "type": "object",
        "required": ["services"],
        "properties": {
          "services": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/Service" }
          }
        }
      },
      "CaseStudy": {
        "type": "object",
        "required": ["slug", "title", "industry", "category", "url"],
        "properties": {
          "slug": { "type": "string", "example": "fifa-arab-cup-2021" },
          "title": { "type": "string", "description": "Case study headline." },
          "client": { "type": ["string", "null"], "description": "Client name, or null for a self-initiated concept piece." },
          "industry": { "type": "string", "description": "Client's industry, e.g. \"Fintech\" or \"Logistics\"." },
          "category": { "type": "string", "description": "Primary service category for this project, e.g. \"UX/UI Design\"." },
          "url": { "type": "string", "format": "uri", "description": "Absolute URL of the case study page." }
        }
      },
      "CaseStudiesResponse": {
        "type": "object",
        "required": ["caseStudies"],
        "properties": {
          "caseStudies": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/CaseStudy" }
          }
        }
      },
      "BlogPost": {
        "type": "object",
        "required": ["slug", "title", "publishedAt", "url"],
        "properties": {
          "slug": { "type": "string" },
          "title": { "type": "string" },
          "excerpt": { "type": ["string", "null"] },
          "publishedAt": { "type": "string", "format": "date-time" },
          "modifiedAt": { "type": ["string", "null"], "format": "date-time" },
          "categories": { "type": "array", "items": { "type": "string" } },
          "tags": { "type": "array", "items": { "type": "string" } },
          "url": { "type": "string", "format": "uri", "description": "Absolute URL of the post — an external link for a guest/syndicated post, otherwise the /blog/ page." }
        }
      },
      "BlogPostsResponse": {
        "type": "object",
        "required": ["totalCount", "count", "posts"],
        "properties": {
          "totalCount": { "type": "integer", "description": "Total published post count, independent of the 50-post cap on this endpoint." },
          "count": { "type": "integer", "description": "Number of posts actually returned (min(totalCount, 50))." },
          "posts": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/BlogPost" }
          }
        }
      },
      "ErrorResponse": {
        "type": "object",
        "required": ["error"],
        "properties": {
          "error": {
            "type": "object",
            "required": ["code", "status", "message", "resolution"],
            "properties": {
              "code": { "type": "string", "example": "not_found" },
              "status": { "type": "integer", "example": 404 },
              "message": { "type": "string" },
              "resolution": { "type": "string", "description": "What the caller should do next." }
            }
          }
        }
      }
    }
  }
}
