{"openapi":"3.1.0","info":{"title":"Leat Solutions Content API","description":"Read-only access to published case studies from Leat Solutions, the consulting practice of Andrew Johnson (cloud infrastructure, AI and agentic automation, operations). Usage rules for agents: https://leatsolutions.com/AGENTS.md","version":"1.0.0","contact":{"url":"https://leatsolutions.com/contact"}},"servers":[{"url":"https://leatsolutions.com"}],"paths":{"/api/case-studies":{"get":{"operationId":"listCaseStudies","summary":"List all published case studies","responses":{"200":{"description":"Case study list","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer"},"case_studies":{"type":"array","items":{"$ref":"#/components/schemas/CaseStudySummary"}}}}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/case-studies/{slug}":{"get":{"operationId":"getCaseStudy","summary":"Get one case study, including its full body as markdown","parameters":[{"name":"slug","in":"path","required":true,"description":"Canonical case study identifier. Enumerate via /api/case-studies; never invent slugs.","schema":{"type":"string","pattern":"^[a-z0-9-]{1,100}$"}}],"responses":{"200":{"description":"Case study detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseStudyDetail"}}}},"400":{"description":"Invalid slug format"},"404":{"description":"Unknown slug"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/contact":{"post":{"operationId":"sendInquiry","summary":"Send an inquiry to Andrew Johnson","description":"Requires the human's explicit consent and real contact details. Rate limited to 5 submissions per IP per hour. See usage rules at /AGENTS.md.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","email","message"],"properties":{"name":{"type":"string","maxLength":100},"email":{"type":"string","format":"email","maxLength":254},"message":{"type":"string","maxLength":10000},"company":{"type":"string","maxLength":100}}}}}},"responses":{"200":{"description":"Inquiry sent"},"400":{"description":"Validation failed; the error field names the problem"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"schemas":{"CaseStudySummary":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"headline":{"type":"string"},"summary":{"type":"string"},"engagement":{"type":"string","enum":["infrastructure","operations","automation","migration"]},"tags":{"type":"array","items":{"type":"string"}},"published_at":{"type":"string"},"url":{"type":"string","format":"uri"},"api_url":{"type":"string","format":"uri"}}},"CaseStudyDetail":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"headline":{"type":"string"},"summary":{"type":"string"},"engagement":{"type":"string","enum":["infrastructure","operations","automation","migration"]},"industry":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"tech_stack":{"type":"array","items":{"type":"string"}},"results":{"type":"array","items":{"type":"object","properties":{"metric":{"type":"string"},"description":{"type":"string"}}}},"published_at":{"type":"string"},"url":{"type":"string","format":"uri"},"markdown":{"type":"string","description":"Full case study body rendered as markdown"}}}},"responses":{"RateLimited":{"description":"Rate limited; honor the Retry-After header"}}}}