# Tencent Maps Scraper - China POI, Contacts & Reviews (`haketa/tencent-maps-scraper`) Actor

Scrape business places (POI) from Tencent Maps / QQ Maps (map.qq.com): name, address, phone, rating, review count, opening hours & coordinates across China. No API key, no account, no Chinese phone number. Search by keyword and city.

- **URL**: https://apify.com/haketa/tencent-maps-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.75 / 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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

<h1 align="center">Tencent Maps Scraper — China POI, Contacts & Reviews</h1>

<p align="center">
<img src="https://img.shields.io/badge/Tencent_Maps-%E8%85%BE%E8%AE%AF%E5%9C%B0%E5%9B%BE-07C160?style=for-the-badge" alt="Tencent Maps">
<img src="https://img.shields.io/badge/China_POI-Lead_Data-1f6feb?style=for-the-badge" alt="China POI">
<img src="https://img.shields.io/badge/No_API_Key-Required-2da44e?style=for-the-badge" alt="No API key">
<img src="https://img.shields.io/badge/Export-JSON_CSV_Excel-f97316?style=for-the-badge" alt="Export">
</p>

<p align="center"><strong>腾讯地图 / QQ Maps business places — names, phones, ratings, reviews, hours & coordinates across mainland China.</strong></p>

Scrape **business places (POI)** from **Tencent Maps** (`map.qq.com`) — one of China's major mapping platforms alongside Baidu Maps and Amap. Give it keywords and cities, get back a clean row per place: business name, address, **phone number**, star rating, review count, opening hours and map coordinates. No API key, no account, no Chinese phone number.

> 💡 **China market entry in one run.** Search `咖啡` in `北京`, `上海`, `广州` and wake up to thousands of real café leads with phones and ratings — ready for outreach, mapping or analysis.

### ⚡ At a glance

| | |
|---|---|
| 🗺️ **Source** | Tencent Maps / QQ Maps (腾讯地图) — public place listings |
| 🏢 **Records** | One row per business place: identity, contact, location, reputation |
| 🔍 **Search** | Keyword × city (Chinese recommended) with automatic pagination |
| 📇 **Contacts** | Phone numbers where businesses publish them |
| ⭐ **Reputation** | Star rating + review count per place |
| 📍 **Location** | Address, district, city + map coordinates |
| 🔑 **Access** | No API key · No account · No Chinese phone number |
| 📤 **Export** | JSON, CSV, Excel via the Storage tab or API |

### Why Tencent Maps data?

Tencent Maps (腾讯地图, also known as QQ Maps) is one of the three map apps nearly every urban Chinese consumer carries. Its place database covers restaurants, hotels, cafés, gyms, clinics, salons, factories, offices — millions of businesses across every mainland city. For anyone selling into China, researching Chinese markets or building location products, this is ground-truth local-business data you cannot get from Google Maps, which barely covers the mainland.

Official map APIs for China require a China-verified developer account — Chinese phone number plus real-name verification — putting them out of reach for most overseas teams. This actor takes the visitor's path instead: it runs the same searches a logged-out visitor runs on the public site and returns structured results. You get the data with zero signup friction.

### Why this actor?

- **Zero credentials.** No developer key, no login, no Chinese phone number. Paste keywords, press Start.
- **Contact-first records.** Phone numbers, addresses and business hours come on the same row as ratings — built for lead generation, not just dots on a map.
- **Keyword × city matrix.** Every keyword runs against every city automatically. Three keywords × five cities = fifteen searches in one run, deduplicated.
- **Automatic pagination.** Keeps turning result pages until your per-search cap is reached — no manual paging.
- **Fresh residential routing.** Searches run through residential IPs with automatic retry on a fresh session, so transient blocks don't kill your run.
- **Clean structured output.** One flat JSON row per place with stable field names — drops straight into Sheets, CRMs and databases.

### What you get per place

#### 🏢 Identity

