{
  "openapi": "3.1.0",
  "info": {
    "title": "GoalXData Football API",
    "version": "1.5.0",
    "description": "GoalXData 自有足球数据合同。公开响应只包含 GoalXData 公共 ID、字段、完整性、新鲜度和授权信息。赔率公司只返回 GoalXData 英文/数字简称，不返回公司全名。"
  },
  "servers": [{ "url": "https://goalxdata.com" }],
  "security": [{ "GoalXDataApiKey": [] }, { "GoalXDataHeaderKey": [] }],
  "paths": {
    "/api/v1/football/capabilities": { "get": { "operationId": "listCapabilities", "summary": "能力目录", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/competitions": { "get": { "operationId": "listCompetitions", "summary": "赛事目录", "description": "返回全部已入库赛事目录；没有当前比赛的赛事仍保留目录实体。", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/competitions/{id}": { "get": { "operationId": "getCompetition", "summary": "赛事详情", "parameters": [{ "$ref": "#/components/parameters/CompetitionId" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/seasons": { "get": { "operationId": "listSeasons", "summary": "赛季目录", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/seasons/{id}": { "get": { "operationId": "getSeason", "summary": "赛季详情", "parameters": [{ "$ref": "#/components/parameters/SeasonId" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/teams": { "get": { "operationId": "listTeams", "summary": "球队目录", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/teams/{id}": { "get": { "operationId": "getTeam", "summary": "球队详情", "parameters": [{ "$ref": "#/components/parameters/TeamId" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/players": { "get": { "operationId": "listPlayers", "summary": "球员目录", "description": "name/nameZh 为 GoalXData 标准中文显示名，nameEn 保留英文核对值；有可用图片时 imageUrl 为 GoalXData 第一方资源路径。", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/players/{id}": { "get": { "operationId": "getPlayer", "summary": "球员详情", "description": "返回标准中文名、英文核对名和可用的第一方图片路径；无真实姓名或图片时保持 null。", "parameters": [{ "$ref": "#/components/parameters/PlayerId" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/standings": { "get": { "operationId": "listStandings", "summary": "积分榜", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/squads": { "get": { "operationId": "listSquads", "summary": "阵容", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/matches": { "get": { "operationId": "listMatches", "summary": "比赛列表", "description": "未来赛程修正保持同一 gxf_。updatedSince 用于增量读取改期、状态或主客队修正；建议每 15 秒轮询并保存最大 dataUpdatedAt。", "parameters": [{ "$ref": "#/components/parameters/UpdatedSince" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "400": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}": { "get": { "operationId": "getMatch", "summary": "比赛详情", "description": "所有状态均返回 preMatch 模块和 preMatchForecast 赛前概率摘要。摘要按实际源值给出全场赛果、上半场赛果、双方进球、1.5/2.5/3.5 进球线、率先进球、双重机会、半全场、明确比分和证据化比赛看点；概率按 0–100 返回，缺失保持 unavailable，不补零。预计阵容只在 T−6h/T−4h/T−2h 前检查并在首次有值后冻结；T−90m 后检查正式阵容。赛中只更新比分与状态，赛前记录冻结为开赛前最后快照；完赛继续保留赛前记录并追加 postMatch，postMatch.modules.events 返回完整本场事件线。currentPeriod 仅保留模块位，不采集、不刷新、不回填。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/MatchDetailSuccess" } } } },
    "/api/v1/football/matches/{id}/post-match-news": { "get": { "operationId": "getPostMatchNews", "summary": "赛后新闻", "description": "根据已验证的完场比分、事件线和技术统计生成白标中文赛后新闻。制胜球、绝杀、冠军、晋级和世界波按逐项证据门槛输出；证据不足时明确保持未验证。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}/modules": { "get": { "operationId": "listMatchModules", "summary": "单场数据模块", "description": "返回一场比赛全部 35 个公开数据模块的可用性、记录数、覆盖和新鲜度；大体积比赛事实不嵌入目录响应。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/matches/{id}/modules/{module}": { "get": { "operationId": "getMatchModule", "summary": "单场指定数据模块", "description": "按模块读取新闻、教练、预计阵容、正式阵容、xG、天气、裁判和比赛事实等单场数据；缺失保持 unavailable，不补零。matchFacts 是 35 个公开模块之一：赛前使用独立请求组，历史与赛后并入统一 34 模块补抓；默认每页 50 条，最多 100 条。赛前详情不包含赔率。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }, { "$ref": "#/components/parameters/MatchModule" }, { "$ref": "#/components/parameters/ModuleLimit" }, { "$ref": "#/components/parameters/ModuleOffset" }], "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/team-season-metrics": { "get": { "operationId": "listTeamSeasonMetrics", "summary": "球队赛季指标", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/player-season-metrics": { "get": { "operationId": "listPlayerSeasonMetrics", "summary": "球员赛季指标", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/pregame-index": { "get": { "operationId": "listAdvancedOdds", "summary": "高级赛前赔率当前快照列表", "description": "正式开放。每场默认返回该时点完整当前快照：全部实际可用公司简称、市场、指数和赔率；不返回此前每一次变盘。每个 HTTP 请求只计 1 次，返回记录条数不另计次。只返回已完成比赛配对、已通过新鲜度校验且未处于赛程修订复核暂停的正式快照；不补零、不合成。需要实时接收后续变盘时使用 prematch WebSocket 并由客户自行保存；新历史赔率附加包仍只提供出盘与临场。date 按北京时间自然日解释，date-time 响应使用 +08:00。允许并建议最快每 2 秒调用。", "parameters": [{ "$ref": "#/components/parameters/OddsDate" }, { "$ref": "#/components/parameters/OddsCompetitionId" }, { "$ref": "#/components/parameters/OddsMatchId" }, { "$ref": "#/components/parameters/OddsMarketKeys" }, { "$ref": "#/components/parameters/OddsMainLinesOnly" }, { "$ref": "#/components/parameters/OddsMaxLinesPerBookmaker" }, { "$ref": "#/components/parameters/OddsLimit" }], "responses": { "200": { "$ref": "#/components/responses/AdvancedOddsListSuccess" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}/pre-match-index": { "get": { "operationId": "getAdvancedOdds", "summary": "单场高级赛前赔率当前快照", "description": "正式开放。只接受比赛列表返回的 gxf_ 公共 ID；默认一次返回该场当时全部实际可用公司简称、市场、指数和赔率，但不返回此前每一次变盘。只返回已配对、新鲜且未处于赛程修订复核暂停的正式快照，开赛后停止返回。需要实时接收后续变盘时使用 prematch WebSocket 并自行保存。允许并建议最快每 2 秒调用。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }, { "$ref": "#/components/parameters/OddsMarketKeys" }, { "$ref": "#/components/parameters/OddsMainLinesOnly" }, { "$ref": "#/components/parameters/OddsMaxLinesPerBookmaker" }], "responses": { "200": { "$ref": "#/components/responses/AdvancedOddsDetailSuccess" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}/pre-match-index/history": { "get": { "operationId": "getLegacyAdvancedOddsHistory", "summary": "旧版全部已观测赛前赔率历史（兼容接口）", "deprecated": true, "description": "仅为已签发且保留旧版 football:advanced-odds/football:prematch-odds scope 的 Key 提供兼容；新合同不授予本接口。返回 GoalXData 实际观测并保存的出盘基线和中间变化，不承诺恢复采集覆盖之外的瞬时变化。新历史赔率附加包只提供出盘与临场，不提供中间变化。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }, { "$ref": "#/components/parameters/LegacyOddsHistoryLimit" }, { "$ref": "#/components/parameters/LegacyOddsHistoryOffset" }], "responses": { "200": { "$ref": "#/components/responses/AdvancedOddsHistorySuccess" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}/pre-match-index/opening-closing": { "get": { "operationId": "getHistoricalOpeningClosingOdds", "summary": "历史赔率出盘与临场", "description": "需要独立历史赔率附加包 football:history:odds。仅返回全场进球数、全场让球盘、全场胜平负三个市场中上游实际提供的出盘与临场盘口和赔率；不返回中间变化，不补零、不推断、不合成。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/matches/{id}/in-play-index": { "get": { "operationId": "getInplayOdds", "summary": "单场滚球赔率", "description": "独立产品，只向拥有 football:inplay-odds 权限的指定客户开放。比赛进行中返回最新完整滚球快照，允许并建议最快每 2 秒调用。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/InplayOddsSuccess" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "404": { "$ref": "#/components/responses/Error" }, "409": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/realtime/ticket": { "post": { "operationId": "createOddsWebSocketTicket", "summary": "创建赔率 WebSocket 正式商业版连接票据", "description": "长期 API Key 只能放在客户后端，用它创建 90 秒有效且只能成功建连一次的短期连接票据；浏览器或 App 只接收短期 URL。断线后必须重新换票，不得复用旧 URL。该 HTTP 请求计入普通 REST 全局额度；WebSocket 推送消息不计 REST 次数。每个 Key 最多同时 2 条连接，每条连接订阅 1–100 场比赛；按 sequence/eventId 去重并用 afterSequence 断线续传。赛前与赛中频道分别要求独立附加包。24 小时是状态恢复窗口；匹配事件不超过 2,000 条时保证增量续传，超限或游标过期时发送 resume_reset 和最新快照，不承诺回放全部中间事件。赔率消息的 capturedAt、committedAt 及公司级时间直接使用 Asia/Shanghai +08:00。", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["fixtureIds"], "properties": { "fixtureIds": { "type": "array", "minItems": 1, "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" } }, "channels": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "enum": ["prematch", "inplay"] } }, "afterSequence": { "type": ["string", "null"], "pattern": "^[0-9]{1,30}$" } }, "additionalProperties": false } } } }, "responses": { "200": { "$ref": "#/components/responses/WebSocketTicketSuccess" }, "400": { "$ref": "#/components/responses/Error" }, "401": { "$ref": "#/components/responses/Error" }, "403": { "$ref": "#/components/responses/Error" }, "429": { "$ref": "#/components/responses/Error" }, "503": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/history/matches": { "get": { "operationId": "listHistoricalMatches", "summary": "历史比赛列表", "description": "需要历史数据附加包。", "responses": { "200": { "$ref": "#/components/responses/Success" }, "403": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/history/matches/{id}": { "get": { "operationId": "getHistoricalMatch", "summary": "历史单场详情", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "403": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/history/matches/{id}/modules": { "get": { "operationId": "listHistoricalMatchModules", "summary": "历史单场数据模块", "description": "需要历史数据附加包；返回该场全部 35 个公开模块的真实可用性、记录数、覆盖和新鲜度。历史缺口按独立、限容任务回填；没有真实值时保持 unavailable。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "403": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/history/matches/{id}/modules/{module}": { "get": { "operationId": "getHistoricalMatchModule", "summary": "历史单场指定数据模块", "description": "需要历史数据附加包；按模块读取新闻、教练、预计阵容、xG、天气、趋势、场地和比赛事实等实际有值数据，不补零、不推算。matchFacts 默认每页 50 条，最多 100 条。", "parameters": [{ "$ref": "#/components/parameters/FixtureId" }, { "$ref": "#/components/parameters/MatchModule" }, { "$ref": "#/components/parameters/ModuleLimit" }, { "$ref": "#/components/parameters/ModuleOffset" }], "responses": { "200": { "$ref": "#/components/responses/Success" }, "403": { "$ref": "#/components/responses/Error" } } } },
    "/api/v1/football/history/team-season-metrics": { "get": { "operationId": "listHistoricalTeamSeasonMetrics", "summary": "历史球队赛季指标", "responses": { "200": { "$ref": "#/components/responses/Success" } } } },
    "/api/v1/football/history/player-season-metrics": { "get": { "operationId": "listHistoricalPlayerSeasonMetrics", "summary": "历史球员赛季指标", "responses": { "200": { "$ref": "#/components/responses/Success" } } } }
  },
  "components": {
    "securitySchemes": { "GoalXDataApiKey": { "type": "http", "scheme": "bearer", "bearerFormat": "API Key" }, "GoalXDataHeaderKey": { "type": "apiKey", "in": "header", "name": "X-API-Key" } },
    "parameters": {
      "CompetitionId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^gxc_[A-Za-z0-9_-]+$" } },
      "SeasonId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^gxs_[A-Za-z0-9_-]+$" } },
      "TeamId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^gxt_[A-Za-z0-9_-]+$" } },
      "PlayerId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^gxp_[A-Za-z0-9_-]+$" } },
      "FixtureId": { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" } },
      "OddsDate": { "name": "date", "in": "query", "required": false, "description": "北京时间自然日。", "schema": { "type": "string", "format": "date" } },
      "OddsCompetitionId": { "name": "competitionId", "in": "query", "required": false, "schema": { "type": "string", "pattern": "^gxc_[A-Za-z0-9_-]+$" } },
      "OddsMatchId": { "name": "matchId", "in": "query", "required": false, "schema": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" } },
      "OddsMarketKeys": { "name": "marketKeys", "in": "query", "required": false, "description": "逗号分隔；可选 moneyline、asian_handicap、goals_over_under。", "schema": { "type": "string" } },
      "OddsMainLinesOnly": { "name": "mainLinesOnly", "in": "query", "required": false, "schema": { "type": "boolean", "default": false } },
      "OddsMaxLinesPerBookmaker": { "name": "maxLinesPerBookmaker", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 1, "maximum": 50 } },
      "OddsLimit": { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 1, "maximum": 200 } },
      "LegacyOddsHistoryLimit": { "name": "limit", "in": "query", "required": false, "description": "仅旧合同兼容的赛前全变盘历史使用；每页最多读取的已保存快照差异数，默认 50，最大 500。", "schema": { "type": "integer", "minimum": 1, "maximum": 500, "default": 50 } },
      "LegacyOddsHistoryOffset": { "name": "offset", "in": "query", "required": false, "description": "仅旧合同兼容的赛前全变盘历史使用；从 0 开始，第一页包含 openingSnapshot，后续页通过前一快照连续计算变化。", "schema": { "type": "integer", "minimum": 0, "maximum": 1000000, "default": 0 } },
      "UpdatedSince": { "name": "updatedSince", "in": "query", "required": false, "description": "ISO 8601 时间；返回 dataUpdatedAt 不早于该值的当前赛季比赛修正。", "schema": { "type": "string", "format": "date-time" } },
      "MatchModule": { "name": "module", "in": "path", "required": true, "schema": { "type": "string", "enum": ["fixture", "sport", "state", "participants", "league", "season", "stage", "round", "group", "aggregate", "venue", "scores", "periods", "currentPeriod", "matchFacts", "events", "statistics", "lineups", "formations", "referees", "coaches", "timeline", "xg", "pressure", "weather", "trends", "ballCoordinates", "predictions", "expectedLineups", "sidelined", "tvStations", "comments", "matchAttributes", "preMatchNews", "postMatchNews"] } },
      "ModuleLimit": { "name": "limit", "in": "query", "required": false, "description": "仅 matchFacts 使用；默认 50，最大 100。", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 } },
      "ModuleOffset": { "name": "offset", "in": "query", "required": false, "description": "仅 matchFacts 使用；从 0 开始。", "schema": { "type": "integer", "minimum": 0, "default": 0 } }
    },
    "responses": {
      "Success": { "description": "GoalXData success response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse" } } } },
      "AdvancedOddsListSuccess": {
        "description": "高级赔率比赛数组。",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                { "$ref": "#/components/schemas/ApiResponse" },
                { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsMatch" } } } }
              ]
            }
          }
        }
      },
      "AdvancedOddsDetailSuccess": {
        "description": "单场高级赔率聚合。",
        "content": {
          "application/json": {
            "schema": {
              "allOf": [
                { "$ref": "#/components/schemas/ApiResponse" },
                { "type": "object", "properties": { "data": { "type": "object", "properties": { "index": { "$ref": "#/components/schemas/AdvancedOddsMatch" } } } } }
              ]
            }
          }
        }
      },
      "AdvancedOddsHistorySuccess": { "description": "单场全部已观测赛前赔率历史。", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/ApiResponse" }, { "type": "object", "properties": { "data": { "type": "object", "properties": { "history": { "$ref": "#/components/schemas/AdvancedOddsHistory" } } } } }] } } } },
      "InplayOddsSuccess": { "description": "单场当前滚球赔率完整快照。", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/ApiResponse" }, { "type": "object", "properties": { "data": { "type": "object", "properties": { "index": { "$ref": "#/components/schemas/InplayOddsMatch" } } } } }] } } } },
      "MatchDetailSuccess": { "description": "GoalXData match detail response", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/ApiResponse" }, { "type": "object", "properties": { "data": { "type": "object", "properties": { "preMatchForecast": { "$ref": "#/components/schemas/PreMatchForecast" } } } } }] } } } },
      "WebSocketTicketSuccess": { "description": "短期、单次使用的 WebSocket 连接票据。", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/ApiResponse" }, { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/WebSocketTicketData" } } }] } } } },
      "Error": { "description": "GoalXData error response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse" } } } }
    },
    "schemas": {
      "ApiResponse": { "type": "object", "required": ["schemaVersion", "ok", "requestId", "data", "meta", "links"], "properties": { "schemaVersion": { "const": "goalxdata_api_response_v1" }, "ok": { "type": "boolean" }, "requestId": { "type": "string" }, "code": { "type": "string" }, "error": { "type": ["string", "null"] }, "data": {}, "pagination": { "type": ["object", "null"], "additionalProperties": true }, "meta": { "type": "object", "additionalProperties": true }, "links": { "type": "object", "additionalProperties": true } } },
      "AdvancedOddsMatch": { "type": "object", "required": ["linkedFootballMatchId", "competitionId", "kickoffAt", "snapshotCapturedAt", "schemaVersion", "snapshotMode", "bookmakerCount", "marketCount", "indexCount", "oddsCount", "marketKeys", "markets"], "properties": { "linkedFootballMatchId": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" }, "competitionId": { "type": "string", "pattern": "^gxc_[A-Za-z0-9_-]+$" }, "leagueName": { "type": "string" }, "leagueNameZh": { "type": ["string", "null"] }, "leagueNameEn": { "type": ["string", "null"] }, "kickoffAt": { "type": "string", "format": "date-time" }, "formattedDate": { "type": "string", "format": "date" }, "timeText": { "type": "string" }, "homeTeam": { "type": ["object", "null"], "additionalProperties": true }, "awayTeam": { "type": ["object", "null"], "additionalProperties": true }, "snapshotCapturedAt": { "type": "string", "format": "date-time" }, "schemaVersion": { "const": "goalxdata_advanced_odds_v2" }, "snapshotMode": { "const": "full_current_snapshot" }, "bookmakerSlots": { "type": "integer", "minimum": 1 }, "bookmakerCount": { "type": "integer", "minimum": 1 }, "marketCount": { "type": "integer", "minimum": 1 }, "indexCount": { "type": "integer", "minimum": 1 }, "oddsCount": { "type": "integer", "minimum": 1 }, "marketKeys": { "type": "array", "items": { "type": "string", "enum": ["moneyline", "asian_handicap", "goals_over_under"] } }, "freshness": { "type": "object", "additionalProperties": true }, "markets": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsMarket" } } } },
      "AdvancedOddsMarket": { "type": "object", "required": ["marketKey", "marketName", "bookmakers"], "properties": { "marketKey": { "type": "string", "enum": ["moneyline", "asian_handicap", "goals_over_under"] }, "marketName": { "type": "string", "description": "市场。" }, "marketKind": { "type": "string" }, "segment": { "type": ["string", "null"] }, "period": { "type": ["string", "null"] }, "bookmakers": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsBookmaker" } } } },
      "AdvancedOddsBookmaker": { "type": "object", "required": ["bookmakerCode", "lines"], "properties": { "bookmakerCode": { "$ref": "#/components/schemas/BookmakerAbbreviation" }, "capturedAt": { "type": ["string", "null"], "format": "date-time" }, "stopped": { "type": "boolean" }, "lines": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsIndex" } } }, "additionalProperties": false },
      "AdvancedOddsIndex": { "type": "object", "required": ["lineKey", "index", "selections"], "properties": { "lineKey": { "type": "string" }, "lineType": { "type": ["string", "null"] }, "index": { "type": ["string", "null"], "description": "指数，例如大小球 2.5。" }, "isMain": { "type": ["boolean", "null"] }, "stopped": { "type": "boolean" }, "selections": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsSelection" } } }, "additionalProperties": false },
      "AdvancedOddsSelection": { "type": "object", "required": ["selectionKey", "name", "priceDecimal", "stopped"], "properties": { "selectionKey": { "type": "string" }, "name": { "type": "string" }, "priceDecimal": { "type": ["string", "null"], "description": "十进制赔率。" }, "stopped": { "type": "boolean" } }, "additionalProperties": false },
      "AdvancedOddsHistory": { "type": "object", "required": ["schemaVersion", "product", "stage", "historyMode", "historySemantics", "coverageStartedAt", "lastCapturedAt", "kickoffAt", "finalized", "observedSnapshotCount", "timelineEntryCount", "changeCount", "openingSnapshot", "timeline", "continuity"], "properties": { "schemaVersion": { "const": "goalxdata_advanced_odds_history_v1" }, "product": { "const": "advanced_odds" }, "stage": { "const": "prematch" }, "historyMode": { "const": "opening_snapshot_plus_changes" }, "historySemantics": { "const": "complete_observed_history" }, "coverageStartedAt": { "type": "string", "format": "date-time" }, "lastCapturedAt": { "type": "string", "format": "date-time" }, "kickoffAt": { "type": "string", "format": "date-time" }, "finalized": { "type": "boolean" }, "observedSnapshotCount": { "type": "integer", "minimum": 1 }, "timelineEntryCount": { "type": "integer", "minimum": 0 }, "changeCount": { "type": "integer", "minimum": 0 }, "openingSnapshot": { "type": "object", "properties": { "capturedAt": { "type": "string", "format": "date-time" }, "markets": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsMarket" } } } }, "timeline": { "type": "array", "items": { "type": "object", "required": ["capturedAt", "changes"], "properties": { "capturedAt": { "type": "string", "format": "date-time" }, "changes": { "type": "array", "items": { "type": "object", "additionalProperties": true } } } } }, "continuity": { "type": "object", "required": ["scope", "unobservedChangesRecoverable", "duplicateSnapshotsRemoved"], "properties": { "scope": { "const": "all_snapshots_observed_and_saved_by_goalxdata" }, "unobservedChangesRecoverable": { "type": "boolean", "description": "是否能够恢复采集覆盖之外未观测到的变化。" }, "duplicateSnapshotsRemoved": { "type": "boolean" } }, "additionalProperties": false } } },
      "InplayOddsMatch": { "type": "object", "required": ["schemaVersion", "product", "stage", "snapshotMode", "snapshotCapturedAt", "bookmakerCount", "marketCount", "indexCount", "oddsCount", "marketKeys", "markets"], "properties": { "schemaVersion": { "const": "goalxdata_inplay_odds_v1" }, "product": { "const": "inplay_odds" }, "stage": { "const": "inplay" }, "snapshotMode": { "const": "full_current_snapshot" }, "kickoffAt": { "type": "string", "format": "date-time" }, "snapshotCapturedAt": { "type": "string", "format": "date-time" }, "bookmakerCount": { "type": "integer", "minimum": 1 }, "marketCount": { "type": "integer", "minimum": 1 }, "indexCount": { "type": "integer", "minimum": 1 }, "oddsCount": { "type": "integer", "minimum": 1 }, "marketKeys": { "type": "array", "items": { "type": "string" } }, "freshness": { "type": "object", "additionalProperties": true }, "markets": { "type": "array", "items": { "$ref": "#/components/schemas/AdvancedOddsMarket" } } } },
      "WebSocketTicketData": { "type": "object", "required": ["url", "expiresAt", "channels", "fixtureIds", "afterSequence", "heartbeatSeconds", "maxConnectionsPerKey", "resumeMode", "stateRecoveryWindowSeconds", "gaplessReplayMaxEvents"], "properties": { "url": { "type": "string", "format": "uri", "pattern": "^wss://stream\\.goalxdata\\.com/v1/odds\\?ticket=", "description": "90 秒内使用一次；属于敏感短期凭证，不得记录日志。" }, "expiresAt": { "type": "string", "format": "date-time" }, "channels": { "type": "array", "items": { "type": "string", "enum": ["prematch", "inplay"] } }, "fixtureIds": { "type": "array", "items": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" } }, "afterSequence": { "type": ["string", "null"], "pattern": "^[0-9]{1,30}$" }, "heartbeatSeconds": { "type": "integer", "const": 20 }, "maxConnectionsPerKey": { "type": "integer", "const": 2 }, "resumeMode": { "const": "state_recovery_with_bounded_gapless_replay" }, "stateRecoveryWindowSeconds": { "type": "integer", "const": 86400 }, "gaplessReplayMaxEvents": { "type": "integer", "const": 2000 }, "resumeWindowSeconds": { "type": "integer", "const": 86400, "deprecated": true } }, "additionalProperties": false },
      "WebSocketSubscribedMessage": { "type": "object", "required": ["schemaVersion", "type", "channels", "fixtureIds", "heartbeatSeconds", "websocketMessagesCountTowardRestQuota"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "subscribed" }, "channels": { "type": "array", "items": { "type": "string", "enum": ["prematch", "inplay"] } }, "fixtureIds": { "type": "array", "items": { "type": "string" } }, "heartbeatSeconds": { "type": "integer" }, "websocketMessagesCountTowardRestQuota": { "const": false } }, "additionalProperties": false },
      "WebSocketOddsSelection": { "type": "object", "required": ["selectionKey", "name", "priceDecimal", "stopped"], "properties": { "selectionKey": { "type": "string" }, "name": { "type": "string" }, "priceDecimal": { "type": ["string", "null"] }, "stopped": { "type": "boolean" } }, "additionalProperties": false },
      "WebSocketOddsLine": { "type": "object", "required": ["lineKey", "lineType", "index", "lineName", "isMain", "stopped", "selections"], "properties": { "lineKey": { "type": "string" }, "lineType": { "type": ["string", "null"] }, "index": { "type": ["string", "null"], "description": "统一指数值，例如让球或大小球 2.5。" }, "lineName": { "type": ["string", "null"], "deprecated": true, "description": "index 的兼容旧别名；新客户使用 index。" }, "isMain": { "type": ["boolean", "null"] }, "stopped": { "type": "boolean" }, "selections": { "type": "array", "items": { "$ref": "#/components/schemas/WebSocketOddsSelection" } } }, "additionalProperties": false },
      "WebSocketOddsBookmaker": { "type": "object", "required": ["bookmakerCode", "bookmakerName", "capturedAt", "stopped", "lines"], "properties": { "bookmakerCode": { "$ref": "#/components/schemas/BookmakerAbbreviation" }, "bookmakerName": { "allOf": [{ "$ref": "#/components/schemas/BookmakerAbbreviation" }], "deprecated": true, "description": "bookmakerCode 的兼容别名，值仍是同一简称，不是公司全名。" }, "capturedAt": { "type": ["string", "null"], "format": "date-time" }, "stopped": { "type": "boolean" }, "lines": { "type": "array", "items": { "$ref": "#/components/schemas/WebSocketOddsLine" } } }, "additionalProperties": false },
      "WebSocketOddsMarket": { "type": "object", "required": ["marketKey", "marketName", "marketKind", "bookmakers"], "properties": { "marketKey": { "type": "string", "enum": ["moneyline", "asian_handicap", "goals_over_under"] }, "marketName": { "type": "string" }, "marketKind": { "type": "string" }, "bookmakers": { "type": "array", "items": { "$ref": "#/components/schemas/WebSocketOddsBookmaker" } } }, "additionalProperties": false },
      "WebSocketRealtimeOddsPayload": { "type": "object", "required": ["schemaVersion", "type", "fixtureId", "stage", "capturedAt", "committedAt", "data"], "properties": { "schemaVersion": { "const": "goalxdata_realtime_odds_event_v1" }, "type": { "type": "string", "enum": ["odds.snapshot", "odds.change"] }, "fixtureId": { "type": "string", "pattern": "^gxf_[A-Za-z0-9_-]+$" }, "stage": { "type": "string", "enum": ["prematch", "inplay"] }, "capturedAt": { "type": "string", "format": "date-time", "description": "北京时间 +08:00。" }, "committedAt": { "type": "string", "format": "date-time", "description": "北京时间 +08:00。" }, "data": { "type": "object", "required": ["schemaVersion", "markets"], "properties": { "schemaVersion": { "const": "goalxdata_odds_v1" }, "markets": { "type": "array", "items": { "$ref": "#/components/schemas/WebSocketOddsMarket" } } }, "additionalProperties": false } }, "additionalProperties": false },
      "WebSocketOddsMessage": { "type": "object", "required": ["schemaVersion", "type", "delivery", "sequence", "eventId", "payload"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "odds" }, "delivery": { "type": "string", "enum": ["initial", "replay", "live"] }, "sequence": { "type": "string", "pattern": "^[0-9]{1,30}$" }, "eventId": { "type": "string" }, "payload": { "$ref": "#/components/schemas/WebSocketRealtimeOddsPayload" } }, "additionalProperties": false },
      "WebSocketReadyMessage": { "type": "object", "required": ["schemaVersion", "type", "lastSequence"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "ready" }, "lastSequence": { "type": "string", "pattern": "^[0-9]{1,30}$" } }, "additionalProperties": false },
      "WebSocketResumeResetMessage": { "type": "object", "required": ["schemaVersion", "type", "reason", "replayComplete", "recoveryMode", "lastSequence", "stateRecoveryWindowSeconds", "gaplessReplayMaxEvents"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "resume_reset" }, "reason": { "type": "string", "enum": ["cursor_ahead_of_stream", "state_recovery_window_exceeded", "gapless_replay_limit_exceeded"] }, "replayComplete": { "const": false }, "recoveryMode": { "const": "latest_snapshot" }, "lastSequence": { "type": "string" }, "stateRecoveryWindowSeconds": { "type": "integer" }, "gaplessReplayMaxEvents": { "type": "integer" } }, "additionalProperties": false },
      "WebSocketPongMessage": { "type": "object", "required": ["schemaVersion", "type", "serverTime"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "pong" }, "serverTime": { "type": "string", "format": "date-time", "description": "北京时间 +08:00。" } }, "additionalProperties": false },
      "WebSocketErrorMessage": { "type": "object", "required": ["schemaVersion", "type", "code"], "properties": { "schemaVersion": { "const": "goalxdata_websocket_message_v1" }, "type": { "const": "error" }, "code": { "type": "string", "enum": ["unsupported_client_message", "invalid_client_message"] } }, "additionalProperties": false },
      "WebSocketMessage": { "oneOf": [{ "$ref": "#/components/schemas/WebSocketSubscribedMessage" }, { "$ref": "#/components/schemas/WebSocketOddsMessage" }, { "$ref": "#/components/schemas/WebSocketReadyMessage" }, { "$ref": "#/components/schemas/WebSocketResumeResetMessage" }, { "$ref": "#/components/schemas/WebSocketPongMessage" }, { "$ref": "#/components/schemas/WebSocketErrorMessage" }], "discriminator": { "propertyName": "type" } },
      "PreMatchForecast": {
        "type": ["object", "null"],
        "description": "GoalXData 赛前概率摘要。只从实际预测源值和已完赛历史样本归纳，不生成缺失概率。",
        "properties": {
          "availability": { "type": "string", "enum": ["available", "unavailable"] },
          "dynamic": { "type": "boolean" },
          "frozen": { "type": "boolean" },
          "method": { "const": "probability_model" },
          "observedAt": { "type": ["string", "null"], "format": "date-time" },
          "result": {
            "type": ["object", "null"],
            "properties": {
              "home": { "type": "number", "minimum": 0, "maximum": 100 },
              "draw": { "type": "number", "minimum": 0, "maximum": 100 },
              "away": { "type": "number", "minimum": 0, "maximum": 100 },
              "leader": {
                "type": "object",
                "properties": {
                  "side": { "type": "string", "enum": ["home", "draw", "away"] },
                  "label": { "type": "string" },
                  "probability": { "type": "number" },
                  "margin": { "type": "number" },
                  "strength": { "type": "string", "enum": ["clear", "lean", "balanced"] }
                }
              },
              "summary": { "type": "string" }
            }
          },
          "bothTeamsToScore": {
            "type": ["object", "null"],
            "properties": {
              "yes": { "type": "number" },
              "no": { "type": "number" }
            }
          },
          "firstHalfResult": {
            "type": ["object", "null"],
            "description": "上半场主胜、平局、客胜概率。",
            "properties": {
              "home": { "type": "number", "minimum": 0, "maximum": 100 },
              "draw": { "type": "number", "minimum": 0, "maximum": 100 },
              "away": { "type": "number", "minimum": 0, "maximum": 100 }
            }
          },
          "teamToScoreFirst": {
            "type": ["object", "null"],
            "description": "主队率先进球、无进球、客队率先进球概率；draw 表示无进球。",
            "properties": {
              "home": { "type": "number", "minimum": 0, "maximum": 100 },
              "draw": { "type": "number", "minimum": 0, "maximum": 100 },
              "away": { "type": "number", "minimum": 0, "maximum": 100 }
            }
          },
          "doubleChance": {
            "type": ["object", "null"],
            "properties": {
              "homeOrDraw": { "type": "number", "minimum": 0, "maximum": 100 },
              "homeOrAway": { "type": "number", "minimum": 0, "maximum": 100 },
              "drawOrAway": { "type": "number", "minimum": 0, "maximum": 100 }
            }
          },
          "halfTimeFullTime": {
            "type": ["array", "null"],
            "maxItems": 9,
            "items": {
              "type": "object",
              "properties": {
                "key": { "type": "string" },
                "label": { "type": "string" },
                "probability": { "type": "number", "minimum": 0, "maximum": 100 }
              }
            }
          },
          "totalGoals": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "line": { "type": "number" },
                "over": { "type": "number" },
                "under": { "type": "number" }
              }
            }
          },
          "correctScores": {
            "type": "array",
            "description": "全部带明确数字比分语义的实际概率，按概率从高到低排序；不返回无法解释的其他桶。",
            "items": {
              "type": "object",
              "properties": {
                "score": { "type": "string" },
                "probability": { "type": "number" }
              }
            }
          },
          "summary": { "type": "string" },
          "insights": {
            "type": "array",
            "maxItems": 5,
            "items": {
              "type": "object",
              "properties": {
                "key": { "type": "string" },
                "title": { "type": "string" },
                "text": { "type": "string" },
                "basis": { "type": "string", "enum": ["probability_model", "historical_sample"] },
                "sampleSize": { "type": "integer", "minimum": 1 }
              }
            }
          },
          "evidence": {
            "type": "object",
            "properties": {
              "predictionRecords": { "type": "integer" },
              "interpretedGroups": { "type": "integer" },
              "historicalInsights": { "type": "integer" }
            }
          },
          "notice": { "type": "string" }
        }
      },
      "PublicId": { "type": "string", "pattern": "^g(?:xc|xs|xt|xp|xf)_[A-Za-z0-9_-]+$" },
      "BookmakerPublicId": { "type": "string", "pattern": "^gxb_[A-Za-z0-9_-]+$", "description": "GoalXData 稳定博彩公司公共 ID；不等于任何采集方 ID。" },
      "BookmakerAbbreviation": { "type": "string", "pattern": "^[A-Za-z0-9_-]+$", "examples": ["365", "CRO", "MAC", "PIN", "WIL"], "description": "GoalXData 受审英文/数字简写；只返回此字段，不返回公司全名。" },
      "MatchModuleDescriptor": { "type": "object", "required": ["key", "nameZh"], "properties": { "key": { "$ref": "#/components/parameters/MatchModule/schema" }, "nameZh": { "type": "string", "description": "GoalXData 标准中文模块名。" } }, "additionalProperties": false }
    }
  },
  "x-goalxdata-products": {
    "postMatchNews": { "name": "赛后新闻", "scope": "football:advanced-detail", "delivery": "rest", "language": "zh-CN", "evidenceGatedClaims": ["decisiveGoal", "lateWinner", "champion", "qualification", "spectacularGoal"] },
    "advancedOdds": { "name": "高级赛前赔率", "scope": "football:advanced-prematch-odds", "delivery": ["rest", "websocket"], "availability": "独立附加包", "pollingSeconds": 2, "history": "current_snapshot_only", "markets": ["actual_available_verified"], "bookmakerCoverage": "18_company_product_coverage_not_a_fixed_public_code_table_per_fixture_may_be_incomplete", "marketPolicy": "当前赛前快照与赛前 WebSocket；只返回已配对且新鲜的实际可用数据，不补零、不合成" },
    "inplayOdds": { "name": "滚球赔率", "scope": "football:inplay-odds", "delivery": ["rest", "websocket"], "availability": "独立附加包", "pollingSeconds": 2, "markets": ["actual_available_verified"], "marketPolicy": "比赛进行中的最新完整滚球快照与 WebSocket 变化推送；与赛前包独立授权；与全部赔率 REST 共享赔率独立额度池" },
    "historicalOdds": { "name": "历史赔率附加包", "scope": "football:history:odds", "delivery": ["rest"], "availability": "独立附加包", "history": "provider_observed_opening_and_closing_only", "markets": ["full_match_moneyline", "full_match_asian_handicap", "full_match_goals_over_under"], "marketPolicy": "逐场返回实际可用的出盘与临场；不含中间变化，不补零、不推断、不合成" }
  },
  "x-goalxdata-season-policy": { "default": "每个赛事当前有效赛季", "historyAddon": "2005 年 1 月 1 日起实际可用赛事和赛季", "historyAvailableFrom": "2005-01-01", "hardcodedSeasonLabel": false },
  "x-goalxdata-localization-policy": { "customerChineseAuthority": "GoalXData 标准中文实体档案与受审业务字典", "moduleKeysStableEnglish": true, "moduleNamesZh": true, "categoryLabelsZh": "goalxdata_dictionary_when_known", "playerNameChineseRequired": true, "playerNameEnglishCompanion": true, "unnamedPlayerPolicy": "null_without_placeholder", "publicMediaHostPolicy": "goalxdata_first_party_only", "sourceSpecificTranslationsPublic": false },
  "x-goalxdata-match-module-catalog": [
    { "key": "fixture", "nameZh": "比赛" },
    { "key": "sport", "nameZh": "运动" },
    { "key": "state", "nameZh": "状态" },
    { "key": "participants", "nameZh": "参赛方" },
    { "key": "league", "nameZh": "赛事" },
    { "key": "season", "nameZh": "赛季" },
    { "key": "stage", "nameZh": "阶段" },
    { "key": "round", "nameZh": "轮次" },
    { "key": "group", "nameZh": "分组" },
    { "key": "aggregate", "nameZh": "两回合汇总" },
    { "key": "venue", "nameZh": "场地" },
    { "key": "scores", "nameZh": "比分" },
    { "key": "periods", "nameZh": "比赛阶段" },
    { "key": "currentPeriod", "nameZh": "当前阶段" },
    { "key": "matchFacts", "nameZh": "比赛事实" },
    { "key": "events", "nameZh": "事件" },
    { "key": "statistics", "nameZh": "统计" },
    { "key": "lineups", "nameZh": "正式阵容" },
    { "key": "formations", "nameZh": "阵型" },
    { "key": "referees", "nameZh": "裁判" },
    { "key": "coaches", "nameZh": "教练" },
    { "key": "timeline", "nameZh": "时间线" },
    { "key": "xg", "nameZh": "预期进球" },
    { "key": "pressure", "nameZh": "攻势" },
    { "key": "weather", "nameZh": "天气" },
    { "key": "trends", "nameZh": "趋势" },
    { "key": "ballCoordinates", "nameZh": "球位置" },
    { "key": "predictions", "nameZh": "预测" },
    { "key": "expectedLineups", "nameZh": "预计阵容" },
    { "key": "sidelined", "nameZh": "伤停" },
    { "key": "tvStations", "nameZh": "转播" },
    { "key": "comments", "nameZh": "评论" },
    { "key": "matchAttributes", "nameZh": "比赛属性" },
    { "key": "preMatchNews", "nameZh": "赛前新闻" },
    { "key": "postMatchNews", "nameZh": "赛后新闻" }
  ],
  "x-goalxdata-bookmaker-policy": { "publicIdPrefix": "gxb_", "publicIdExposed": false, "customerNameFormat": "approved_ascii_abbreviation_only", "customerField": "bookmakerCode", "examples": ["365", "CRO", "MAC", "PIN", "WIL"], "bookmakerChineseRequired": false, "sourceIdsPublic": false, "sourceFullNamesPublic": false, "unknownBookmakerPolicy": "omit_until_approved" },
  "x-goalxdata-future-correction-policy": { "changeWindowSeconds": 10, "pollSeconds": 6, "customerPollingTargetSeconds": 15, "stableMatchId": true, "binding": "持续分片读取本赛季目录、球队和赛程；先唯一绑定赛事目录，再在该目录内唯一绑定球队，最后按实体ID和正负30分钟自动绑定比赛；超过30分钟的赛程变化必须已有绑定、三方源ID一致且上游修改事件已重新核验，否则暂停；名称候选来自GoalXData审核的标准中文/常用名/英文别名；主客反向时同步转换方向数据", "bindingRefreshPolicy": "全赛季目录持续巡检且绑定与赔率采集独立并行；正常15分钟；开赛24小时内5分钟；最后1小时60秒；未来时间修正后重新匹配；比赛绑定后立即激活开盘/变化/临场任务" },
  "x-goalxdata-rate-limit": { "scope": "per_api_key_two_independent_hourly_pools", "perSecondLimit": null, "windowSeconds": 3600, "requestCounting": "one_http_request_equals_one_request_response_record_count_not_charged", "pools": { "Global": { "limit": 4000, "includes": "all_non_odds_rest_requests_including_websocket_ticket_creation" }, "OddsGlobal": { "limit": 4000, "includes": "all_prematch_inplay_current_and_historical_odds_rest_requests" } }, "windowStartsOnFirstPoolRequest": true, "websocketMessagesCountTowardRestQuota": false, "advancedOdds": { "bucket": "OddsGlobal", "pollingSeconds": 2, "historyRequestPolicy": "current_snapshot_only_new_contracts", "retry429": "Retry-After", "retry503Seconds": 60 }, "historicalOdds": { "bucket": "OddsGlobal", "historyRequestPolicy": "opening_and_closing_only", "retry429": "Retry-After", "retry503Seconds": 60 }, "inplayOdds": { "bucket": "OddsGlobal", "pollingSeconds": 2, "retry429": "Retry-After", "retry503Seconds": 2 } },
  "x-goalxdata-websocket-policy": { "status": "generally_available", "commercial": true, "channels": { "prematch": "football:advanced-prematch-odds", "inplay": "football:inplay-odds" }, "ticketEndpoint": "/api/v1/realtime/ticket", "url": "wss://stream.goalxdata.com/v1/odds", "publicHealthUrl": "https://stream.goalxdata.com/health", "messageSchema": "#/components/schemas/WebSocketMessage", "nodeExample": "/examples/goalxdata-websocket-node.mjs", "pythonExample": "/examples/goalxdata-websocket-python.py", "ticketTtlSeconds": 90, "heartbeatSeconds": 20, "maxConnectionsPerKey": 2, "maxFixturesPerConnection": 100, "resumeMode": "state_recovery_with_bounded_gapless_replay", "stateRecoveryWindowSeconds": 86400, "gaplessReplayMaxEvents": 2000, "resumeWindowSeconds": 86400, "resumeWindowSecondsCompatibilityMeaning": "state_recovery_not_full_event_replay", "resumeResetRecovery": "latest_snapshot", "deduplicateBy": ["sequence", "eventId"], "messagesCountTowardRestQuota": false, "httpUpgradeErrors": { "401": ["ticket_required", "websocket_ticket_replayed", "websocket_ticket_invalid", "websocket_ticket_expired_or_invalid"], "403": ["entitlement_inactive", "fixture_scope_inactive"], "429": ["connection_limit_reached"], "503": ["server_stopping", "websocket_ticket_store_unavailable"] }, "closeCodes": { "1001": "server_restart", "1008": "entitlement_or_fixture_scope_inactive", "1011": "initialization_failed", "1013": "slow_consumer" } },
  "x-goalxdata-time-policy": { "timezone": "Asia/Shanghai", "utcOffset": "+08:00", "dateQuerySemantics": "Beijing calendar day", "dateTimeResponseFormat": "ISO 8601 with +08:00 offset", "storage": "UTC instant" }
}
