{
  "openapi": "3.1.0",
  "info": {
    "title": "AITOP Public API",
    "version": "1.11.0",
    "description": "Anonymous, token-free read API for AITOP item discovery, safe item details, and daily reports. Rate limit: 60 req/min per IP. Requires a real User-Agent (default curl/x.y.z → 403). Send X-AITOP-Client and a stable anonymous X-AITOP-Install id. Since 1.3.0 details are excerpted with truncation flags plus a readMore pointer, and list/daily responses may carry an optional notice. Since 1.4.0 an optional subscription key (?key= or X-AITOP-Key) removes truncation, applies its saved query, and suppresses the notice; details expose an exact duplicatesCount. Since 1.5.0 list and daily responses always include skillMeta; GET /skill/meta returns the same object. Since 1.6.0 the structured desks under /api/v1 are documented here too (company directory, funding, policy desk, weekly charts, topic hubs, trackers, guides, weekly issue); those paths carry their own servers entry and take an optional lang=zh|en. Desks still being filled may return an empty list. Since 1.7.0 the AI model library (/models, /models/{slug}) is documented too; prices are USD per 1M tokens and every field names its source. Since 1.8.0 GET /items accepts an optional industry filter for the five vertical channels; existing clients remain compatible. Since 1.10.0 /api/v1/tools provides published tool discovery, categories, tags, details and outbound-click counting; unverified price facts remain null. Since 1.11.0 reader APIs accept explicit lang, and /api/public/mcp provides eight read-only tools via Streamable HTTP. Since 1.9.0 structured desk and weekly responses expose hasEnglish, daily renditions expose lang, and /api/v1/items accepts translated=1 with lang=en for complete-rendition pagination.",
    "license": {"name": "Personal use, fair-use rate limit applies"}
  },
  "servers": [{"url": "/api/public"}],
  "x-aitop-mcp-endpoint": "/api/public/mcp",
  "components": {
    "parameters": {"AgentLanguage": {"name": "lang", "in": "query", "description": "Explicit language overrides the domain default (airebao.com=zh, aitop.news=en). Missing renditions fall back to original content.", "schema": {"type": "string", "enum": ["zh", "en"]}}},
    "schemas": {
      "Notice": {
        "type": "object",
        "description": "Optional server-controlled message. At most once per install per cooldown window (default 24h), only on /items and /daily. Render verbatim, once, after the list.",
        "required": ["kind","text","url","slug"],
        "properties": {
          "kind": {"type": "string", "enum": ["cta"]},
          "text": {"type": "string"},
          "url":  {"type": "string", "format": "uri", "description": "Attribution redirect; link to it as-is"},
          "slug": {"type": "string"}
        }
      },
      "Facet": {
        "type": "object",
        "description": "One facet bucket — a value and how many rows carry it.",
        "required": ["key","count"],
        "properties": {"key": {"type": "string"}, "count": {"type": "integer"}}
      },
      "SkillMeta": {
        "type": "object",
        "description": "Always present on /items and /daily. latest is the currently published Skill version.",
        "required": ["latest","install"],
        "properties": {
          "latest": {"type": "string", "example": "1.5"},
          "install": {"type": "string", "format": "uri", "description": "Canonical reinstall URL for the main AITOP Skill"}
        }
      },
      "ReadMore": {
        "type": "object",
        "required": ["truncated","url","hint"],
        "properties": {
          "truncated": {"type": "boolean", "description": "True when recommendReason and/or bodyOriginal were shortened"},
          "url":  {"type": "string", "format": "uri", "description": "Canonical AITOP detail page holding the full text"},
          "hint": {"type": "string"}
        }
      },
      "Item": {
        "type": "object",
        "required": ["id","sourceName","detailUrl","sourceUrl","url","title","channel","isFeatured","tags"],
        "properties": {
          "id":          {"type": "string", "description": "Opaque numeric string; do not assume a fixed length", "example": "2436"},
          "sourceName":  {"type": "string"},
          "detailUrl":   {"type": "string", "format": "uri", "description": "Canonical AITOP detail page; use as the default user-facing link"},
          "sourceUrl":   {"type": "string", "format": "uri", "description": "Upstream article; use for citation and fact checking"},
          "url":         {"type": "string", "format": "uri", "deprecated": true, "description": "Deprecated compatibility alias for sourceUrl"},
          "title":       {"type": "string"},
          "title_en":    {"type": ["string","null"], "description": "English title; null when source is already English"},
          "summary":     {"type": ["string","null"], "description": "AI-generated summary; null when not yet processed"},
          "category":    {"type": ["string","null"], "enum": ["ai-models","ai-products","industry","paper","tip",null]},
          "channel":     {"type": "string", "enum": ["firstParty","news","x","community","blog","paper"]},
          "isFeatured":  {"type": "boolean"},
          "tags":        {"type": "array", "items": {"type": "string"}},
          "publishedAt": {"type": ["string","null"], "format": "date-time", "description": "ISO 8601 UTC with Z; null when no explicit publish time"},
          "media":       {"type": "array", "items": {"type": "object", "properties": {"kind": {"type": "string"}, "url": {"type": "string"}, "width": {"type": "integer"}, "height": {"type": "integer"}}}}
        }
      },
      "ItemsResponse": {
        "type": "object",
        "required": ["hasMore","nextCursor","items","skillMeta"],
        "properties": {
          "hasMore":    {"type": "boolean"},
          "nextCursor": {"type": ["string","null"], "description": "Opaque cursor; pass as ?cursor= on next request. null when hasMore=false."},
          "items":      {"type": "array", "items": {"$ref": "#/components/schemas/Item"}},
          "notice":     {"$ref": "#/components/schemas/Notice"},
          "skillMeta":  {"$ref": "#/components/schemas/SkillMeta"}
        }
      },
      "ItemDetail": {
        "allOf": [
          {"$ref": "#/components/schemas/Item"},
          {
            "type": "object",
            "required": ["recommendReason","bodyOriginal","coverImageUrl","duplicates","readMore"],
            "properties": {
              "recommendReason": {"type": ["string","null"], "description": "Excerpt of AITOP's own take; shortened when recommendReasonTruncated is true"},
              "recommendReasonTruncated": {"type": "boolean"},
              "bodyOriginal": {"type": ["string","null"], "description": "Excerpt of the upstream body; shortened when bodyTruncated is true"},
              "bodyTruncated": {"type": "boolean"},
              "duplicatesCount": {"type": "integer", "description": "Exact number of independent sources covering the same event, even when the duplicates array is capped"},
              "readMore": {"$ref": "#/components/schemas/ReadMore"},
              "coverImageUrl": {"type": ["string","null"], "format": "uri"},
              "duplicates": {"type": "array", "items": {"type": "object", "required": ["sourceName","sourceUrl","publishedAt"], "properties": {"sourceName": {"type": "string"}, "sourceUrl": {"type": "string", "format": "uri"}, "publishedAt": {"type": ["string","null"], "format": "date-time"}}}}
            }
          }
        ]
      },
      "DailyReport": {
        "type": "object",
        "required": ["id","date","headline","summaryMd","stats","sections","published","skillMeta"],
        "properties": {
          "id": {"type": "string"},
          "date": {"type": "string", "format": "date"},
          "headline": {"type": "string"},
          "summaryMd": {"type": "string"},
          "stats": {"type": "object"},
          "sections": {"type": "object", "additionalProperties": {"type": "array", "items": {"$ref": "#/components/schemas/Item"}}},
          "published": {"type": "boolean"},
          "notice": {"$ref": "#/components/schemas/Notice"},
          "skillMeta": {"$ref": "#/components/schemas/SkillMeta"}
        }
      }
    }
  },
  "paths": {
    "/items": {
      "get": {
        "summary": "List items (cursor-paginated)",
        "parameters": [{"$ref": "#/components/parameters/AgentLanguage"},
          {"name": "mode",     "in": "query", "schema": {"type": "string", "enum": ["selected","all"], "default": "selected"}, "description": "selected=精选 (default); all=全量"},
          {"name": "since",    "in": "query", "schema": {"type": "string"}, "description": "Time lower bound: ISO-8601 / date / 24h / 7d"},
          {"name": "take",     "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 200, "default": 20}},
          {"name": "cursor",   "in": "query", "schema": {"type": "string"}, "description": "Opaque cursor from previous nextCursor; omit for first page"},
          {"name": "category", "in": "query", "schema": {"type": "string", "enum": ["ai-models","ai-products","industry","paper","tip"]}},
          {"name": "channel",  "in": "query", "schema": {"type": "string", "enum": ["firstParty","news","x","community","blog","paper"]}},
          {"name": "q",        "in": "query", "schema": {"type": "string", "maxLength": 100}, "description": "Keyword search on title+summary"},
          {"name": "tag",      "in": "query", "schema": {"type": "string"}},
          {"name": "industry", "in": "query", "schema": {"type": "string", "enum": ["health-life-sciences","robotics-manufacturing","finance-business","education-research","creative-media"]}, "description": "Vertical industry channel"},
          {"name": "key",      "in": "query", "schema": {"type": "string"}, "description": "Subscription key (or X-AITOP-Key header): applies its saved query and suppresses the notice"}
        ],
        "responses": {
          "200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ItemsResponse"}}}},
          "400": {"description": "Invalid parameter"},
          "429": {"description": "Rate limited"}
        }
      }
    },
    "/items/{id}": {
      "get": {
        "summary": "Get a safe public item detail",
        "description": "Use after list discovery when the user asks to expand one item. Internal scores and source IDs are omitted.",
        "parameters": [{"$ref": "#/components/parameters/AgentLanguage"},{"name": "id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^\\d+$"}}],
        "responses": {
          "200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ItemDetail"}}}},
          "404": {"description": "Not found"},
          "429": {"description": "Rate limited"}
        }
      }
    },
    "/daily": {
      "get": {"parameters": [{"$ref": "#/components/parameters/AgentLanguage"}],"summary": "Latest published daily report", "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DailyReport"}}}}, "404": {"description": "Not found"}}}
    },
    "/daily/{date}": {
      "get": {
        "summary": "Daily report by date",
        "parameters": [{"$ref": "#/components/parameters/AgentLanguage"},{"name": "date", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$"}}],
        "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DailyReport"}}}}, "404": {"description": "Not found or not published"}}
      }
    },
    "/dailies": {
      "get": {
        "summary": "List dates with a published daily report",
        "parameters": [{"$ref": "#/components/parameters/AgentLanguage"},{"name": "take", "in": "query", "schema": {"type": "integer", "minimum": 1, "maximum": 365, "default": 30}}],
        "responses": {"200": {"description": "OK"}}
      }
    },
    "/skill/meta": {
      "get": {"parameters": [{"$ref": "#/components/parameters/AgentLanguage"}],
        "summary": "Current Skill version",
        "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SkillMeta"}}}}}
      }
    },
    "/openapi.yaml": {
      "get": {"summary": "This OpenAPI spec (YAML)", "responses": {"200": {"description": "OK"}}}
    },
    "/openapi.json": {
      "get": {"summary": "This OpenAPI spec (JSON)", "responses": {"200": {"description": "OK"}}}
    },
    "/companies": {"servers": [{"url": "/api/v1"}], "get": {"summary": "ASEAN AI company directory", "parameters": [{"name": "country", "in": "query", "schema": {"type": "string"}}, {"name": "direction", "in": "query", "schema": {"type": "string"}}, {"name": "programme", "in": "query", "schema": {"type": "string"}}, {"name": "q", "in": "query", "schema": {"type": "string"}}, {"name": "sort", "in": "query", "schema": {"type": "string"}}, {"name": "page", "in": "query", "schema": {"type": "integer"}}, {"name": "size", "in": "query", "schema": {"type": "integer"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"companies": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}, "page": {"type": "integer"}, "size": {"type": "integer"}}}}}}}}},
    "/companies/facets": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Company directory facet counts", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"countries": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}, "directions": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}, "programmes": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}, "total": {"type": "integer"}}}}}}}}},
    "/companies/{slug}": {"servers": [{"url": "/api/v1"}], "get": {"summary": "One company, its stories and neighbours", "parameters": [{"name": "slug", "in": "path", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"company": {"type": "object"}, "items": {"type": "array", "items": {"type": "object"}}, "related": {"type": "array", "items": {"type": "object"}}}}}}}}}},
    "/tools": {"servers":[{"url":"/api/v1"}],"get":{"summary":"Published AI tools; pricing facts and fact tags require pricingVerified","parameters":[{"name":"category","in":"query","schema":{"type":"string"}},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"pricing","in":"query","schema":{"type":"string"}},{"name":"q","in":"query","schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string"}},{"name":"free","in":"query","schema":{"type":"boolean"}},{"name":"no_card","in":"query","schema":{"type":"boolean"}},{"name":"page","in":"query","schema":{"type":"integer"}},{"name":"size","in":"query","schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"descriptionEn":{"type":"string"},"pricingType":{"type":"string"},"pricingVerified":{"type":"boolean"},"hasFreeTier":{"type":["boolean","null"]},"requiresCreditCard":{"type":["boolean","null"]},"pricingSourceUrl":{"type":"string"},"reviewSourceUrl":{"type":"string"},"tags":{"type":"array","items":{"type":"object"}}}}},"total":{"type":"integer"},"page":{"type":"integer"},"size":{"type":"integer"}}}}}},"500":{"description":"Database query failed"}}}},
    "/tools/categories": {"servers":[{"url":"/api/v1"}],"get":{"summary":"AI tool categories with published tool counts","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object"}}}}}}},"500":{"description":"Database query failed"}}}},
    "/tools/tags": {"servers":[{"url":"/api/v1"}],"get":{"summary":"AI tool scenario and pricing filter definitions; definitions do not assert tool facts","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object"}}}}}}},"500":{"description":"Database query failed"}}}},
    "/tools/{slug}": {"servers":[{"url":"/api/v1"}],"get":{"summary":"Published tool details; unknown price facts remain null","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"lang","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"tool":{"type":"object","properties":{"id":{"type":"integer"},"name":{"type":"string"},"slug":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":"string"},"descriptionEn":{"type":"string"},"pricingType":{"type":"string"},"pricingVerified":{"type":"boolean"},"hasFreeTier":{"type":["boolean","null"]},"requiresCreditCard":{"type":["boolean","null"]},"pricingSourceUrl":{"type":"string"},"reviewSourceUrl":{"type":"string"},"tags":{"type":"array","items":{"type":"object"}}}}}}}}},"404":{"description":"Published tool not found"},"500":{"description":"Database query failed"}}}},
    "/tools/{id}/click": {"servers":[{"url":"/api/v1"}],"post":{"summary":"Record an outbound click for a published tool","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}},"400":{"description":"Invalid ID"},"500":{"description":"Database query failed"}}}},
    "/models": {"servers": [{"url": "/api/v1"}], "get": {"summary": "AI model library (published models, with news counts)", "parameters": [{"name": "org", "in": "query", "schema": {"type": "string"}}, {"name": "open", "in": "query", "schema": {"type": "string"}}, {"name": "cap", "in": "query", "schema": {"type": "string"}}, {"name": "modality", "in": "query", "schema": {"type": "string"}}, {"name": "size", "in": "query", "schema": {"type": "string"}}, {"name": "commercial", "in": "query", "schema": {"type": "string"}}, {"name": "region", "in": "query", "schema": {"type": "string"}}, {"name": "q", "in": "query", "schema": {"type": "string"}}, {"name": "sort", "in": "query", "schema": {"type": "string"}}, {"name": "page", "in": "query", "schema": {"type": "integer"}}, {"name": "pageSize", "in": "query", "schema": {"type": "integer"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK. Prices are USD per 1M tokens.", "content": {"application/json": {"schema": {"type": "object", "properties": {"models": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}, "page": {"type": "integer"}, "pageSize": {"type": "integer"}}}}}}}}},
    "/models/{slug}": {"servers": [{"url": "/api/v1"}], "get": {"summary": "One model, its price history and news timeline", "parameters": [{"name": "slug", "in": "path", "required": true, "schema": {"type": "string"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"model": {"type": "object"}, "prices": {"type": "array", "items": {"type": "object"}}, "items": {"type": "array", "items": {"type": "object"}}, "related": {"type": "array", "items": {"type": "object"}}}}}}}, "404": {"description": "Unknown or unpublished slug"}}}},
    "/funding": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Disclosed AI funding rounds", "parameters": [{"name": "country", "in": "query", "schema": {"type": "string"}}, {"name": "round", "in": "query", "schema": {"type": "string"}}, {"name": "q", "in": "query", "schema": {"type": "string"}}, {"name": "page", "in": "query", "schema": {"type": "integer"}}, {"name": "size", "in": "query", "schema": {"type": "integer"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"rounds": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}, "page": {"type": "integer"}, "size": {"type": "integer"}}}}}}}}},
    "/funding/facets": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Funding facets plus a 90-day roll-up", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"countries": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}, "rounds": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}, "total": {"type": "integer"}, "recent90Count": {"type": "integer"}, "recent90Usd": {"type": "integer"}}}}}}}}},
    "/policy": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Policy desk — AI rules, consultations and guidance", "parameters": [{"name": "country", "in": "query", "schema": {"type": "string"}}, {"name": "type", "in": "query", "schema": {"type": "string"}}, {"name": "status", "in": "query", "schema": {"type": "string"}}, {"name": "affects", "in": "query", "schema": {"type": "string"}}, {"name": "q", "in": "query", "schema": {"type": "string"}}, {"name": "page", "in": "query", "schema": {"type": "integer"}}, {"name": "size", "in": "query", "schema": {"type": "integer"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"policies": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}, "page": {"type": "integer"}, "size": {"type": "integer"}}}}}}}}},
    "/policy/calendar": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Dated policy events", "parameters": [{"name": "days", "in": "query", "schema": {"type": "integer"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"events": {"type": "array", "items": {"type": "object"}}, "from": {"type": "string"}, "to": {"type": "string"}}}}}}}}},
    "/policy/programs": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Government AI programmes and grants", "description": "May be empty while the editors are still entering them.", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"programs": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}}}}}}}}},
    "/rank": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Weekly charts — ASEAN / China / global / papers", "description": "Editorial score with same-story folding. Without week it is the current SGT week; in the first 24h of a new week the previous full week is returned with rolledBack=true.", "parameters": [{"name": "week", "in": "query", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"week": {"type": "string"}, "partial": {"type": "boolean"}, "rolledBack": {"type": "boolean"}, "sections": {"type": "object"}, "tracks": {"type": "object"}, "countries": {"type": "array", "items": {"type": "object"}}, "sources": {"type": "array", "items": {"type": "object"}}, "weeks": {"type": "array", "items": {"type": "string"}}}}}}}}}},
    "/rank/companies": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Company chart", "parameters": [{"name": "country", "in": "query", "schema": {"type": "string"}}, {"name": "size", "in": "query", "schema": {"type": "integer"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"companies": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}, "all": {"type": "integer"}, "countries": {"type": "array", "items": {"$ref": "#/components/schemas/Facet"}}}}}}}}}},
    "/tags/hub": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Topic hub", "parameters": [{"name": "tag", "in": "query", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"hub": {"type": "object"}, "stories": {"type": "array", "items": {"type": "object"}}}}}}}}}},
    "/stories": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Trackers — running stories the editors follow", "description": "May be empty while the editors are still opening them.", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"stories": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}}}}}}}}},
    "/guides": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Company guides", "description": "May be empty while the editors are still writing them.", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"guides": {"type": "array", "items": {"type": "object"}}, "total": {"type": "integer"}}}}}}}}},
    "/weekly/latest": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Latest weekly issue", "parameters": [{"name": "lang", "in": "query", "schema": {"type": "string"}}], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"weekStart": {"type": "string"}, "weekEnd": {"type": "string"}, "issueNo": {"type": "integer"}, "headline": {"type": "string"}, "leadMd": {"type": "string"}, "sections": {"type": "object"}, "stats": {"type": "object"}}}}}}}}},
    "/weekly/archive": {"servers": [{"url": "/api/v1"}], "get": {"summary": "Past weekly issues", "parameters": [], "responses": {"200": {"description": "OK", "content": {"application/json": {"schema": {"type": "object", "properties": {"issues": {"type": "array", "items": {"type": "object"}}}}}}}}}}
  }
}