# WeChat Search articles and videos API

> WeChat Search results for keywords: Official Account articles and Channels videos mixed (type says which), by relevance, newest or hottest, filtered by time posted, or articles or videos only. Title or description, the source account name, time posted; articles with their link (and a band of reads on some), videos with likes and an export/… ID for wechat_channels.videos.get. WeChat Search gives no account ID.

Canonical page: https://okdata.online/apis/wechat/posts/search/

- **Endpoint**: `GET /v1/wechat/posts/search`
- **ID**: `wechat.posts.search`
- **Price**: $0.02 per call · about 20 posts per page
- **Returns**: a page of about 20 posts (`data.items`, Post objects)
- **Status**: preview
- **Good for**: Content research, Trend research, Word of mouth

## Price

One call costs $0.02 and returns one page of about 20 posts. Collecting 1,000 posts takes about 50 calls, $1.00 in total. Each page is a separate call; failed calls are not charged.

## Parameters

| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| `query` | string | yes |  | Keywords, as a person would type them into the platform search box. (e.g. `咖啡店开业`) |
| `sort` | string: relevance / latest / popular | no | `relevance` | Result order. |
| `published_within` | string: day / week / half_year | no |  | Only results from the last day, week or half year. |
| `type` | string: article / video | no |  | Official Account articles only, or Channels videos only; both, mixed, when left out. |
| `cursor` | string | no |  | Opaque cursor from page.next_cursor of the previous call. Each page is a separate call. |
| `view` | string: compact / standard / full | no | `standard` | How much of each object comes back. full adds platform-specific fields under ext. |
| `fields` | string[] | no |  | Fields to keep, by path (author.name), to save tokens. In a query string: comma-separated. |

