# Betfair & CN Sports Betting Data (`gobeta_incentive/betfair-cn-sports-betting-data`) Actor

A specialized football investment tool that aggregates real-time trading data from Betfair—such as volume, distribution ratios—alongside Chinese sports lottery (Win/Draw/Loss). It also collects odds and handicap data, including spreads and Over/Under lines, from 39 global bookmakers

- **URL**: https://apify.com/gobeta\_incentive/betfair-cn-sports-betting-data.md
- **Developed by:** [bingobeta](https://apify.com/gobeta_incentive) (community)
- **Categories:** Developer tools, SEO tools, Integrations
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Betfair & CN Sports Betting Data

一个 **Apify Actor**，专门采集 OKooo 上的必发交易所交易数据（成交量、分布比率、冷热指数）和多博彩公司的大小球赔率。

Built by **BingoClaw1** 🦞

---

### 数据字段

每场比赛输出结构化 JSON，包含：

| 数据组 | 说明 |
|--------|------|
| `betfair` | 必发交易盈亏：赔率、成交量、模拟盈亏、冷热指数、分布% |
| `jingcai` | 竞彩做单：赔率、成交量、盈亏、冷热指数、分布% |
| `renqi` | 竞彩人气：赔率、人气量、盈亏 |
| `overUnder[]` | 大小球：各博彩公司的大球/小球赔率和隐含概率 |

**完整示例**:
```json
{
  "matchId": 1277400,
  "matchInfo": { "home": "英格兰", "away": "阿根廷", "league": "世界杯" },
  "totalVolume": 73511156,
  "betfair": {
    "home": { "price": 2.86, "volume": 40268096, "profit": -41655599, "hotIndex": 55, "distributionPct": 54.8 },
    "draw":  { "price": 2.94, "volume": 17473879, "profit": 22137952,  "hotIndex": -28, "distributionPct": 23.8 },
    "away":  { "price": 3.20, "volume": 15769181, "profit": 23049777,  "hotIndex": -32, "distributionPct": 21.4 }
  },
  "jingcai": { ... },
  "renqi": { ... },
  "overUnder": [
    { "company": "Pinnacle", "line": 2.5, "over": { "odds": 1.81, "impliedPct": 55.2 }, "under": { "odds": 2.11, "impliedPct": 47.4 } },
    { "company": "William Hill", "line": 2.5, "over": { "odds": 2.25, "impliedPct": 44.4 }, "under": { "odds": 1.60, "impliedPct": 62.5 } }
  ]
}
````

***

### 使用方式

#### 输入参数

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `matchIds` | string\[] | `[]` | 指定 MatchID 列表。空则自动抓取当日比赛 |
| `fetchOverUnder` | bool | `true` | 是否同时爬取大小球数据（需要 Playwright，较慢） |
| `fetchMatchList` | bool | `true` | 如果 matchIds 为空，是否从 live 页面抓取比赛列表 |
| `wafMode` | string | `"auto"` | WAF 绕过策略：`auto`(HTTP→Playwright), `playwright`, `browseract` |
| `browserActApiKey` | string | `""` | BrowserAct API Key（仅 `wafMode=browseract` 时需要） |
| `maxMatches` | int | `10` | 最多抓取多少场比赛，0=不限 |
| `proxyConfig` | object | Apify proxy | 代理配置 |

#### API 调用

```bash
## 通过 Apify API
curl -X POST "https://api.apify.com/v2/acts/{owner}/{actor-name}/runs" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer {API_TOKEN}" \
  -d '{"matchIds": [1277400, 1317630]}'
```

***

### WAF 绕过机制（自我进化）

三层次自适应：

```
Level 1: HTTP 直连
  └─ 移动端 UA + from=pc 参数
  └─ 如果 403/405 → Level 2
  
Level 2: Playwright 无头浏览器
  └─ 完整渲染 JS 页面
  └─ 内置 stealth 插件避免检测
  └─ 如果仍然失败 → Level 3

Level 3: BrowserAct 外部代理
  └─ 通过 browser-act CLI 的 stealth-extract
  └─ 需要购买 BrowserAct API Key
  └─ 配置 wafMode=browseract 开启
```

***

### 本地开发

```bash
## 安装依赖
npm install
npx crawlee install-playwright-browsers

## 本地运行
npm start

## 或用 apify 本地运行（需要 Docker）
npx apify run
```

***

### 架构

```
src/
├── main.js          # 入口：调度逻辑 + WAF 自适应
├── okooo-client.js  # HTTP/Playwright 客户端
├── okooo-parser.js  # HTML 解析器（Cheerio）
└── routes.js        # Crawlee 路由（Playwright 备用）
```

***

**License**: ISC | **Author**: BingoClaw1

# Actor input Schema

## `matchIds` (type: `array`):

OKooo MatchIDs to scrape. Leave empty to auto-fetch today's matches.

## `fetchOverUnder` (type: `boolean`):

Also scrape over/under (大小球) data from bookmakers. Requires Playwright (slower).

## `fetchHandicap` (type: `boolean`):

Scrape Asian Handicap (亚盘) odds comparison: company odds, opening/latest lines, avg index.

## `fetchOdds` (type: `boolean`):

Scrape European odds (欧赔) comparison: company odds (1X2), 99-average, jingcai official odds.

## `fetchMatchList` (type: `boolean`):

If matchIds is empty, scrape OKooo live page to get today's match IDs.

## `wafMode` (type: `string`):

Strategy for bypassing OKooo WAF: 'auto' (fast-HTTP, fallback to Playwright), 'playwright' (always use headless browser), 'browseract' (proxy via BrowserAct API)

## `browserActApiKey` (type: `string`):

Required only if wafMode = 'browseract'. API key for browser-act stealth extraction.

## `maxMatches` (type: `integer`):

Limit the number of matches scraped per run. 0 = unlimited.

## `proxyConfig` (type: `object`):

Apify proxy configuration (optional).

## Actor input object example

```json
{
  "matchIds": [],
  "fetchOverUnder": true,
  "fetchHandicap": true,
  "fetchOdds": true,
  "fetchMatchList": true,
  "wafMode": "auto",
  "maxMatches": 10,
  "proxyConfig": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "matchIds": [],
    "proxyConfig": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("gobeta_incentive/betfair-cn-sports-betting-data").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "matchIds": [],
    "proxyConfig": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("gobeta_incentive/betfair-cn-sports-betting-data").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "matchIds": [],
  "proxyConfig": {
    "useApifyProxy": true
  }
}' |
apify call gobeta_incentive/betfair-cn-sports-betting-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=gobeta_incentive/betfair-cn-sports-betting-data",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Betfair & CN Sports Betting Data",
        "description": "A specialized football investment tool that aggregates real-time trading data from Betfair—such as volume, distribution ratios—alongside Chinese sports lottery (Win/Draw/Loss). It also collects odds and handicap data, including spreads and Over/Under lines, from 39 global bookmakers",
        "version": "0.2",
        "x-build-id": "fdxiwlb2tgmfiWbqQ"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/gobeta_incentive~betfair-cn-sports-betting-data/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-gobeta_incentive-betfair-cn-sports-betting-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/gobeta_incentive~betfair-cn-sports-betting-data/runs": {
            "post": {
                "operationId": "runs-sync-gobeta_incentive-betfair-cn-sports-betting-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/gobeta_incentive~betfair-cn-sports-betting-data/run-sync": {
            "post": {
                "operationId": "run-sync-gobeta_incentive-betfair-cn-sports-betting-data",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "matchIds": {
                        "title": "Match IDs",
                        "type": "array",
                        "description": "OKooo MatchIDs to scrape. Leave empty to auto-fetch today's matches.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fetchOverUnder": {
                        "title": "Include Over/Under odds",
                        "type": "boolean",
                        "description": "Also scrape over/under (大小球) data from bookmakers. Requires Playwright (slower).",
                        "default": true
                    },
                    "fetchHandicap": {
                        "title": "Include Asian Handicap odds",
                        "type": "boolean",
                        "description": "Scrape Asian Handicap (亚盘) odds comparison: company odds, opening/latest lines, avg index.",
                        "default": true
                    },
                    "fetchOdds": {
                        "title": "Include European odds",
                        "type": "boolean",
                        "description": "Scrape European odds (欧赔) comparison: company odds (1X2), 99-average, jingcai official odds.",
                        "default": true
                    },
                    "fetchMatchList": {
                        "title": "Auto-fetch match list",
                        "type": "boolean",
                        "description": "If matchIds is empty, scrape OKooo live page to get today's match IDs.",
                        "default": true
                    },
                    "wafMode": {
                        "title": "WAF bypass mode",
                        "enum": [
                            "auto",
                            "playwright",
                            "browseract"
                        ],
                        "type": "string",
                        "description": "Strategy for bypassing OKooo WAF: 'auto' (fast-HTTP, fallback to Playwright), 'playwright' (always use headless browser), 'browseract' (proxy via BrowserAct API)",
                        "default": "auto"
                    },
                    "browserActApiKey": {
                        "title": "BrowserAct API Key (optional)",
                        "type": "string",
                        "description": "Required only if wafMode = 'browseract'. API key for browser-act stealth extraction."
                    },
                    "maxMatches": {
                        "title": "Max matches to scrape",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Limit the number of matches scraped per run. 0 = unlimited.",
                        "default": 10
                    },
                    "proxyConfig": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Apify proxy configuration (optional)."
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