| Field | Description | Coverage |
|---|---|---|
| `name` | Business name (Chinese) | 🟢 every record |
| `poiId` | Stable Tencent place id | 🟢 every record |
| `category` | Place category, e.g. `娱乐休闲:咖啡厅` | 🟢 ~100% |
| `keyword` | Your search keyword (for attribution) | 🟢 every record |
| `city` | Your search city (for attribution) | 🟢 every record |

#### 📇 Contact & reputation

| Field | Description | Coverage |
|---|---|---|
| `phone` | Contact phone number | 🟡 when published (~95% cafés, ~100% hotels/restaurants) |
| `rating` | Star rating (0–5) | 🟢 ~100% |
| `reviewCount` | Number of user reviews | 🟡 when published |
| `reviewSource` | Review provider (often 大众点评网) | 🟡 with reviewCount |
| `averagePrice` | Average spend per person (CNY) | 🟡 food & drink mostly |
| `openTime` | Opening hours, e.g. `09:00-21:00` | 🟢 ~97% |
| `businessStatus` | Trading status, e.g. `正常商户` | 🟢 ~97% |

#### 📍 Location

| Field | Description | Coverage |
|---|---|---|
| `address` | Full street address (Chinese) | 🟢 ~100% |
| `district` | District / county name | 🟢 ~95% |
| `latitude` / `longitude` | Map coordinates (**GCJ-02**, see FAQ) | 🟢 ~100% |
| `coordSystem` | Always `GCJ-02` when coordinates exist | 🟢 with coords |
| `detailUrl` | Public Tencent Maps place URL | 🟢 every record |
| `scrapedAt` | When the record was collected (ISO) | 🟢 every record |

> 💡 **Coverage is measured from live test runs** (20/20 phones-and-ratings check, October 2026), not estimated. Phone coverage genuinely varies by category — hotels and restaurants almost always publish one, small snack stalls often don't.

### Output example

One dataset row per place (trimmed from a live `咖啡` × `北京` run):

