{"openapi": "3.1.0", "info": {"title": "SIExpo Licensed Content API", "version": "1.0.0", "description": "Read-only article syndication. Manual paid activation. Preserve attribution and AI disclosures."}, "servers": [{"url": "https://siexpo.bg/api/v1"}], "components": {"securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer"}}, "schemas": {"ArticleChange": {"type": "object", "required": ["id", "revision", "deleted"], "properties": {"id": {"type": "integer", "minimum": 1}, "revision": {"type": "integer", "minimum": 0}, "deleted": {"type": "boolean", "description": "Remove all previously imported versions when true."}, "slug": {"type": "string"}, "category": {"type": "string"}, "published_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}, "translations": {"type": "object", "properties": {"bg": {"$ref": "#/components/schemas/Translation"}, "en": {"$ref": "#/components/schemas/Translation"}}, "additionalProperties": false}, "image": {"type": ["object", "null"], "properties": {"url": {"type": "string", "format": "uri"}, "width": {"type": "integer"}, "height": {"type": "integer"}, "ai_generated": {"type": "boolean"}, "credit": {"type": "string"}}}, "sources": {"type": "array", "items": {"type": "object", "properties": {"url": {"type": "string", "format": "uri"}, "title": {"type": "string"}, "published_at": {"type": ["string", "null"]}}}}, "attribution": {"type": "object", "properties": {"publisher": {"type": "string"}, "publisher_url": {"type": "string", "format": "uri"}, "original_url": {"type": "string", "format": "uri"}, "required": {"type": "boolean"}}}, "rights": {"type": "string"}, "reason": {"type": "string"}}}, "Translation": {"type": "object", "required": ["title", "excerpt", "body_markdown", "body_html", "author", "url", "disclosure"], "properties": {"title": {"type": "string"}, "excerpt": {"type": "string"}, "body_markdown": {"type": "string"}, "body_html": {"type": "string"}, "author": {"type": "string"}, "url": {"type": "string", "format": "uri"}, "disclosure": {"type": "string"}}}, "ArticleFeed": {"type": "object", "required": ["items", "next_after", "through", "has_more"], "properties": {"api_version": {"type": "string"}, "items": {"type": "array", "items": {"$ref": "#/components/schemas/ArticleChange"}}, "after": {"type": "integer"}, "next_after": {"type": "integer"}, "through": {"type": "integer"}, "has_more": {"type": "boolean"}, "generated_at": {"type": "string", "format": "date-time"}}}}}, "paths": {"/articles": {"get": {"summary": "Incremental article change feed", "security": [{"bearerAuth": []}], "parameters": [{"name": "after", "in": "query", "schema": {"type": "integer", "minimum": 0, "maximum": 9223372036854775807, "default": 0}}, {"name": "through", "in": "query", "schema": {"type": "integer", "minimum": 0, "maximum": 9223372036854775807}, "description": "Snapshot high-water mark returned by the first page. Omit on a new poll."}, {"name": "limit", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 50, "default": 25}}, {"name": "lang", "in": "query", "schema": {"type": "string", "enum": ["bg", "en", "both"], "default": "both"}}], "responses": {"200": {"description": "Success; no-store", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ArticleFeed"}}}}, "400": {"description": "Invalid query/cursor", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Invalid or revoked key", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "403": {"description": "Inactive/expired subscription, IP or language forbidden", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "429": {"description": "Quota exhausted; see Retry-After", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "503": {"description": "Temporarily unavailable", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}}}}, "/articles/{id}": {"get": {"summary": "Get one currently available article", "security": [{"bearerAuth": []}], "parameters": [{"name": "id", "in": "path", "required": true, "schema": {"type": "integer", "minimum": 1}}, {"name": "lang", "in": "query", "schema": {"type": "string", "enum": ["bg", "en", "both"], "default": "both"}}], "responses": {"200": {"description": "Success; no-store", "content": {"application/json": {"schema": {"type": "object", "properties": {"article": {"$ref": "#/components/schemas/ArticleChange"}}}}}}, "400": {"description": "Invalid query/cursor", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Invalid or revoked key", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "403": {"description": "Inactive/expired subscription, IP or language forbidden", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "429": {"description": "Quota exhausted; see Retry-After", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "503": {"description": "Temporarily unavailable", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "404": {"description": "Article not available"}}}}, "/account": {"get": {"summary": "Access and current daily usage", "security": [{"bearerAuth": []}], "parameters": [], "responses": {"200": {"description": "Success; no-store", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Invalid query/cursor", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Invalid or revoked key", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "403": {"description": "Inactive/expired subscription, IP or language forbidden", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "429": {"description": "Quota exhausted; see Retry-After", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "503": {"description": "Temporarily unavailable", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}}}}, "/categories": {"get": {"summary": "Article category labels", "security": [{"bearerAuth": []}], "parameters": [], "responses": {"200": {"description": "Success; no-store", "content": {"application/json": {"schema": {"type": "object"}}}}, "400": {"description": "Invalid query/cursor", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "401": {"description": "Invalid or revoked key", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "403": {"description": "Inactive/expired subscription, IP or language forbidden", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "429": {"description": "Quota exhausted; see Retry-After", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}, "503": {"description": "Temporarily unavailable", "content": {"application/json": {"schema": {"type": "object", "properties": {"error": {"type": "object", "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}}}}}}}}