# WeChat Official Account Scraper (`insights_data/wechat-official-account-scraper`) Actor

Search public WeChat Official Account (公众号) articles by keyword. Get titles, summaries, accounts, publish times, full text, Markdown and images, plus account profiles, album lists and related searches as clean JSON. Monitor new articles. No WeChat login needed.

- **URL**: https://apify.com/insights_data/wechat-official-account-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

### WeChat Official Account Scraper: what is it?

**WeChat Official Account Scraper** lets marketers, researchers and developers extract public WeChat Official Account (公众号) articles by keyword, article link, account or album, with titles, summaries, account names, publish times, article links and, if you want them, the full text and Markdown. Just paste keywords or links into one list and click **Start**: no coding, and no WeChat login, cookies or app. On the Apify Free plan you can save up to **10 results per run**.

> ⚠️ **Not included:** per-article read counts, likes, shares, comments and WeChat Index (微信指数). WeChat shows these only to a signed-in app. If you pick one of those steps, you get **one free row** with status `unavailable` that explains why, never estimated numbers.

People often call this kind of tool a WeChat scraper or a Weixin scraper. This one reads only the public side of WeChat MP: every WeChat public article it returns comes from a page any visitor can open. Each row is saved the moment it is ready, so the Output tab fills while the run is going.

- **Track brand mentions:** search a brand or product name and see which accounts write about it, with dates and links.
- **Watch competitors:** list a competitor's account articles on a schedule and get only the new ones.
- **Build a Chinese text corpus:** collect 微信公众号文章 as plain text or Markdown for research, LLM or RAG pipelines.
- **Find the voices on a topic:** rank the accounts that publish most on a keyword.
- **Clean up links:** turn short or temporary WeChat links into permanent article references with stable IDs.
- **Automate research:** schedule runs, call them through the API, and send results to Google Sheets, Make, Zapier or your own app.

#### What can WeChat Official Account Scraper do?

- 🔍 **WeChat article search** by keyword, sorted by relevance, newest or oldest, with a date window and exclusion words
- 📝 **Full article records**: text, Markdown, optional HTML, images, links, author, album, word count and reading time
- 👤 **WeChat Official Account profile**: name, WeChat ID, signature, avatar, account type, original-article count, collections and a recent-activity sample
- 📅 **Account and album article lists**, newest or oldest first, with a "continue where the last run stopped" option for large albums
- 🔗 **Link conversion** from short or temporary links to permanent links
- ⭐ **Account search**: accounts ranked by how many matching articles they published
- 🌐 **Monitoring**: only new results since the last run
- 📦 Export to JSON, CSV, Excel, XML or HTML, or use it through the Apify API, schedules, webhooks and integrations

In one run it acts as a WeChat article scraper (search finds the articles) and a WeChat article extractor (it opens each one and returns the complete record).

***

### WeChat Official Account Scraper data: what can it extract?

The Actor returns WeChat Official Account data and WeChat article data in one dataset. The main groups are:

- 📝 **Search results:** title, summary, account name, publish time, cover image, article link and a stable article ID
- 📝 **Full articles:** text, Markdown, optional HTML, images, links inside the article, author, album, tags, hashtags, original flag, word count and reading time
- 👤 **Account profiles:** name, WeChat ID, `gh_` id, signature, avatar, account type, original-article count, public collections, recent activity, profile and QR code links
- 📅 **Account and album lists:** each article with its source, album title and position in the album
- ⭐ **Account search:** accounts ranked by matching articles, with sample titles
- 🔗 **Converted links** and 💡 **search suggestions**

The exact field names, and when each one is filled, are in the Output section below.

#### What data can't WeChat Official Account Scraper extract?

- ❌ **Per-article read counts, likes and shares.** WeChat only shows these inside the signed-in app.
- ❌ **Comments and comment replies.**
- ❌ **WeChat Index (微信指数), mini program search and account owner details.**
- ❌ **A complete account timeline.** Account history comes from search results and public collections only.

The only read figure the Actor returns is `albumReadCount`, the total reads of a whole collection. It appears on rows of the Album (collection) articles step when WeChat shows it. It is dropped when **📜 Full article records** is on, so run the album once with that switch off if you need the total.

***

### How to scrape WeChat articles

