{"openapi":"3.1.0","info":{"title":"Namos Labs Public API","version":"1.0.0","description":"Read-only, unauthenticated endpoints for content and site data published by Namos Labs. For authenticated account/dashboard endpoints, see the developer docs at /docs.","contact":{"name":"Namos Labs","email":"hello@namoslabs.com","url":"https://namoslabs.com/about"}},"servers":[{"url":"https://namoslabs.com","description":"Production"}],"paths":{"/api/health":{"get":{"operationId":"getHealth","summary":"Service health check","description":"Returns the health status of the application and its database connection. No authentication required.","responses":{"200":{"description":"Service is healthy or degraded","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","unhealthy"]},"timestamp":{"type":"string","format":"date-time"},"environment":{"type":"string"},"version":{"type":"string"},"uptime":{"type":"number","description":"Process uptime in seconds"}},"required":["status","timestamp"]}}}},"503":{"description":"Service is unhealthy","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}}}}},"/api/sitemap":{"get":{"operationId":"getSitemapXml","summary":"XML sitemap","description":"Returns the full XML sitemap of indexable pages, including blog posts, changelog entries, and newsletter issues.","responses":{"200":{"description":"Sitemap XML document","content":{"application/xml":{"schema":{"type":"string"}}}}}}},"/api/rss":{"get":{"operationId":"getMainRssFeed","summary":"Main RSS feed","description":"Combined RSS 2.0 feed of blog posts and product updates.","responses":{"200":{"description":"RSS XML feed","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/api/rss/blog":{"get":{"operationId":"getBlogRssFeed","summary":"Blog RSS feed","description":"RSS 2.0 feed of published blog posts.","responses":{"200":{"description":"RSS XML feed","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/api/rss/changelog":{"get":{"operationId":"getChangelogRssFeed","summary":"Changelog RSS feed","description":"RSS 2.0 feed of published changelog entries.","responses":{"200":{"description":"RSS XML feed","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/api/rss/newsletter":{"get":{"operationId":"getNewsletterRssFeed","summary":"Newsletter RSS feed","description":"RSS 2.0 feed of sent newsletter campaigns.","responses":{"200":{"description":"RSS XML feed","content":{"application/rss+xml":{"schema":{"type":"string"}}}}}}},"/api/search":{"get":{"operationId":"searchContent","summary":"Search site content","description":"Full-text search across published content. Rate-limited.","parameters":[{"name":"q","in":"query","required":true,"description":"Search query string","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Missing query parameter","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}}}}},"/api/pricing":{"get":{"operationId":"getPricingTiers","summary":"List active pricing tiers","description":"Returns the currently active, publicly displayed pricing tiers. Rate-limited.","responses":{"200":{"description":"Array of pricing tiers","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}}}}},"/api/updates":{"get":{"operationId":"listProjectUpdates","summary":"List published project updates","description":"Returns published project/product updates, optionally filtered by project.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20}},{"name":"projectId","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Array of project updates","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}}}},"/api/projects":{"get":{"operationId":"listPublicProjects","summary":"List public projects","description":"Returns approved, non-draft projects shown on the site.","responses":{"200":{"description":"Array of public projects","content":{"application/json":{"schema":{"type":"array","items":{"type":"object"}}}}}}}},"/api/contact":{"post":{"operationId":"submitContactForm","summary":"Submit the contact form","description":"Submits a contact message. Requires a CSRF token issued to the requesting session and is rate-limited to 5 requests/hour per IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string","format":"email"},"message":{"type":"string"}},"required":["name","email","message"]}}}},"responses":{"200":{"description":"Message received"},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}},"403":{"description":"CSRF validation failed","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message"}},"required":["error"]}}}}}}}}}