{"openapi":"3.1.0","info":{"title":"Alpha-Media API","description":"Read-only REST access to the AlfaMedia editorial database (Editorial Organiser / Crossmedia). See / for the human docs and /API.md for the agent-readable markdown.","version":"0.7.0"},"paths":{"/api/health":{"get":{"tags":["meta"],"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/articles":{"get":{"tags":["articles"],"summary":"List Articles","description":"List editorial articles in a date range (default: last 7 days).\n\nData source: `crossmedia_article` joined to publication channels\n(`crossmedia_publicationschedule` -> `crossmedia_baseexporter`).","operationId":"list_articles_api_articles_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Start date (YYYY-MM-DD), inclusive. Default: today - 7 days.","title":"From"},"description":"Start date (YYYY-MM-DD), inclusive. Default: today - 7 days."},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"End date (YYYY-MM-DD), inclusive. Default: today.","title":"To"},"description":"End date (YYYY-MM-DD), inclusive. Default: today."},{"name":"date_field","in":"query","required":false,"schema":{"type":"string","pattern":"^(updated|created)$","description":"Which timestamp the date range applies to.","default":"updated","title":"Date Field"},"description":"Which timestamp the date range applies to."},{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by publication channel name, substring match (e.g. 'FN', 'Newsportal', 'St.Galler').","title":"Channel"},"description":"Filter by publication channel name, substring match (e.g. 'FN', 'Newsportal', 'St.Galler')."},{"name":"online_only","in":"query","required":false,"schema":{"type":"boolean","description":"If true (default), only include articles that go to an online news channel ('… Newsportal Artikel'); print-only articles are excluded. Set false to include all.","default":true,"title":"Online Only"},"description":"If true (default), only include articles that go to an online news channel ('… Newsportal Artikel'); print-only articles are excluded. Set false to include all."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/articles/{article_id}":{"get":{"tags":["articles"],"summary":"Get Article","description":"Return one article with full text (HTML + plaintext), its publication\nchannels, and its image assets (metadata + image URLs).\n\nImage URLs:\n  * `thumbnail_url` — served by this API from the inline DB thumbnail\n    (small, ~188px). Always works when `has_thumbnail` is true.\n  * `highres` — the full-resolution original lives in the RRFS file store,\n    addressed by an internal handle; direct retrieval is not wired into this\n    API yet. The reference data (handle, md5, mime, dimensions) is provided.","operationId":"get_article_api_articles__article_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"integer","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/images/{image_id}/{rendition}":{"get":{"tags":["images"],"summary":"Image Rendition","description":"Serve an image binary for a `crossmedia_image` id.\n\n`rendition` is one of: `thumbnail` (~188px), `lowres` (web size),\n`highres` (full-resolution original). Bytes are proxied from the internal\nEO mediaproxy; the client never talks to it directly.","operationId":"image_rendition_api_images__image_id___rendition__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"image_id","in":"path","required":true,"schema":{"type":"integer","title":"Image Id"}},{"name":"rendition","in":"path","required":true,"schema":{"type":"string","title":"Rendition"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}},"image/jpeg":{}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key"}}}}