WeChat Official Account Scraper is built for an easy start, even if you have never extracted data from the web before.

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [WeChat Official Account Scraper](https://apify.com/insights_data/wechat-official-account-scraper).
3. Add keywords, article links, album links or accounts to **🧲 Keywords, accounts and WeChat links (bulk)**, one per line.
4. Click **Start** and watch the log: one line per saved result.
5. Download your data in JSON, CSV, Excel, XML or HTML.

> ⚠️ **First run on the Free plan:** the form opens pre-filled with one keyword (人工智能) and one article link, and **🔢 Max results per entry** is 10. The Free plan stops the whole run at **10 results**, so the keyword alone can fill the cap and the article link then does not run. Set **🔢 Max results per entry** to **5** to see both, or use one entry per run. Search rows stay short (no full text) unless you turn on **📜 Full article records**.

To extract WeChat articles in bulk, put many entries in the list. Each keyword is a separate search with its own result budget.

***

### WeChat Official Account Scraper pricing: how much does it cost to scrape WeChat?

The Actor uses **pay-per-event** pricing. Your bill has three parts:

| Part | Price | When |
|---|---|---|
| 💲 Actor start | $0.00005 per GB of memory, so **$0.00005 per run** at the default 1 GB | Once per run |
| 💲 Result | **$0.00499 per result = $4.99 per 1,000 results** on the Free plan (lower on paid plans, see below) | Each saved result row |
| 💲 Platform usage | Paid by you, on top of the event prices | Compute and any proxy traffic the run uses |

| Apify plan | Price per result | Price per 1,000 results |
|---|---|---|
| Free | $0.00499 | $4.99 |
| Starter | $0.0045 | $4.50 |
| Scale | $0.004 | $4.00 |
| Business and higher | $0.0035 | $3.50 |

Paid Apify plans get a lower result price. The plan discount applies to that price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

Rounded examples for result charges only, at Free plan prices (add the start fee and platform usage):

| Results | Result charges (Free plan) |
|---|---|
| 10 | about $0.05 |
| 100 | about $0.50 |
| 1,000 | $4.99 |

See the [pricing tab](https://apify.com/insights_data/wechat-official-account-scraper/pricing) for the current events.

**What is charged and what is not:**

- 💲 **Every saved row costs the same, whatever its type or size:** search rows, full article records, account profiles, account search rows, account and album article rows, converted links and suggestion rows (one row per keyword, however many suggestions it holds).
- 💲 **Each result is charged once.** The copy of the row in its own table (see Output) is not charged again.
- ✅ Rows that only report a problem (a deleted article, an invalid link, an account that was not found, a login-only step) go to the Issues table. They are **free** and do not count toward the Free plan cap.
- ✅ The run summary record is not a result and is not charged as one.
- ⚠️ A search row whose article link could not be opened is still saved with its search data (title, summary, account, time) and is **charged** like any other result. Its `linkStatus` explains what happened.
- If a run saves no results, you pay only the start fee and the platform usage.

**How to estimate platform usage:** there is no fixed figure, because usage depends on your settings (for example, **📜 Full article records** opens every article page) and on whether a proxy is used. Run a small test with the settings you plan to use, open the run in the Console and check its usage cost. Then scale that by the number of results you need.

**Cap your spend:** set a **maximum charge limit** when you start a run. When the limit is reached, the run stops cleanly and keeps everything saved so far.

#### Is scraping WeChat free?

You can start for free. The [Apify Free plan](https://apify.com/pricing) includes $5 of usage per month, which pays for result charges and platform usage together. On the Free plan this Actor saves **up to 10 results per run**. To get more results per run, use any paid Apify plan.

***

### ⬇️ Input

You only need one field: **🧲 Keywords, accounts and WeChat links (bulk)** (`urls`). Everything else has a working default. Set the input in the Console form, or send it as JSON through the API.

Here's an example that searches one keyword and reads one article, and fits the Free plan cap (up to 5 search rows + 1 article = up to 6 results):

```json
{
  "urls": [
    "人工智能",
    "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  ],
  "maxItemsPerEntry": 5
}
```

See the [input tab](https://apify.com/insights_data/wechat-official-account-scraper/input-schema) for every field.

#### Settings most people change

| Form title | JSON name | Default | What it does |
|---|---|---|---|
| 🧲 Keywords, accounts and WeChat links (bulk) | `urls` | required | One entry per line: keywords, article links, short links, album links, `gh_` ids or account names. In Auto mode only `gh_` ids and `@names` count as accounts; with an account step selected, write names without `@` |
| 🪄 What to scrape | `operation` | `auto` | Auto picks the step for each entry. Or pick one step for every entry (table below) |
| 🔢 Max results per entry | `maxItemsPerEntry` | `10` | Results kept per keyword, account or album. `0` = no limit |
| 📚 Pages per entry | `maxPages` | `3` | Search result pages read per keyword or account (1–50). A page holds about 10 results |
| 📜 Full article records | `fetchFullArticles` | `false` | Replace search and account rows with the full article record (text, images, links, author, album) |
| ⏱️ Published within | `publishTime` | `all` | Last 24 hours, 7 days, 30 days, 6 months or 1 year |
| 🗓️ Published after / ⏳ Published before | `publishedAfter` / `publishedBefore` | empty | Dates in `YYYY-MM-DD`, Beijing time. "Before" includes the whole day. If you also set Published within, the later of the two start dates applies |
| 🆕 Only new since last run | `onlyNewSinceLastRun` | `false` | Return only results that earlier runs of the same keyword, account or album did not deliver |

#### What to scrape: the steps

| Step (`operation`) | Input | Returns |
|---|---|---|
| Auto (`auto`) | Anything in the list | Keywords → article search; article links → article detail; album links → album articles; `gh_` ids and `@names` → account articles |
| Article search (`articleSearch`) | Keywords | Search rows: title, summary, account, time, cover, link, article ID |
| Account search (`accountSearch`) | Keywords | Accounts ranked by matching articles, with up to 3 sample titles |
| Search suggestions (`searchSuggestions`) | Keywords | Related searches |
| Article detail (`articleDetail`) | Article links | Full article records |
| Convert article link (`convertArticleLink`) | Article links only | Permanent link, short link and article ID |
| Account profile (`accountInfo`, also `accountBasicInfo`, `accountOriginalCount`) | Accounts | Account profile rows |
| Account articles (`accountArticles`, also `accountHistoryArticles`) | Accounts | The account's articles from search results and public collections |
| Account today's articles (`accountTodayArticles`) | Accounts | Account articles published today (Beijing time), unless you set Published after |
| Album (collection) articles (`albumArticles`) | Album links | Articles of the collection with album position |
| Article metrics (`articleMetrics`) | — | **Not available:** returns one free `unavailable` row |
| Article comments (`articleComments`) | — | **Not available:** returns one free `unavailable` row |
| Comment replies (`articleCommentReplies`) | — | **Not available:** returns one free `unavailable` row |
| WeChat Index (`wechatIndexSearch`) | — | **Not available:** returns one free `unavailable` row |
| Mini program search (`miniProgramSearch`) | — | **Not available:** returns one free `unavailable` row |
| Account owner info (`accountPrincipalInfo`) | — | **Not available:** returns one free `unavailable` row |

**Converting links in the form:** set **🪄 What to scrape** to **Convert article link** and put only article links in the list (a keyword in that list becomes an `invalid` issue row). In Auto mode, links in the list are read as full articles; through the API you can also send links to convert in the `links` field.

#### Keywords, accounts and WeChat links (bulk)

Accounts are looked up through search, so give the most exact identifier you have. In the default Auto mode, only `gh_` ids and `@names` are treated as accounts: a bare WeChat ID becomes a keyword search, and an article link becomes an article detail. A bare WeChat ID or an article link of the account identifies the account only when you select an account step (Account profile, Account articles or Account today's articles). The `@` is removed only in Auto mode, so with an account step selected, write the entry without `@`.

- ✅ Good in Auto mode: `@rmrbwx` (@ + the WeChat ID), `gh_2f709f458319` (the account's `gh_` id) or `@青春浙江`
- ✅ Good with an account step selected: `rmrbwx` (the bare WeChat ID, no `@`), `gh_2f709f458319` or an article link of the account
- ❌ Bad: a bare account key such as `MzA4MjIxNzAxOQ==` (it returns an `unsupported` issue row)

> ⚠️ For well-known account names, articles **about** the account can rank above its own posts. If an account is not found: in Auto mode use `@rmrbwx` (@ + the WeChat ID) or the `gh_` id; with an account step selected, use the bare WeChat ID `rmrbwx` (no `@`), the `gh_` id or an article link of the account.

One list can hold many entries, so the Actor also works as a WeChat MP batch scraper, with its own result budget for each entry. For a WeChat article batch download of full texts, paste the article links and keep the default Auto step.

#### Advanced settings

| Form title | JSON name | Default | Notes |
|---|---|---|---|
| ↕️ Sort results | `sortBy` | `relevance` | `relevance`, `latest` or `oldest`. Account articles are listed newest first unless you choose `oldest`. Albums use Album order |
| ✨ Expand with suggestions | `expandWithSuggestions` | `0` | Also search the top N related suggestions of each keyword (0–10) |
| 🙋 Only from these accounts | `onlyFromAccounts` | empty | Exact account display names. **Use it only with keyword search**: with account or album steps it removes every row |
| 🛑 Drop results containing | `excludeKeywords` | empty | Drops results whose title or summary contains any of these words |
| 🔗 Open article links | `resolveArticleLinks` | `true` | Opens each search result to add `url`, `articleId` and `accountId`. Off = faster, search data only (`linkStatus: notResolved`) |
| ✍️ Plain text / 🧾 Markdown / 🧩 HTML | `includeContentText` / `includeContentMarkdown` / `includeContentHtml` | `true` / `true` / `false` | What a full article record contains |
| 🖼️ Images / 🔖 Links in the article | `includeImages` / `includeLinks` | `true` / `true` | Image list with sizes, and links found in the article |
| 🗂️ Where account articles come from | `accountArticleSources` | both | `search` results and/or `albums` (public collections) |
| ⇅ Album order | `albumOrder` | `newest` | Walk an album from its newest or oldest article |
| 🔭 Extra articles opened per account | `albumDiscoveryArticles` | `3` | More articles opened to find more collections (0–20) |
| ⏯️ Continue where the last run stopped | `continuePreviousRun` | `false` | For large albums. Turn it on from the first run |
| ⚡ Parallel requests | `maxConcurrency` | `4` | Articles opened at the same time (1–10) |
| 🐢 Delay between searches | `requestDelaySeconds` | `2.5` | Minimum seconds between search requests (0.5–30) |
| 🔂 Retries per request | `maxRetries` | `3` | Retries for a failed request (1–6) |
| 🌐 Proxy configuration | `proxyConfiguration` | no proxy | See the note below |

**Proxy:** the run starts without a proxy. If the site blocks requests, it switches to Apify Proxy on its own. A proxy you set is used first. Which Apify Proxy options you have depends on your Apify plan (see the [pricing page](https://apify.com/pricing)). If Apify Proxy is not available on your account, the run continues without a proxy, and entries the site refuses end up with a `linkStatus` or in the Issues table. Proxy traffic counts as platform usage.

Through the API you can also send the lists `keywords`, `articleUrls`, `accounts`, `links` and `albumUrls`. They are merged with `urls`, which must still contain at least one entry.

***

### ⬆️ Output

Open the **Output** tab of the run to browse the results as a table or JSON. To download, use the Output tab's export button, or go to **Storage → Datasets**, open the dataset and click **Export** (JSON, CSV, Excel, XML or HTML). You can pick only the fields you need.

**Where everything is:**

- **Default dataset:** every row of the run, with views for search results, article details, account and album articles, account profiles, account search, converted links, suggestions and issues.
- **Separate tables:** a second copy of each row also goes to its own table: **articles**, **accounts**, **links**, **suggestions** or **issues**. These copies make filtering easier. They are not charged again. They appear as their own tabs in the Output tab.
- **Run summary:** a record with counts, filters and warnings. You find it in the Output tab, or under **Storage → Key-value store** as `RUN_SUMMARY`.

#### JSON example

A real article search row for the keyword in the input example above, shortened (long values cut with "…", some fields left out):

```json
{
  "operation": "articleSearch",
  "input": "人工智能",
  "seedKeyword": "人工智能",
  "rank": 1,
  "title": "青年都愿来这里闯?答案都在“AI”(爱)里",
  "summary": "今年年初,杭州市政府工作报告明确提出“全力建设人工智能创新发展第一城”的目标……",
  "accountName": "青春浙江",
  "publishTime": "2026-10-11T17:50:23+08:00",
  "publishTimestamp": 1791712223,
  "url": null,
  "temporaryUrl": "https://mp.weixin.qq.com/s?src=11&timestamp=…",
  "linkStatus": "ok",
  "articleId": "MzA4MjIxNzAxOQ==_2652567069_1",
  "accountId": "gh_2f709f458319",
  "biz": "MzA4MjIxNzAxOQ==",
  "scrapedAt": "2026-10-11T10:59:00+00:00"
}
```

**Why `linkStatus` is `ok` while `url` is `null`:** `ok` means the article itself was opened, so `articleId`, `accountId` and `biz` are filled. WeChat only gave a temporary link for this article, and the permanent link was not available. So `url` stays empty, `temporaryUrl` holds a link that expires, and `articleId` is the stable key to use.

#### Fields per row type and when they are filled

| Row type | Fields | Filled when |
|---|---|---|
| 📝 Search results | `operation`, `input`, `seedKeyword`, `rank`, `title`, `titleHighlighted`, `summary`, `accountName`, `publishTime`, `publishTimestamp`, `coverUrl`, `url`, `temporaryUrl`, `urlNote`, `linkStatus`, `statusMessage`, `articleId`, `accountId`, `biz` (the account's base64 key), `scrapedAt` | Article search step. `url`, `articleId`, `accountId` and `biz` need **🔗 Open article links** on |
| 📝 Article details | `articleId`, `url`, `shortUrl`, `title`, `digest`, `author`, `accountName`, `accountAlias`, `accountId`, `biz`, `publishTime`, `contentType`, `isOriginal`, `coverUrl`, `ipRegion`, `album`, `tags`, `hashtags`, `wordCount`, `readingTimeMinutes`, `imageCount`, `videoCount`, `images`, `videos`, `links`, `mentionedAccounts`, `contentText`, `contentMarkdown`, `contentHtml`, `isPaid` | Article detail step, or **📜 Full article records** on. The content fields follow the Plain text / Markdown / HTML / Images / Links switches. `ipRegion` only when WeChat shows it |
| 👤 Account profiles | `accountName`, `accountAlias`, `accountId`, `biz`, `signature`, `avatarUrl`, `accountType`, `verifyStatus`, `originalArticleCount`, `albums`, `albumCount`, `lastPublishTime`, `articlesLast30Days`, `avgDaysBetweenPosts`, `profileUrl`, `qrCodeUrl` | Account profile step. Activity fields come from a sample of recent articles: `articlesLast30Days` is a lower bound and `avgDaysBetweenPosts` an upper bound |
| ⭐ Account search | `rank`, `accountName`, `matchingArticles`, `latestMatchTime`, `sampleTitles` | Account search step |
| 📅 Account and album articles | `source`, `title`, `accountName`, `publishTime`, `url`, `articleId`, `coverUrl`, `contentType`, `albumTitle`, `albumPosition`, `isPaid` | Account articles and album steps. Album-step rows also carry `albumArticleCount` and `albumReadCount` (when WeChat shows it, and only while **📜 Full article records** is off) |
| 🔗 Converted links | `inputType` (short, long or temporary link), `url`, `shortUrl`, `temporaryUrl`, `title`, `accountName`, `articleId`, `publishTime` | Convert article link step |
| 💡 Suggestions | `input`, `suggestionCount`, `suggestions` | Search suggestions step |
| 📭 Issues | `operation`, `input`, `status`, `statusMessage` | An entry could not be read, or a login-only step was chosen. Statuses include `deleted`, `invalid`, `notFound` and `unavailable` |

With **📜 Full article records** on, the Actor works as a WeChat article exporter: each row holds the whole article, ready for a spreadsheet or a database. For a WeChat article to Markdown workflow, keep **🧾 Markdown** on and use `contentMarkdown`.

***

### Tips and advanced usage

#### How many results can you scrape with WeChat Official Account Scraper?

Search shows about **100 recent results per query** (about 10 per page). To go further, turn on **✨ Expand with suggestions** (each keyword also searches up to 10 related suggestions) or split a topic into several keywords. Date filters and exclusion words are applied after results are collected, and with any date filter, rows without a publish time are dropped. On paid plans `maxItemsPerEntry` goes up to 100,000, and `0` removes the per-entry limit. The best way to know what you will get for your topic is a quick test run.

#### Monitor accounts and keywords

For WeChat monitoring, schedule the Actor (daily or hourly) with **🆕 Only new since last run** on. Each run then delivers only the articles that earlier runs of the same keyword, account or album did not. Use it for WeChat brand monitoring (search your brand name) and WeChat competitor monitoring (list competitor accounts). Add a webhook to get an alert when new rows arrive.

On the Free plan, the 10-result cap also applies to monitoring runs. For keyword search entries, articles cut off by the cap can be delivered by a later run, as long as they still appear in the search results. For account, album and account-search entries, rows beyond the cap may not be delivered by later runs, so keep those runs within the cap or use a paid plan.

#### Archive a whole collection

Albums (collections) can be long. To build a WeChat article archive of a long album in parts, turn on **⏯️ Continue where the last run stopped** from the first run and set **🔢 Max results per entry**. Each run starts after the part of the album the previous run read, and after the end of the album it starts again from the top. A run can skip a few articles between the last one it delivered and the point where the next run starts, so check `albumPosition` for gaps. On a paid plan, Max results per entry `0` reads the album in one run without a per-entry limit, though very large albums can still stop before the end.

#### How to get faster or cheaper results

- Turn **🔗 Open article links** off if you only need titles, summaries and dates. Rows are then saved without `url` and `articleId`.
- Keep **📜 Full article records** off unless you need the text. It opens every article.
- Set **🔢 Max results per entry** to what you really need. Every saved result is charged.
- If the site keeps refusing requests, lower **⚡ Parallel requests** or raise **🐢 Delay between searches**.

#### Known issues

- Some search results only have a temporary link: `url` stays empty, `temporaryUrl` expires, and `articleId` is the stable key.
- **🙋 Only from these accounts** removes every row of account and album steps. Use it with keyword search only.
- Well-known account names can match articles about the account. In Auto mode use `@` + the WeChat ID or the `gh_` id; with an account step selected, use the bare WeChat ID (no `@`), the `gh_` id or an article link.
- Very long keywords are cut to the length the search box allows.
- With **⏯️ Continue where the last run stopped** and a result limit, a few album articles can be skipped between runs (check `albumPosition`).
- If WeChat refuses pages for a while, the log shows retry lines such as "retrying request (1/3)". If the log says "Search is not available right now", search steps are skipped for the rest of that run. Affected entries end with a status in `linkStatus` or in the Issues table. Wait and run them again.

***

### Integrations and API

#### Can I use WeChat Official Account Scraper as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) lets you start runs, schedule them and fetch results, so the Actor works as an unofficial WeChat Official Account API for public data. You don't need a WeChat developer account or an account of your own. Use the `apify-client` [NPM package](https://apify.com/insights_data/wechat-official-account-scraper/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/wechat-official-account-scraper/api/python) for Python. The [API tab](https://apify.com/insights_data/wechat-official-account-scraper/api) has ready-to-use code.

#### How to scrape WeChat with Python

Looking for a WeChat Python API for public article data? The Apify Python client runs this Actor and reads the results. It is not a WeChat messaging or bot SDK.

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/wechat-official-account-scraper").call(run_input={
    "urls": ["人工智能", "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"],
    "maxItemsPerEntry": 5,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("accountName"), item.get("publishTime"))
```

#### Can I integrate WeChat Official Account Scraper with other apps?

Yes. Connect it with almost any cloud service through [Apify integrations](https://apify.com/integrations): **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub, LangChain** and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to act when a run finishes. For example, a daily run with **🆕 Only new since last run** can append each new article about your brand to a Google Sheet and post a Slack message.

#### Can I use WeChat Official Account Scraper with AI agents (MCP)?

Yes. Connect it to Claude and other AI assistants through the Apify MCP server. Open the [MCP tab](https://apify.com/insights_data/wechat-official-account-scraper/api/mcp) for setup steps. With **📜 Full article records** and **🧾 Markdown** on, each WeChat article for AI use arrives as `contentMarkdown` that an agent or a RAG index can read directly.

***

### Other social media scrapers

These Actors from the same author complement WeChat Official Account Scraper for China social media monitoring and wider social research:

| | |
|---|---|
| 🔍 [Weibo Scraper — Posts, Comments, Profiles & Hot Search](https://apify.com/insights_data/weibo-scraper): Sina Weibo keyword and date-range search, #topics# with read counts, hot search boards, posts, comments and profiles | 📸 [Bilibili Scraper — Videos, Comments, Danmaku & Creator Uploads](https://apify.com/insights_data/bilibili-scraper-videos-comments-danmaku-creator-uploads): Bilibili videos, comments with replies, danmaku, creator uploads and trending searches |
| 👤 [TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper): videos, reposts, stories and playlists of any TikTok profile with views, likes and author stats | 📝 [TikTok Comments & Replies Scraper](https://apify.com/insights_data/tiktok-comments-replies-scraper): TikTok comments and replies with likes, dates and commenter details |

***

### ❓ FAQ

#### Is it legal to scrape WeChat?

Web scraping is generally legal if you extract publicly available data, and this Actor reads only public pages. However, WeChat articles are usually protected by their publishers' copyright, and WeChat has its own terms of service. Respect personal data (for example under GDPR) and intellectual property, collect personal data only with a legitimate reason, and check your use case with a lawyer if you are unsure. This is not legal advice.

#### How does WeChat Official Account Scraper work?

It works like a person browsing public WeChat pages, only faster. Each entry in your list is classified as a keyword, article link, album link or account. The matching step reads public search results, article pages or collections, applies your filters and limits, and saves each row as soon as it is ready. Many WeChat crawler tools need your login, cookies or a desktop app. This WeChat MP crawler reads only public pages and needs no WeChat account. If the site blocks requests, it retries and can switch to Apify Proxy on its own.

#### What is WeChat Official Account (公众号)?

A WeChat Official Account, also called a Weixin Official Account or WeChat public account (公众号), is a publishing account that brands, media and organizations use to post articles inside WeChat. Many of those articles can also be opened on the web, which is the public part this Actor reads.

#### Can it get read counts, likes, comments or WeChat Index?

No. WeChat shows per-article read counts, likes, shares, comments and WeChat Index only to the signed-in app. If you choose one of those steps, you get one free row with status `unavailable` and an explanation, never estimated numbers. The only read figure available is `albumReadCount`: the total reads of a whole collection, on album article rows, when WeChat shows it.

#### Can I download the whole history of a WeChat Official Account?

Partly. The Account articles step builds a WeChat Official Account history from two public sources: search results and the account's public collections (albums). It does not return a complete timeline, because no public page lists every post. You get the WeChat account articles that are visible in search or in collections. For long collections, use album links with **⏯️ Continue where the last run stopped**.

#### Why scrape WeChat Official Account articles?

- **WeChat marketing:** see which topics, formats and accounts get published in your niche.
- **WeChat data analysis:** count articles per account, topic or date, and study titles and text.
- **Media and PR monitoring:** follow how brands, products or people are covered.
- **Research and AI:** build Chinese-language datasets from public articles with stable IDs.

#### How is WeChat Official Account Scraper different from copying articles by hand?

| Feature | WeChat Official Account Scraper | Copying by hand |
|---|---|---|
| Many keywords, links and accounts in one go | ✅ | ❌ |
| Same fields for every article (JSON, CSV, Excel) | ✅ | ❌ |
| Only new articles on scheduled runs | ✅ | ❌ |
| Per-article read counts and comments | ❌ | Only inside the app |
| Price | $4.99 per 1,000 results on the Free plan, down to $3.50 on Business, + start fee + platform usage | Your time |

A WeChat article download done by hand means opening and saving each page. With this Actor, one run searches, opens and saves many articles, the work you would otherwise script yourself with a WeChat article fetcher or a WeChat article crawler.

#### Why am I getting fewer results than expected?

1. Check the defaults: 10 results per entry, 3 pages per keyword, and on the Free plan 10 results per run in total.
2. Remember that search shows about 100 recent results per query. Add **✨ Expand with suggestions** or more keywords.
3. Loosen filters: a date window drops rows without a publish time, and **🙋 Only from these accounts** removes all account and album rows.
4. Turn off **🆕 Only new since last run** if you want to see results that earlier runs already delivered.
5. Open the **Issues** table. It shows entries that could not be read (deleted, invalid, not found).

#### Why is `url` empty for some search results?

Some articles reached through search only expose a temporary signed link. Then `url` is empty, `temporaryUrl` holds the link (it expires), and `articleId` stays stable, so use `articleId` as your key. With **🔗 Open article links** off, search rows have no link at all (`linkStatus: notResolved`).

#### How do I extract WeChat articles from links I already have?

Paste the article links (full, short or temporary) into the list and keep the Auto step. Each link becomes a full article record. To turn a list of WeChat Official Account links into permanent links without the full text, choose **Convert article link** in **🪄 What to scrape** and put only links in the list.

***

### Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/wechat-official-account-scraper/issues/open) and include the run link.

Need a **custom solution**, more fields or a different WeChat data source? Contact us at hello.insights.data@gmail.com.

Built and maintained by [insights_data](https://apify.com/insights_data).

# Actor input Schema

## `operation` (type: `string`):

Auto picks the right step for every entry in the list below: keywords are searched, article links are read, album links are listed and gh\_ ids or @names are treated as accounts. Choose a specific step to apply it to every entry. Steps marked 'needs WeChat login' return a short notice row instead of data.

## `urls` (type: `array`):

One entry per line. Accepted: search keywords (人工智能, AI), article links (https://mp.weixin.qq.com/s/XXXXXXXXXXXX), album links, short links, gh\_ ids, @account names, or any article link of an account. Each keyword is a separate search with its own result budget.

## `maxItemsPerEntry` (type: `integer`):

Results kept for each keyword, account or album. 0 means no limit. Free plan users get up to 10 results per run in total; paid plans have no run limit.

## `maxPages` (type: `integer`):

How many result pages to read for each keyword or account. Results are de-duplicated and the run stops early when nothing is left.

## `expandWithSuggestions` (type: `integer`):

Also search the top N related suggestions of every keyword to get past the per-query result ceiling. 0 turns this off.

## `sortBy` (type: `string`):

Order of the delivered results (search and account articles; albums use Album order).

## `publishTime` (type: `string`):

Keep only articles published within this window.

## `publishedAfter` (type: `string`):

Only articles on or after this day (Beijing time). Format YYYY-MM-DD.

## `publishedBefore` (type: `string`):

Only articles on or before this day (Beijing time). Format YYYY-MM-DD.

## `onlyFromAccounts` (type: `array`):

Keep only results published by these account display names. Leave empty for all accounts.

## `excludeKeywords` (type: `array`):

Drop results whose title or summary contains any of these words.

## `resolveArticleLinks` (type: `boolean`):

Open every search result to add the article link, article id and account id. Turn off for a faster run with search data only.

## `fetchFullArticles` (type: `boolean`):

Replace every search or account-feed row with the complete article record (text, images, links, author, album).

## `includeContentText` (type: `boolean`):

Include the article text as plain text.

## `includeContentMarkdown` (type: `boolean`):

Include the article text as Markdown.

## `includeContentHtml` (type: `boolean`):

Include the original article HTML.

## `includeImages` (type: `boolean`):

Include the list of images with their sizes.

## `includeLinks` (type: `boolean`):

Include links found inside the article.

## `accountArticleSources` (type: `array`):

Account history can combine search results and the account's public article collections. Choose one or both.

## `albumOrder` (type: `string`):

Walk an album from its newest or its oldest article.

## `albumDiscoveryArticles` (type: `integer`):

How many more articles of an account are opened to find additional collections. 0 turns this off.

## `onlyNewSinceLastRun` (type: `boolean`):

Return only results not delivered by earlier runs of the same keyword or account. Ideal for scheduled monitoring.

## `continuePreviousRun` (type: `boolean`):

For large albums: the next run carries on from where the last one stopped instead of starting over. Turn it on from the first run.

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

How many articles are opened at the same time (1-10).

## `requestDelaySeconds` (type: `number`):

Minimum seconds between search requests.

## `maxRetries` (type: `integer`):

How often a failed request is retried before giving up.

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

Runs without a proxy by default. If the site blocks the request, the run switches to datacenter and then residential proxies on its own.

## Actor input object example

```json
{
  "operation": "auto",
  "urls": [
    "人工智能",
    "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  ],
  "maxItemsPerEntry": 10,
  "maxPages": 3,
  "expandWithSuggestions": 0,
  "sortBy": "relevance",
  "publishTime": "all",
  "onlyFromAccounts": [],
  "excludeKeywords": [],
  "resolveArticleLinks": true,
  "fetchFullArticles": false,
  "includeContentText": true,
  "includeContentMarkdown": true,
  "includeContentHtml": false,
  "includeImages": true,
  "includeLinks": true,
  "accountArticleSources": [
    "search",
    "albums"
  ],
  "albumOrder": "newest",
  "albumDiscoveryArticles": 3,
  "onlyNewSinceLastRun": false,
  "continuePreviousRun": false,
  "maxConcurrency": 4,
  "requestDelaySeconds": 2.5,
  "maxRetries": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `searchResults` (type: `string`):

Articles found by keyword search.

## `articleDetails` (type: `string`):

Full article records (text, images, author, album).

## `accountFeed` (type: `string`):

Articles listed from accounts and article collections.

## `accountProfiles` (type: `string`):

Account name, ID, signature, original count and collections.

## `accountSearch` (type: `string`):

Accounts ranked by matching articles per keyword.

## `links` (type: `string`):

Full and short article links.

## `suggestions` (type: `string`):

Related searches per keyword.

## `issues` (type: `string`):

Entries that could not be read, and steps that need a WeChat login.

## `articlesTable` (type: `string`):

Only article rows (separate table).

## `accountsTable` (type: `string`):

Only account rows (separate table).

## `linksTable` (type: `string`):

Only converted-link rows (separate table).

## `suggestionsTable` (type: `string`):

Only suggestion rows (separate table).

## `issuesTable` (type: `string`):

Only issue rows (separate table).

## `runSummary` (type: `string`):

Counts, proxy used and warnings.

# 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 = {
    "urls": [
        "人工智能",
        "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/wechat-official-account-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 = {
    "urls": [
        "人工智能",
        "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw",
    ],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("insights_data/wechat-official-account-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 '{
  "urls": [
    "人工智能",
    "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call insights_data/wechat-official-account-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/wechat-official-account-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/y5bQeSgvgFjb8xhE0/builds/Pg7A6SBE4Q4l7b6gB/openapi.json
