Weibo Search API — Posts by Keyword or Topic
Documentation menu
FetchLayer FetchLayer API

Search posts

Posts matching a keyword or a #topic#, read through time. latest (default), all, original (no reposts) and verified (from verified accounts) return every matching post, newest first, up to 50 a page, and continue with nextCursor back years. top (Weibo’s relevance picks), hot (its popular picks) and videos are ranked and give one page per time range: move since and until to read other periods. media (posts from news and media accounts) and images give one page and take no time range. combined gives the first page of every filter together, and costs 9 credits. since and until limit the period. These are the posts Weibo’s public search shows, which can leave out posts Weibo filters from search, so a result is what search shows rather than every post ever made. Search has no region filter. 1 credit per 50 posts returned, minimum 1.

POST /search-posts Search & trending
https://api.fetchlayer.dev/weibo/search-posts
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

query string required

The search term, up to 100 characters. Wrap a topic in # to search the topic, e.g. #华为#. Chinese terms match far more posts than English ones.

tab string optional

Which posts: latest, all, original, verified, top, hot, videos, media, images, combined. latest (default), all, original (no reposts) and verified (from verified accounts) return every matching post, newest first, up to 50 a page, and continue with nextCursor back years. top (Weibo’s relevance picks), hot (its popular picks) and videos are ranked and give one page per time range: move since and until to read other periods. media (posts from news and media accounts) and images give one page and take no time range. combined gives the first page of every filter together, and costs 9 credits. Case-insensitive. (default: latest)

since string optional

Only posts from this time on: a date (2026-10-01, read as the start of that day in China time) or an ISO 8601 date-time (2026-10-01T08:00:00Z). A 400 with tab images or media.

until string optional

Only posts up to this time: a date (which includes the whole day, China time) or an ISO 8601 date-time. A 400 with tab images or media.

limit integer optional

Maximum posts returned, up to 1000, or -1 for the maximum. Each 50 posts returned is 1 credit, minimum 1. (default: 50)

cursor string optional

Continue from a previous response’s nextCursor, passed back unchanged with the same query, tab, since and until. Works on tabs latest, all, original and verified.

format string optional

json or markdown, lowercase; any other value is a 400. Over MCP, markdown returns the result rendered as text; the REST API accepts it and returns JSON. (default: json)

timeoutMs integer optional

Time limit for the whole request, in milliseconds (1000–120000); a value outside that range is a 400. When it runs out, a paged request returns what it has with nextCursor, billed for the pages it read; a request with nothing to return yet fails with a 503 you can retry, marked with the response header X-Timeout-Source: caller.

Response Fields

search-posts

Search posts

transport string

The data source: always the platform id, "weibo".

scrapedAt string

When the result was produced (ISO 8601).

notes string[]

Caveats you can act on: a list that ends where Weibo stops showing more, long posts shortened in a list, paid placements left out. Empty when there are none. An empty result always comes with a note explaining it.

skippedRecords object[]

Records Weibo sent that could not be read, each as { id, reason, fieldsPresent }; id may be null. Normally empty. One unreadable record never costs the rest of the response or the cursor.

pagesFetched number

Full pages of results returned, minimum 1 — 20 comments or replies, 50 search posts, 48 media posts — which is what the request costs: one credit each.

query string

The search term.

tab string

The tab searched.

since string | null

The start of the period searched, or null.

until string | null

The end of the period searched, or null.

newestFirst boolean

True on latest, all, original and verified, where posts come newest first; false where Weibo ranks them.

posts object[]

The matching posts. Long posts are shortened here (textTruncated); post-detail returns the full text. The author’s follower count is Weibo’s rounded display (followersCountText); user-profile has the exact figure.

posts[].id string

The post’s numeric id, which post-detail and post-comments accept.

posts[].shortId string

The id in post links (RmPD8ERtm). post-detail and post-comments accept it too.

posts[].url string

Link to the post.

posts[].text string

The post’s text, with #topics# and @mentions as written.

posts[].textTruncated boolean

True when a list shortened a long post. post-detail always returns the full text.

posts[].createdAt string

When it was posted (ISO 8601, UTC).

posts[].postedFrom string | null

The province or country Weibo says it was posted from, such as 广东, or null.

posts[].source string | null

The app or label Weibo shows under the post.

posts[].author.id string