```json
{
  "name": "VOYAGE COFFEE(南锣鼓巷店)",
  "poiId": "17215659268360268776",
  "category": "娱乐休闲:咖啡厅",
  "city": "北京",
  "keyword": "咖啡",
  "address": "北京市东城区地安门东大街97号(南锣鼓巷地铁站A西北口步行190米)",
  "district": "东城区",
  "phone": "13120260798",
  "rating": 4.4,
  "reviewCount": 3,
  "reviewSource": "大众点评网",
  "averagePrice": 52,
  "openTime": "10:00-18:00",
  "businessStatus": "正常商户",
  "latitude": 39.933719,
  "longitude": 116.400201,
  "coordSystem": "GCJ-02",
  "detailUrl": "https://map.qq.com/poi/?sm=17215659268360268776",
  "scrapedAt": "2026-10-19T20:31:17.267Z"
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `searchTerms` | string list | `["咖啡"]` | Keywords to search — names or categories, **Chinese recommended**. Each runs against every city. |
| `cities` | string list | `["北京"]` | Cities to search in — **Chinese names** (`北京`, `上海`, `广州`, `深圳`…). |
| `maxItemsPerSearch` | integer | `100` | Max places per city × keyword search (1–400). |
| `maxItems` | integer | `0` | Max places across the whole run. `0` = no cap. |
| `maxConcurrency` | integer | `2` | Parallel searches (1–6). Each uses a browser — keep modest. |
| `proxyConfiguration` | proxy | Residential | Preconfigured. Tencent Maps blocks datacenter IPs. |

#### Basic: cafés in Beijing

```json
{
  "searchTerms": ["咖啡"],
  "cities": ["北京"],
  "maxItemsPerSearch": 60
}
```

#### Multi-keyword, multi-city lead pull

```json
{
  "searchTerms": ["咖啡", "酒店", "火锅"],
  "cities": ["北京", "上海", "广州"],
  "maxItemsPerSearch": 100,
  "maxItems": 500
}
```

Nine searches, one run, deduplicated output.

<details>
<summary><strong>Advanced: high-volume category sweep with capped concurrency</strong></summary>

```json
{
  "searchTerms": ["餐厅", "健身房", "美容院", "诊所", "酒店"],
  "cities": ["北京", "上海", "深圳", "成都", "杭州"],
  "maxItemsPerSearch": 200,
  "maxItems": 3000,
  "maxConcurrency": 3
}
```

Twenty-five searches at three parallel browsers. Expect a long run — schedule it and collect results from the dataset when finished.

</details>

<details>
<summary><strong>Advanced: quick phone-coverage probe before a big pull</strong></summary>

```json
{
  "searchTerms": ["火锅"],
  "cities": ["成都"],
  "maxItemsPerSearch": 20
}
```

Twenty rows in about a minute. Check the `phone` fill rate for your category, then scale up with confidence.

</details>

### How it works

1. **You enter keywords and cities** — e.g. `火锅` × `成都`, `重庆`, `北京`.
2. **The actor searches Tencent Maps** for each pair, turning result pages until your cap, retrying on a fresh session if a search stalls.
3. **You download structured rows** — JSON, CSV or Excel — one place per row with contact, location and reputation fields.

### Use cases

#### 📇 China lead generation

The core use case. Pull every hotel in Shanghai, every gym in Shenzhen, every dental clinic in Beijing — with phone numbers — and feed them to your sales team or dialer. Filter by `rating` and `reviewCount` to prioritize established businesses, use `district` to carve up territories.

| If you sell… | Search this | In these cities |
|---|---|---|
| ☕ Coffee equipment | `咖啡`, `奶茶`, `面包店` | `北京`, `上海`, `广州`, `深圳` |
| 🏨 Hotel supplies | `酒店`, `民宿`, `青旅` | `上海`, `三亚`, `成都`, `西安` |
| 🍲 Food distribution | `火锅`, `烧烤`, `日料` | `成都`, `重庆`, `北京` |
| 💪 Fitness gear | `健身房`, `瑜伽馆`, `游泳馆` | `深圳`, `上海`, `杭州` |
| 💄 Beauty wholesale | `美容院`, `美发店`, `美甲店` | `广州`, `上海`, `北京` |
| 🏥 Medical devices | `诊所`, `牙科`, `体检中心` | `北京`, `上海`, `广州` |

#### 📊 Market & competitor mapping

Count every bubble-tea shop per district to size a market. Track openings and closures month over month by re-running the same searches. Benchmark competitor footprints: where they cluster, how their ratings compare, what price bands they play in (`averagePrice`).

#### 🗺️ Expansion & site selection

Retail and F\&B chains use POI density + ratings to shortlist neighborhoods. Pull all `商场` (malls) and complementary categories around candidate sites, then score each area on footfall proxies (review counts) and competition density.

#### 🚚 Logistics & delivery planning

Last-mile operators enrich stop lists with verified addresses, districts and coordinates. The `district` + `address` pair geocodes cleanly against Chinese logistics systems.

#### 🎓 Research & data journalism

Urbanists study amenity distribution; journalists quantify chain vs independent mix per city. Stable `poiId` values make longitudinal tracking easy — re-run quarterly and diff.

#### 🧩 CRM & app enrichment

Already have a China company list? Match names against Tencent POI rows to append phones, hours, ratings and coordinates. `detailUrl` gives analysts a one-click verification link.

### Step-by-step usage

#### In the Console (no code)

1. Open the actor and click **Try for free** — the example searches `咖啡` in `北京`.
2. Replace the example with your keywords and cities (Chinese works best).
3. Set **Max places per search** — `20` for a quick test, `100+` for coverage.
4. Click **Start**, then open the **Storage** tab when it finishes.
5. Download **JSON** (full fidelity), **CSV** or **Excel**, or copy the dataset URL.

#### Via API

```bash
curl -X POST "https://api.apify.com/v2/acts/haketa~tencent-maps-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"searchTerms": ["咖啡", "酒店"], "cities": ["北京", "上海"], "maxItemsPerSearch": 100}'
```

Fetch items from the run's default dataset when it succeeds. See the API tab on the actor page for client libraries (JavaScript, Python) and ready-made snippets.

#### Scheduling

Place data goes stale — businesses open, close and change phones. Most users schedule a weekly or monthly re-run per city and diff on `poiId` to catch openings, closures and rating movement. Use Apify **Tasks** (one task per city is a clean pattern) plus **Schedules**, and push results to Google Sheets, your CRM or a webhook from the run's **Integrations** tab — no glue code needed.

### 💡 Tips for best results

- **Write keywords in Chinese.** Tencent Maps indexes Chinese names and categories. `火锅` dramatically outperforms `hotpot`; `酒店` beats `hotel`. Machine-translate your category list once and reuse it.
- **Use Chinese city names.** `北京`, `上海`, `广州`, `深圳`, `成都`, `杭州`, `武汉`, `西安` — pinyin sometimes works, characters always work.
- **Probe before you scale.** Run `maxItemsPerSearch: 20` on a new category first. Check `phone` fill and result counts, then raise the cap.
- **Split mega-pulls by city.** One task per city parallelizes better, isolates failures and makes scheduling obvious.
- **Mind the caps.** `maxItemsPerSearch` is per search; `maxItems` caps the whole run. Set both deliberately on large matrices.
- **Ratings are your quality filter.** `rating >= 4.5` with `reviewCount >= 50` selects proven businesses; low-review rows are often brand-new openings (great for first-mover outreach).
- **Coordinates are GCJ-02.** They plot perfectly on Chinese maps (Tencent/Amap/Baidu). For Google Maps or GIS tools, convert GCJ-02 → WGS84 first (see FAQ).

### Honest limitations

- **Phones depend on the business.** Hotels and restaurants publish phones ~100% of the time; small stalls and street vendors often don't. The actor returns `null` rather than guessing.
- **Browser-based = heavier.** Real map searches need a real browser plus residential routing, so runs cost more compute than pure-HTTP scrapers. Keep `maxConcurrency` modest (2–3).
- **Coverage follows Tencent.** If Tencent Maps lists few places for a niche keyword in a small city, results will be thin. Broaden the keyword or add nearby cities.
- **Front-ends change.** Map sites redesign periodically. The actor retries automatically against transient issues, but a major redesign may need an actor update — check the Changelog below for maintenance history.
- **Chinese-language output.** Names, addresses and categories come in Chinese as Tencent publishes them. Translate downstream if you need English.

### FAQ

**Do I need a Tencent account or API key?**
No. No key, no account, no Chinese phone number. The actor only reads public search listings.

**Which cities are covered?**
Every mainland city Tencent Maps covers — all tier-1 through tier-4 cities. Search by Chinese city name.

**Why do you recommend Chinese keywords?**
Because Tencent's index is Chinese-first. English queries often return a fraction of the matches, or none. Translate category terms once (`coffee` → `咖啡`) and reuse them forever.

**What coordinate system are the points in?**
GCJ-02 (Mars Coordinates), China's standard offset system — correct on Tencent, Amap and Baidu maps. For Google Maps, PostGIS or Leaflet with OSM tiles, convert to WGS84 with any open `gcj02-to-wgs84` library (one function call, meter-level accuracy).

**How many places can I get per search?**
Up to your `maxItemsPerSearch` cap (max 400), bounded by what Tencent returns for that query. Popular category × big-city searches yield the most; niche queries yield fewer.

**How long does a run take?**
Roughly a minute per search including pagination and retries, divided by concurrency. The 20-place example finishes in about a minute; a 9-search matrix at concurrency 3 takes a few minutes.

**Why do some rows lack phone numbers?**
Because the business didn't publish one on Tencent Maps. Coverage is category-dependent (see the coverage column above) — the actor never fabricates contact data.

**Is `poiId` stable? Can I track places over time?**
Yes — `poiId` is Tencent's stable place identifier. Re-run the same searches periodically and join on `poiId` to detect new, removed or changed places.

**Can I get reviews text, photos or menus?**
The actor returns review *counts*, ratings and review source per place — not full review text or photo galleries. Counts plus ratings cover ranking, filtering and monitoring use cases.

**Does it deduplicate across searches?**
Yes. Overlapping keywords (e.g. `咖啡` and `咖啡厅`) often return the same shops; the actor dedupes on `poiId` so each place appears once per run.

**What happens if one search gets blocked?**
The actor retries that search on a fresh residential session (up to 4 attempts), then continues with the remaining searches. One stubborn query never kills the whole run.

**Can I run this on a schedule?**
Yes — that is the recommended pattern for monitoring. Create a Task with your input, attach a Schedule (weekly/monthly), and connect the Integrations tab to Sheets, Slack, webhooks or your CRM.

**How fresh is the data?**
Every run fetches live listings at run time. Nothing is cached between runs.

**Why residential proxy and not datacenter?**
Tencent Maps serves captchas and empty results to datacenter IPs. Residential routing is preconfigured and required for reliable results.

### Changelog

#### 1.0 — Initial release (October 2026)

- Keyword × city search matrix against Tencent Maps place listings.
- Per-place contact (phone), reputation (rating, review count + source), hours, prices and GCJ-02 coordinates.
- Automatic result pagination plus fresh-session retry per search.
- Residential proxy preconfigured; datacenter IPs blocked by the source.
- JSON/CSV/Excel export via dataset; stable `poiId` for longitudinal tracking.

***

*Every business place in mainland China — with its contacts, ratings and coordinates.*

# Actor input Schema

## `searchTerms` (type: `array`):

What to search for on Tencent Maps — business names or categories, ideally in Chinese for best coverage (e.g. 咖啡 = coffee, 酒店 = hotel, 餐厅 = restaurant, 健身房 = gym). Each keyword is searched in every city below.

## `cities` (type: `array`):

Chinese cities to search in, in Chinese (e.g. 北京 = Beijing, 上海 = Shanghai, 广州 = Guangzhou, 深圳 = Shenzhen). Every keyword is run against every city.

## `maxItemsPerSearch` (type: `integer`):

Maximum places to collect for each city × keyword search (Tencent paginates results).

## `maxItems` (type: `integer`):

Maximum number of places to save across all searches. 0 = no limit.

## `maxConcurrency` (type: `integer`):

How many searches to run in parallel. Each uses a headless browser, so keep this modest.

## `proxyConfiguration` (type: `object`):

Residential routing is preconfigured because Tencent Maps blocks datacenter IPs (captcha / empty results).

## Actor input object example

```json
{
  "searchTerms": [
    "咖啡",
    "酒店",
    "餐厅"
  ],
  "cities": [
    "北京",
    "上海",
    "广州"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 0,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `places` (type: `string`):

Business places scraped from Tencent Maps — name, address, phone, rating, reviews and coordinates.

# 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 = {
    "searchTerms": [
        "咖啡"
    ],
    "cities": [
        "北京"
    ],
    "maxItemsPerSearch": 20,
    "maxItems": 0,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/tencent-maps-scraper").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 = {
    "searchTerms": ["咖啡"],
    "cities": ["北京"],
    "maxItemsPerSearch": 20,
    "maxItems": 0,
    "maxConcurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/tencent-maps-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "咖啡"
  ],
  "cities": [
    "北京"
  ],
  "maxItemsPerSearch": 20,
  "maxItems": 0,
  "maxConcurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call haketa/tencent-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/tencent-maps-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HCX6MpOnjlD5SgpJW/builds/e7UWPdQkowBAONI7f/openapi.json
