{"openapi":"3.1.0","info":{"title":"Kirana Labs Content API","version":"1.0.0","description":"Public read-only access to published Kirana Labs content — blog posts and case studies in English and Spanish, plus media files. This is the same content served as HTML on the website; no authentication is required and no write or administrative operations are exposed.  For a content index see /llms.txt. Every page also serves a markdown twin via the .md suffix or Accept: text/markdown negotiation.","contact":{"name":"Kirana Labs","url":"https://v2.kiranalabs.com/contact-form"}},"servers":[{"url":"https://v2.kiranalabs.com"}],"externalDocs":{"description":"Agent-readable content index","url":"https://v2.kiranalabs.com/llms.txt"},"paths":{"/api/posts":{"get":{"operationId":"listPosts","summary":"List published posts","description":"Published posts only — drafts are never visible to anonymous callers. No authentication required.","tags":["Posts"],"parameters":[{"name":"locale","in":"query","schema":{"type":"string","enum":["en","es"]},"description":"Content locale. Omit for all locales."},{"name":"where[slug][equals]","in":"query","schema":{"type":"string"},"description":"Fetch a single document by slug."},{"name":"limit","in":"query","schema":{"type":"integer","default":10,"maximum":100}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"sort","in":"query","schema":{"type":"string","example":"-publishedAt"},"description":"Sort field, prefix with - for descending."},{"name":"depth","in":"query","schema":{"type":"integer","default":1,"maximum":3},"description":"Relationship population depth (coverImage, categories)."},{"name":"select","in":"query","schema":{"type":"string","example":"title,slug,excerpt"},"description":"Comma-separated fields to return."}],"responses":{"200":{"description":"Paginated document list","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object"}},"totalDocs":{"type":"integer"},"limit":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"},"hasNextPage":{"type":"boolean"},"hasPrevPage":{"type":"boolean"}}}}}}}}},"/api/posts/{id}":{"get":{"operationId":"getPost","summary":"Get a published post by id","tags":["Posts"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"locale","in":"query","schema":{"type":"string","enum":["en","es"]},"description":"Content locale. Omit for all locales."},{"name":"depth","in":"query","schema":{"type":"integer","default":1,"maximum":3},"description":"Relationship population depth (coverImage, categories)."},{"name":"select","in":"query","schema":{"type":"string","example":"title,slug,excerpt"},"description":"Comma-separated fields to return."}],"responses":{"200":{"description":"Document","content":{"application/json":{}}},"404":{"description":"Not found or not published"}}}},"/api/case-studies":{"get":{"operationId":"listCase Studies","summary":"List published case studies","description":"Published case studies only — drafts are never visible to anonymous callers. No authentication required.","tags":["Case Studies"],"parameters":[{"name":"locale","in":"query","schema":{"type":"string","enum":["en","es"]},"description":"Content locale. Omit for all locales."},{"name":"where[slug][equals]","in":"query","schema":{"type":"string"},"description":"Fetch a single document by slug."},{"name":"limit","in":"query","schema":{"type":"integer","default":10,"maximum":100}},{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"sort","in":"query","schema":{"type":"string","example":"-publishedAt"},"description":"Sort field, prefix with - for descending."},{"name":"depth","in":"query","schema":{"type":"integer","default":1,"maximum":3},"description":"Relationship population depth (coverImage, categories)."},{"name":"select","in":"query","schema":{"type":"string","example":"title,slug,excerpt"},"description":"Comma-separated fields to return."}],"responses":{"200":{"description":"Paginated document list","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object"}},"totalDocs":{"type":"integer"},"limit":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"},"hasNextPage":{"type":"boolean"},"hasPrevPage":{"type":"boolean"}}}}}}}}},"/api/case-studies/{id}":{"get":{"operationId":"getCase Studie","summary":"Get a published case studie by id","tags":["Case Studies"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"locale","in":"query","schema":{"type":"string","enum":["en","es"]},"description":"Content locale. Omit for all locales."},{"name":"depth","in":"query","schema":{"type":"integer","default":1,"maximum":3},"description":"Relationship population depth (coverImage, categories)."},{"name":"select","in":"query","schema":{"type":"string","example":"title,slug,excerpt"},"description":"Comma-separated fields to return."}],"responses":{"200":{"description":"Document","content":{"application/json":{}}},"404":{"description":"Not found or not published"}}}},"/api/media/file/{filename}":{"get":{"operationId":"getMediaFile","summary":"Stream a media file","description":"Media assets referenced by post and case-study content.","tags":["Media"],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"File contents","content":{"application/octet-stream":{}}},"404":{"description":"Not found"}}}}}}