The account’s numeric id, which user-profile and user-posts accept.

posts[].author.screenName string

The display name.

posts[].author.url string

Link to the profile.

posts[].author.avatarUrl string | null

Avatar image.

posts[].author.verified boolean

Whether Weibo shows a verification badge.

posts[].author.verifiedReason string | null

Weibo’s verification text, such as 新浪科技官方微博, or null.

posts[].author.followersCount number | null

Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure.

posts[].author.followersCountText string | null

Followers as Weibo displays them, rounded (2380万 is 23.8 million).

posts[].stats object

reposts, comments, likes and reads. Exact figures, not the rounded ones on the page. A null counter means Weibo did not publish that value, never zero; reads is often null.

posts[].roundedStats string[]

Which counters in stats came back rounded. Empty means every counter is exact, which is the normal case.

posts[].topics string[]

The #topics# the post carries, without the #.

posts[].media object[]

Photos and video, in order. Each has kind (image, gif, video or live-photo), url, downloadUrl, width, height, durationSeconds and coverUrl.

posts[].media[].url string

Weibo’s own link to the file. It opens only from Weibo’s pages; use downloadUrl.

posts[].media[].downloadUrl string

A https://api.fetchlayer.dev/weibo/media link that opens anywhere and delivers the photo or video. Each request to it costs 1 credit.

posts[].editCount number | null

How many times the post was edited, or null.

posts[].isPinned boolean

Whether the author pinned it to their profile.

posts[].mediaTruncated boolean

True when a list showed fewer photos than the post has. post-detail returns every one.

posts[].repostOf object | null

The post this one reposts, in the same shape, or null for an original post.

postCount number

How many posts are in this response.

hasMore boolean

Whether more posts exist beyond what was returned.

nextCursor string | null

An opaque token to pass back unchanged as cursor, with the same request, to continue where this response stopped. null when there is nothing further.

Request

curl -X POST "https://api.fetchlayer.dev/weibo/search-posts" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"华为","tab":"latest","since":"2026-10-01","limit":50}'

Response

{
  "transport": "weibo",
  "skippedRecords": [],
  "scrapedAt": "2026-10-15T15:24:51.572Z",
  "notes": [
    "Long posts are shortened in search results (textTruncated); post-detail returns the full text."
  ],
  "pagesFetched": 1,
  "query": "华为",
  "tab": "latest",
  "since": "2026-10-01",
  "until": null,
  "newestFirst": true,
  "posts": [
    {
      "id": "5354374692867529",
      "shortId": "RmOx7c1Yt",
      "url": "https://weibo.com/6420207784/RmOx7c1Yt",
      "text": "深圳11月1日起,每天0时至24时,全市禁止机动车鸣喇叭,有效期5年 … #深圳11月1日起全域全天禁鸣喇叭#",
      "textTruncated": false,
      "createdAt": "2026-10-15T12:04:29.000Z",
      "postedFrom": "广东",
      "source": "搞笑幽默视频博主",
      "author": {
        "id": "6420207784",
        "screenName": "1024专员",
        "url": "https://weibo.com/u/6420207784",
        "verified": true,
        "verifiedReason": "搞笑幽默视频博主",
        "followersCount": null,
        "followersCountText": "172.8万"
      },
      "stats": {
        "reposts": 33,
        "comments": 234,
        "likes": 400,
        "reads": null
      },
      "roundedStats": [],
      "topics": [
        "深圳11月1日起全域全天禁鸣喇叭"
      ],
      "media": [
        {
          "kind": "image",
          "url": "https://wx1.sinaimg.cn/mw2000/0070uxksgy1ii3aj0oaluj30wr1ii104.jpg",
          "downloadUrl": "https://api.fetchlayer.dev/weibo/media?url=https%3A%2F%2Fwx1.sinaimg.cn%2Fmw2000%2F0070uxksgy1ii3aj0oaluj30wr1ii104.jpg",
          "width": 1179,
          "height": 1962,
          "durationSeconds": null,
          "coverUrl": null
        }
      ],
      "editCount": null,
      "isPinned": false,
      "mediaTruncated": false,
      "repostOf": null
    }
  ],
  "postCount": 50,
  "hasMore": true,
  "nextCursor": "eyJ2IjoxLCJyIjoic2VhcmNoLXBvc3RzIiwi…"
}