cursor, view and fields work as described in [Requests](https://okdata.online/docs/requests/).

## Returned fields

Each item is a [Post](https://okdata.online/docs/objects/post/).

| Field | Type | Description |
|---|---|---|
| `id` | string | Post ID on the platform. |
| `url` | string | Link to the post. |
| `type` | string | What kind of post it is. |
| `title` | string \| null | Title, where the platform has one (videos, notes, articles). |
| `text` | string | Caption, body or description as plain text; articles come as Markdown. |
| `lang` | string \| null | Language code, as reported or detected. |
| `published_at` | string \| null | When it was published, ISO 8601 in UTC; null only where the source gives no time (wechat_mp.articles.metrics, wechat_channels.videos.metrics, youtube.channels.videos.list with type=short), then listed in meta.unavailable. |
| `author` | AccountRef | Who posted it. |
| `metrics` | Metrics | Counts at fetch time; a count the platform hides is null. |
| `images` | string[] \| null | Image URLs for image posts and notes. |
| `hashtags` | string[] \| null | Hashtags or topics, without the # sign. |
| `ext` | object | Platform-specific extras. Only returned with view=full. |

## Request examples

### cURL

```bash
curl -G "https://api.okdata.online/v1/wechat/posts/search" \
  -H "Authorization: Bearer $OKDATA_API_KEY" \
  --data-urlencode 'query=咖啡店开业'
```

### Python

```python
import os
import requests

resp = requests.get(
    "https://api.okdata.online/v1/wechat/posts/search",
    headers={"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"},
    params={"query": "咖啡店开业"},
    timeout=60,
)
body = resp.json()
if body["code"] != "ok":
    raise RuntimeError(f"{body['code']}: {body['message']} (charged: {body['charged']})")

for row in body["data"]["items"]:
    print(row["id"], row["metrics"]["likes"], row["text"][:60])
print("cost: $" + body["meta"]["billing"]["amount"])
```

### TypeScript

```ts
const url = new URL('https://api.okdata.online/v1/wechat/posts/search');
url.searchParams.set('query', "咖啡店开业");

const res = await fetch(url, {
  headers: {
    Authorization: `Bearer ${process.env.OKDATA_API_KEY}`,
  },
});
const body = await res.json();
if (body.code !== 'ok') throw new Error(`${body.code}: ${body.message}`);

for (const row of body.data.items) {
  console.log(row.id, row.metrics.likes, row.text.slice(0, 60));
}
console.log('cost: $' + body.meta.billing.amount);
```

### MCP

```json
{
  "name": "call",
  "arguments": {
    "capability": "wechat.posts.search",
    "query": "咖啡店开业"
  }
}
```

Or ask an agent that has the MCP server connected:

> Use WeChat Search articles and videos and list the five posts with the most likes, with links.

## Response example

```json
{
  "code": "ok",
  "request_id": "0f6c2a8e-4b1d-4e0a-9a51-3c7d2b9e1f20",
  "data": {
    "items": [
      {
        "id": "wechat-search-1",
        "url": "https://mp.weixin.qq.com/s/k3Fq9xYbT0aP2mWnR8sVdA",
        "type": "article",
        "title": "第一次露营需要准备哪些装备？",
        "text": "帐篷、睡袋、防潮垫是基础，其他按季节加。",
        "lang": "zh",
        "published_at": "2026-11-02T09:30:00Z",
        "author": {
          "id": "MS4wLjABAAAAx7",
          "username": null,
          "name": "轻装徒步",
          "avatar_url": "https://cdn.example.com/avatar/trailkit.jpg",
          "followers": 182300,
          "verified": true
        },
        "metrics": {
          "views": 1250000,
          "likes": 48200,
          "comments": null,
          "shares": null,
          "favorites": null,
          "reposts": null
        },
        "images": null,
        "hashtags": null
      }
    ]
  },
  "page": {
    "next_cursor": "eyJvIjoyMH0",
    "has_more": true
  },
  "warnings": [],
  "meta": {
    "capability": "wechat.posts.search",
    "billing": {
      "amount": "0.02",
      "currency": "USD",
      "balance_after": "9.98"
    },
    "unavailable": {
      "metrics.comments": "platform",
      "metrics.shares": "platform",
      "metrics.favorites": "platform",
      "metrics.reposts": "platform"
    },
    "cached": false,
    "replayed": false,
    "fetched_at": "2026-11-11T08:00:00Z"
  }
}
```

## Errors

Errors share one shape: code, request_id, message and message_zh (a fixed sentence per code), charged, retry, retry_after_seconds, param and docs_url, with the specifics in problems. They are not charged; only settlement_unknown is unknown until looked up. The full table: https://okdata.online/docs/errors/

## Questions

### How much does the WeChat Search articles and videos API cost?

One call costs $0.02 and returns one page of about 20 posts. Collecting 1,000 posts takes about 50 calls, $1.00 in total. Each page is a separate call; failed calls are not charged.

### How do I get the next page?

Pass page.next_cursor from the response back as the cursor parameter. When page.has_more is false there is nothing left. Every page is its own call at $0.02.

### Do I need a WeChat Search account, cookies or a QR login?

No. You send only your okdata API key. The data is public data from WeChat Search; nothing is fetched with your own WeChat Search account.

### Am I charged when a call fails?

No. Every error response says charged: false, except a timeout, which says charged: null until the outcome is known. Resend with the same Idempotency-Key and you are never charged twice.

### What if WeChat Search does not show a field?

The field is null, and meta.unavailable names it with the reason: platform (the platform never shows it) or capability (we cannot fetch it yet).

## More WeChat Search endpoints

- [WeChat Official Account live search](https://okdata.online/apis/wechat/accounts/search/): $0.02 per call · about 8 accounts per page
- [WeChat Index](https://okdata.online/apis/wechat/index/keywords/history/): $0.15 per call · about 1 results per page
- [WeChat Search suggestions](https://okdata.online/apis/wechat/keywords/related/): $0.15 per call · about 9 results per page
- [WeChat mini program search](https://okdata.online/apis/wechat/miniprograms/search/): $0.15 per call · about 25 results per page
- [WeChat Search articles and videos (backup)](https://okdata.online/apis/wechat/backup/posts/search/): $0.15 per call · about 20 posts per page

## At a glance

- **Short name**: WeChat Search articles and videos
- **Also called**: search wechat, wechat content search
- **Category**: [Social media](https://okdata.online/categories/social/)
- **Data type**: [Post search API](https://okdata.online/roles/posts-search/)
- **Status**: preview. It may still change; any change is announced beforehand.
- **Price**: $0.02 per call · failed calls are free
- **Returns**: About 20 posts a page, with a cursor for the next page
- **If a call fails**: Not charged. When a data source fails, the next one is tried; errors and timeouts cost nothing.

## When it is charged

- Data comes back: $0.02 per call
- Bad parameters, errors, timeouts: Free

| When | Charge |
|---|---|
| Each further page | A new call: $0.02 |
| Most one call costs | $0.02 |
| An empty answer | $0.02 |
| Bad parameters, errors, timeouts | Free |
| A retry with the same Idempotency-Key within 24 hours | Charged once |

A failed call is free; an empty answer costs $0.02; not found is free.

Prices from price book 1b273c48fea9634e. [Every price on this platform](https://okdata.online/pricing/wechat/)

- New accounts get $0.10 of credit, no card needed: 5 calls to this endpoint.
- About 50 calls fetch 1,000 posts: $1.00 in all.

## Known limits

- About 20 posts come back per page; the platform sets the page size, so there is no page-size parameter.
- For the next page, pass `page.next_cursor` back as `cursor`. A cursor stays valid for 24 hours. When `page.has_more` is false there is nothing left.

## Fields by view

The view column is the smallest `view` a field comes back in: `compact` returns only compact fields, `standard` adds the standard ones, `full` returns everything. The default is `standard`.

- `compact`: `id`, `url`, `type`, `title`, `text`, `published_at`, `author`, `metrics`
- `standard`: `lang`, `images`, `hashtags`
- `full`: `ext`

## What this endpoint cannot give

- `metrics.comments`: the platform does not show it (null, listed in meta.unavailable)
- `metrics.shares`: the platform does not show it (null, listed in meta.unavailable)
- `metrics.favorites`: the platform does not show it (null, listed in meta.unavailable)
- `metrics.reposts`: the platform does not show it (null, listed in meta.unavailable)

## Common errors on this endpoint

| HTTP | Code | Meaning | Charged | Retry |
|---|---|---|---|---|
| 400 | `invalid_params` | A parameter is missing, has the wrong type or value, or the method is wrong. problems lists each one; param names the first. | no | after a fix |
| 400 | `cursor_mismatch` | The cursor was sent to another endpoint, or with other parameters than the page it came from (view and fields may change). | no | after a fix |
| 401 | `unauthorized` | The key is missing, malformed, revoked, disabled or expired (reason says which when known). | no | no |
| 402 | `insufficient_balance` | The balance (available) cannot cover the most this call could cost (required). | no | after a fix |
| 410 | `cursor_expired` | The cursor is older than the endpoint's cursor lifetime (page.cursor_expires_at said when). | no | no |
| 429 | `rate_limited` | The account sent too many requests this minute (reason: rate) or has too many calls running (reason: concurrency). | no | yes |
| 500 | `settlement_unknown` | The data came back, but the charge could not be confirmed. | unknown until looked up | with the same Idempotency-Key |
| 502 | `upstream_failed` | Every data source for this endpoint failed on this request. | no | yes |
| 503 | `capability_paused` | This endpoint is paused right now; nothing ran. | no | yes |
| 504 | `timeout` | The data did not come back in time. The hold was released, so nothing was charged. | no | yes |

- Backup route: [WeChat Search articles and videos (backup)](https://okdata.online/apis/wechat/backup/posts/search/), $0.15 per call · about 20 posts per page

[All error codes](https://okdata.online/docs/errors/)

## Same data on other platforms

- [Douyin video search](https://okdata.online/apis/douyin/videos/search/): $0.02 per call · about 20 videos per page
- [Xiaohongshu note search](https://okdata.online/apis/xiaohongshu/notes/search/): $0.02 per call · about 20 notes per page
- [Bilibili video search](https://okdata.online/apis/bilibili/videos/search/): $0.002 per call · about 20 videos per page
- [Weibo post search](https://okdata.online/apis/weibo/posts/search/): $0.002 per call · about 10 posts per page
- [TikTok video search](https://okdata.online/apis/tiktok/videos/search/): $0.002 per call · about 30 videos per page
- [X post search](https://okdata.online/apis/x/posts/search/): $0.002 per call · about 20 posts per page
- [YouTube video search](https://okdata.online/apis/youtube/videos/search/): $0.004 per call · about 20 videos per page
- [Reddit post search](https://okdata.online/apis/reddit/posts/search/): $0.004 per call · about 25 posts per page
- [Kuaishou video search](https://okdata.online/apis/kuaishou/videos/search/): $0.02 per call · about 10 videos per page
- [Zhihu search](https://okdata.online/apis/zhihu/posts/search/): $0.002 per call · about 20 posts per page
- [WeChat Channels video search](https://okdata.online/apis/wechat_channels/videos/search/): $0.02 per call · about 10 videos per page

[Post search API](https://okdata.online/roles/posts-search/)

## Use it in your AI

> Read https://okdata.online/apis/wechat/posts/search.md, then call this endpoint for me through okdata; my key is in the OKDATA_API_KEY environment variable. Use WeChat Search articles and videos and list the five posts with the most likes, with links.
