{"openapi":"3.1.0","info":{"title":"eliancodes.com Public API","version":"1.0.0","summary":"Read-only access to the services, templates and articles published on https://eliancodes.com.","description":"A small, public, read-only API over the content of this site. No\nauthentication is required and there are no write operations; see\n/auth.md. Responses are localized \u2014 pass `?lang=en` or `?lang=nl`.","contact":{"name":"eliancodes.com","url":"https://eliancodes.com/contact"},"license":{"name":"Terms of service","url":"https://eliancodes.com/terms"}},"servers":[{"url":"https://eliancodes.com","description":"Production"}],"security":[],"externalDocs":{"description":"Human-readable API documentation","url":"https://eliancodes.com/docs/api"},"paths":{"/api/v1/services":{"get":{"operationId":"listServices","summary":"List every service offered.","tags":["Services"],"parameters":[{"name":"lang","in":"query","required":false,"description":"Locale for the returned copy.","schema":{"type":"string","enum":["en","nl"]}}],"responses":{"200":{"description":"A collection of Service objects.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}},"/api/v1/themes":{"get":{"operationId":"listThemes","summary":"List every theme and template in the catalog.","tags":["Themes"],"parameters":[{"name":"lang","in":"query","required":false,"description":"Locale for the returned copy.","schema":{"type":"string","enum":["en","nl"]}}],"responses":{"200":{"description":"A collection of Theme objects.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Theme"}}}}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}},"/api/v1/themes/{theme}":{"get":{"operationId":"getTheme","summary":"Fetch a single theme by key.","tags":["Themes"],"parameters":[{"name":"theme","in":"path","required":true,"description":"Theme key, e.g. \"elephantro\".","schema":{"type":"string","pattern":"^[a-z0-9-]+$"}},{"name":"lang","in":"query","required":false,"description":"Locale for the returned copy.","schema":{"type":"string","enum":["en","nl"]}}],"responses":{"200":{"description":"A single Theme object.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Theme"}}}}}},"404":{"description":"No such theme."},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}},"/api/v1/blog":{"get":{"operationId":"listBlogPosts","summary":"List published articles, newest first.","tags":["Blog"],"parameters":[{"name":"q","in":"query","required":false,"description":"Free-text filter over title, description and body.","schema":{"type":"string","maxLength":200}},{"name":"limit","in":"query","required":false,"description":"Maximum number of posts to return.","schema":{"type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"A collection of BlogPostSummary objects.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BlogPostSummary"}}}}}}},"422":{"description":"Invalid query parameters."},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}},"/api/v1/blog/{slug}":{"get":{"operationId":"getBlogPost","summary":"Fetch a single article including its Markdown body.","tags":["Blog"],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9-]+$"}}],"responses":{"200":{"description":"A single BlogPost object.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/BlogPost"}}}}}},"404":{"description":"No such post, or the post is a draft."},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}},"/up":{"get":{"operationId":"healthCheck","summary":"Application health check.","tags":["Status"],"responses":{"200":{"description":"The application is healthy."},"429":{"description":"Rate limit exceeded (60 requests per minute per IP)."}}}}},"components":{"schemas":{"Service":{"type":"object","required":["key","name","summary","description","url","stack"],"properties":{"key":{"type":"string","examples":["laravel"]},"name":{"type":"string"},"summary":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"stack":{"type":"array","items":{"type":"string"}}}},"Theme":{"type":"object","required":["key","name","tagline","description","status","model","stack"],"properties":{"key":{"type":"string","examples":["elephantro"]},"name":{"type":"string"},"tagline":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["available","coming_soon"]},"model":{"type":"string","enum":["free","freemium","paid"]},"price":{"type":["string","null"],"description":"Numeric price, or null when not for sale yet."},"currency":{"type":["string","null"],"examples":["EUR"]},"url":{"type":["string","null"],"format":"uri"},"demo_url":{"type":["string","null"],"format":"uri"},"free_url":{"type":["string","null"],"format":"uri"},"stack":{"type":"array","items":{"type":"string"}}}},"BlogPostSummary":{"type":"object","required":["slug","title","description","date","url"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"date":{"type":"string","format":"date"},"url":{"type":"string","format":"uri"}}},"BlogPost":{"allOf":[{"$ref":"#/components/schemas/BlogPostSummary"},{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string","description":"The original Markdown source of the article."}}}]}}}}