{"openapi":"3.0.3","info":{"title":"Atlasimex SL Public API","version":"1.2.1","description":"Public REST API for Atlasimex SL, international beverage company (energy, soft and functional drinks, private label, 21+ countries). Read endpoints need no authentication. Write endpoints (contact form, newsletter) are public but rate-limited. Full human documentation lives at /docs and the agent entrypoint at /llms.txt. Versioning: current major v1; unversioned /api/* tracks v1, pinned /api/v1/* aliases are frozen; future breaking changes ship as /api/v2 with >=6 months overlap signalled by Deprecation/Sunset headers. Every response carries API-Version and RFC RateLimit headers; 429s carry Retry-After. Every 4xx/5xx uses the typed Error schema (#/components/schemas/Error) with a machine-readable code.","contact":{"name":"Atlasimex SL","url":"https://atlasimex.es","email":"contact@atlasimex.es"},"license":{"name":"All rights reserved, Atlasimex SL"}},"servers":[{"url":"https://atlasimex.es","description":"Production: unversioned paths track the current major (v1). Pin /api/v1/* for a frozen contract."}],"tags":[{"name":"meta","description":"API discovery, health and machine-readable index."},{"name":"content","description":"Public blog and portfolio content."},{"name":"engagement","description":"Contact form and newsletter subscription."},{"name":"feeds","description":"RSS feeds per locale."}],"paths":{"/api":{"get":{"operationId":"listEndpoints","summary":"List all public API endpoints","description":"Returns the machine-readable index of every public endpoint with its method, path and description. Start here for discovery.","tags":["meta"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Endpoint index.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","endpoints"],"properties":{"success":{"type":"boolean","example":true},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string","example":"GET"},"path":{"type":"string","example":"/api/status"},"description":{"type":"string"}}}},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1":{"get":{"operationId":"listEndpointsV1","summary":"List all public API endpoints (pinned v1)","description":"Pinned v1 alias of GET /api. Identical contract; prefer this path when you need a frozen version pin.","tags":["meta"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Endpoint index (v1 pin).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","version","endpoints"],"properties":{"success":{"type":"boolean","example":true},"version":{"type":"string","example":"v1"},"deprecation":{"type":"boolean","example":false},"endpoints":{"type":"array","items":{"type":"object","required":["method","path","description"],"properties":{"method":{"type":"string","example":"GET"},"path":{"type":"string","example":"/api/v1/status"},"description":{"type":"string"}}}},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/status":{"get":{"operationId":"getStatus","summary":"API health and version","description":"Public health check returning the API version, site name and current timestamp. Pinned alias: GET /api/v1/status.","tags":["meta"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Service is healthy.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","status","version","site"],"properties":{"success":{"type":"boolean","example":true},"status":{"type":"string","example":"ok"},"version":{"type":"string","example":"1.2.1"},"site":{"type":"string","example":"Atlasimex SL"},"timestamp":{"type":"string","format":"date-time"}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/status":{"get":{"operationId":"getStatusV1","summary":"API health and version (pinned v1)","description":"Pinned v1 alias of GET /api/status.","tags":["meta"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Service is healthy.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","status","version","site"],"properties":{"success":{"type":"boolean","example":true},"status":{"type":"string","example":"ok"},"version":{"type":"string","example":"1.2.1"},"site":{"type":"string","example":"Atlasimex SL"},"timestamp":{"type":"string","format":"date-time"}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/blog":{"get":{"operationId":"listPosts","summary":"List blog posts","description":"Returns published blog posts (slug, title, excerpt, date, cover image). No authentication required. Pinned alias: GET /api/v1/blog.","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"locale","in":"query","description":"Content locale.","required":false,"schema":{"type":"string","enum":["en","es","fr","ar"],"default":"en"}},{"name":"limit","in":"query","description":"Maximum posts to return (1-50).","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"A list of blog posts.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","locale","count","posts"],"properties":{"success":{"type":"boolean","example":true},"locale":{"type":"string","example":"en"},"count":{"type":"integer","example":12},"posts":{"type":"array","items":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string","example":"launch-your-brand"},"title":{"type":"string"},"excerpt":{"type":"string"},"date":{"type":"string","example":"2026-03-01"},"coverImage":{"type":"string","example":"/images/blog/cover.jpg"},"url":{"type":"string","example":"https://atlasimex.es/en/blog/launch-your-brand"}}}}}}}}},"400":{"description":"Invalid locale or limit.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/blog":{"get":{"operationId":"listPostsV1","summary":"List blog posts (pinned v1)","description":"Pinned v1 alias of GET /api/blog. Same parameters and typed errors.","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"locale","in":"query","description":"Content locale.","required":false,"schema":{"type":"string","enum":["en","es","fr","ar"],"default":"en"}},{"name":"limit","in":"query","description":"Maximum posts to return (1-50).","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"A list of blog posts.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","locale","count","posts"],"properties":{"success":{"type":"boolean","example":true},"locale":{"type":"string","example":"en"},"count":{"type":"integer","example":12},"posts":{"type":"array","items":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string","example":"launch-your-brand"},"title":{"type":"string"},"excerpt":{"type":"string"},"date":{"type":"string","example":"2026-03-01"},"coverImage":{"type":"string","example":"/images/blog/cover.jpg"},"url":{"type":"string","example":"https://atlasimex.es/en/blog/launch-your-brand"}}}}}}}}},"400":{"description":"Invalid locale or limit.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/blog/translated-slug":{"get":{"operationId":"resolveTranslatedSlug","summary":"Resolve a blog slug across locales","description":"Given a post slug in one locale, returns the equivalent slug in another locale (or null when untranslated). Pinned alias: GET /api/v1/blog/translated-slug.","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"sourceLocale","in":"query","required":true,"description":"Locale of the known slug.","schema":{"type":"string","enum":["en","es","fr","ar"]}},{"name":"targetLocale","in":"query","required":true,"description":"Locale to translate into.","schema":{"type":"string","enum":["en","es","fr","ar"]}},{"name":"slug","in":"query","required":true,"description":"Known post slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"Resolved slug (null when no translation exists).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","translatedSlug"],"properties":{"success":{"type":"boolean","example":true},"translatedSlug":{"type":"string","nullable":true}}}}}},"400":{"description":"Missing or unsupported parameter.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/blog/translated-slug":{"get":{"operationId":"resolveTranslatedSlugV1","summary":"Resolve a blog slug across locales (pinned v1)","description":"Pinned v1 alias of GET /api/blog/translated-slug.","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"sourceLocale","in":"query","required":true,"description":"Locale of the known slug.","schema":{"type":"string","enum":["en","es","fr","ar"]}},{"name":"targetLocale","in":"query","required":true,"description":"Locale to translate into.","schema":{"type":"string","enum":["en","es","fr","ar"]}},{"name":"slug","in":"query","required":true,"description":"Known post slug.","schema":{"type":"string"}}],"responses":{"200":{"description":"Resolved slug (null when no translation exists).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","translatedSlug"],"properties":{"success":{"type":"boolean","example":true},"translatedSlug":{"type":"string","nullable":true}}}}}},"400":{"description":"Missing or unsupported parameter.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/portfolio":{"get":{"operationId":"listPortfolio","summary":"List beverage portfolio brands","description":"Returns the public product portfolio (brands, available flavors, taglines and detail URLs). No authentication required. Pinned alias: GET /api/v1/portfolio.","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Portfolio brand list.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","count","brands"],"properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer","example":6},"brands":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string","example":"promax"},"name":{"type":"string","example":"Promax"},"tagline":{"type":"string"},"url":{"type":"string","example":"https://atlasimex.es/en/portfolio/promax"},"flavors":{"type":"array","items":{"type":"string"},"example":["Classic Energy Drink","Apple & Melon","Watermelon & Red Grape"]}}}}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/portfolio":{"get":{"operationId":"listPortfolioV1","summary":"List beverage portfolio brands (pinned v1)","description":"Pinned v1 alias of GET /api/portfolio (includes the additive `flavors` array per brand).","tags":["content"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"responses":{"200":{"description":"Portfolio brand list.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","required":["success","count","brands"],"properties":{"success":{"type":"boolean","example":true},"count":{"type":"integer","example":6},"brands":{"type":"array","items":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string","example":"promax"},"name":{"type":"string","example":"Promax"},"tagline":{"type":"string"},"url":{"type":"string","example":"https://atlasimex.es/en/portfolio/promax"},"flavors":{"type":"array","items":{"type":"string"},"example":["Classic Energy Drink","Apple & Melon","Watermelon & Red Grape"]}}}}}}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/forms/submit":{"post":{"operationId":"submitForm","summary":"Submit a contact form","description":"Stores a contact/home form submission and forwards it to the Atlasimex SL sales team by email (Stalwart webmail form primary, EmailJS fallback). Public endpoint, honeypot-protected and rate-limited server-side (10/hour per IP; 429 carries Retry-After). Pinned alias: POST /api/v1/forms/submit.","tags":["engagement"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["form_type","form_data","locale","source_page"],"properties":{"form_type":{"type":"string","enum":["home_contact","contact_page"],"description":"Which form was submitted."},"form_data":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"first_name":{"type":"string"},"last_name":{"type":"string"},"subject":{"type":"string"},"message":{"type":"string"},"country":{"type":"string"},"website_hp":{"type":"string","description":"Honeypot spam trap: always send empty. A filled value is treated as a bot and silently discarded."}}},"locale":{"type":"string","enum":["en","es","fr","ar"]},"source_page":{"type":"string","example":"contact"}}}}}},"responses":{"200":{"description":"Submission stored and email sent.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"submission_id":{"type":"string","format":"uuid"},"status":{"type":"string"}}}}}},"202":{"description":"Stored but email delivery is pending retry.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation failure (missing fields or invalid email).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off for `Retry-After` seconds, then retry. See /docs \"Rate limits\".","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/forms/submit":{"post":{"operationId":"submitFormV1","summary":"Submit a contact form (pinned v1)","description":"Pinned v1 alias of POST /api/forms/submit. Same body, typed errors and 429 semantics.","tags":["engagement"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["form_type","form_data","locale","source_page"],"properties":{"form_type":{"type":"string","enum":["home_contact","contact_page"],"description":"Which form was submitted."},"form_data":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"first_name":{"type":"string"},"last_name":{"type":"string"},"subject":{"type":"string"},"message":{"type":"string"},"country":{"type":"string"},"website_hp":{"type":"string","description":"Honeypot spam trap: always send empty. A filled value is treated as a bot and silently discarded."}}},"locale":{"type":"string","enum":["en","es","fr","ar"]},"source_page":{"type":"string","example":"contact"}}}}}},"responses":{"200":{"description":"Submission stored and email sent.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"submission_id":{"type":"string","format":"uuid"},"status":{"type":"string"}}}}}},"202":{"description":"Stored but email delivery is pending retry.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation failure (missing fields or invalid email).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off for `Retry-After` seconds, then retry. See /docs \"Rate limits\".","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/newsletter/subscribe":{"post":{"operationId":"subscribeNewsletter","summary":"Subscribe to the newsletter","description":"Subscribes an email address to the Atlasimex SL newsletter. Max 5 attempts per email per hour (429 carries Retry-After). Pinned alias: POST /api/v1/newsletter/subscribe.","tags":["engagement"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"buyer@example.com"}}}}}},"responses":{"201":{"description":"Subscribed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Invalid or already-subscribed email.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off for `Retry-After` seconds, then retry. See /docs \"Rate limits\".","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/newsletter/subscribe":{"post":{"operationId":"subscribeNewsletterV1","summary":"Subscribe to the newsletter (pinned v1)","description":"Pinned v1 alias of POST /api/newsletter/subscribe. Same body, typed errors and 429 semantics.","tags":["engagement"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email","example":"buyer@example.com"}}}}}},"responses":{"201":{"description":"Subscribed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"}}}}}},"400":{"description":"Invalid or already-subscribed email.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"Wrong HTTP method (see `Allow` header).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded. Back off for `Retry-After` seconds, then retry. See /docs \"Rate limits\".","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/rss/{locale}":{"get":{"operationId":"getRssFeed","summary":"Blog RSS feed for a locale","description":"Returns the RSS 2.0 feed of Atlasimex SL blog posts for the given locale. Pinned alias: GET /api/v1/rss/{locale}.","tags":["feeds"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"locale","in":"path","required":true,"description":"Feed locale.","schema":{"type":"string","enum":["en","es","fr","ar"]}}],"responses":{"200":{"description":"RSS 2.0 XML feed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/rss+xml":{"schema":{"type":"string"}}}},"404":{"description":"Unsupported locale.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/rss/{locale}":{"get":{"operationId":"getRssFeedV1","summary":"Blog RSS feed for a locale (pinned v1)","description":"Pinned v1 alias of GET /api/rss/{locale}.","tags":["feeds"],"parameters":[{"$ref":"#/components/parameters/ApiVersionHeader"},{"name":"locale","in":"path","required":true,"description":"Feed locale.","schema":{"type":"string","enum":["en","es","fr","ar"]}}],"responses":{"200":{"description":"RSS 2.0 XML feed.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/rss+xml":{"schema":{"type":"string"}}}},"404":{"description":"Unsupported locale.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server failure. Retry shortly.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"default":{"description":"Unexpected error (typed Error schema).","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","description":"Typed API error. `code` is stable and machine-readable (switch on it); `message` is human-readable; `hint` tells the caller how to recover.","required":["success","code","message","hint"],"properties":{"success":{"type":"boolean","example":false},"code":{"type":"string","example":"NOT_FOUND","description":"Stable machine-readable error code."},"message":{"type":"string","example":"Human-readable summary of what went wrong."},"error":{"type":"string","description":"Alias of message (legacy clients)."},"hint":{"type":"string","example":"What to do next to resolve the error."},"docs":{"type":"string","example":"/docs"},"openapi":{"type":"string","example":"/openapi.json"}}}},"parameters":{"ApiVersionHeader":{"name":"API-Version","in":"header","required":false,"description":"Optional version negotiation header (currently `v1`). The served version is always echoed in the `API-Version` response header; prefer pinned `/api/v1/*` paths for a frozen contract.","schema":{"type":"string","enum":["v1"],"default":"v1"}}},"headers":{"ApiVersion":{"description":"Served API major version (currently v1).","schema":{"type":"string","example":"v1"}},"RateLimitLimit":{"description":"Request quota ceiling for the window.","schema":{"type":"integer","example":600}},"RateLimitRemaining":{"description":"Remaining quota in the current window (present where quota is tracked per client, e.g. write endpoints; omitted on untracked read endpoints).","schema":{"type":"integer","example":599}},"RateLimitReset":{"description":"Seconds until the quota window resets (present where quota is tracked per client).","schema":{"type":"integer","example":42}},"RateLimitPolicy":{"description":"Quota policy quoted as `\"<limit>\";w=<window-seconds>`.","schema":{"type":"string","example":"\"600\";w=60"}},"RetryAfter":{"description":"Seconds to wait before retrying (429 only).","schema":{"type":"integer","example":3600}},"Deprecation":{"description":"Present as `true` on a deprecated API major, with a `Sunset` date header.","schema":{"type":"string","example":"true"}},"Sunset":{"description":"HTTP-date after which a deprecated API major is removed.","schema":{"type":"string","example":"Wed, 01 Sep 2027 00:00:00 GMT"}}}}}