{
  "openapi": "3.1.0",
  "info": {
    "title": "Weibo API",
    "version": "1.0.0",
    "description": "A Weibo API for public Weibo (微博) data: posts with exact repost, comment, like and read counts, the comments on a post and the replies to them, account profiles with exact follower counts, an account’s posts, post search by keyword or #topic# that pages back through time, account search and the live hot-search list — as structured JSON, with cursor paging, a media download link and a free URL parser."
  },
  "servers": [
    {
      "url": "https://api.fetchlayer.dev/weibo"
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Every error, on every route. Branch on code and retryable rather than on the text; on a 5xx the text is generic. MCP tool errors carry the same fields in structuredContent, and as a JSON text block.",
        "properties": {
          "error": {
            "type": "string",
            "description": "What went wrong, in words. For a 400, what to change."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status, repeated in the body."
          },
          "code": {
            "type": "string",
            "description": "The kind of error, stable: invalid_input, unauthorized, insufficient_credits, forbidden, not_found, expired, quota_exceeded, cancelled, time_limit, temporarily_unavailable, store_unreachable, upstream_error, internal_error, tool_error. A platform may add its own; more may be added. Treat a code you do not recognise by its retryable flag."
          },
          "retryable": {
            "type": "boolean",
            "description": "Whether asking again can succeed."
          },
          "requestId": {
            "type": "string",
            "description": "This request’s id, also sent as the X-Request-Id header. Quote it when reporting a problem."
          },
          "missing": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "With invalid_input for missing required parameters: the parameters that were missing."
          }
        },
        "required": [
          "error",
          "code",
          "retryable",
          "requestId"
        ]
      }
    },
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "API Key",
        "description": "Send your FetchLayer key as Authorization: Bearer ss-your-key."
      }
    }
  },
  "paths": {
    "/post-detail": {
      "post": {
        "operationId": "post-detail",
        "tags": [
          "Posts & comments"
        ],
        "summary": "Get one post in full",
        "description": "One public Weibo post in full: the complete text, author, time and place of posting, exact repost, comment, like and read counts, topics, photos and video, and the post it reposts. 1 credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "post": {
                    "type": "string",
                    "description": "A post: its link (weibo.com/<user>/<id> or m.weibo.cn/detail/<id>), its numeric id, or the short id from its link (RmPD8ERtm in weibo.com/1642634100/RmPD8ERtm)."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "post"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "post": "https://weibo.com/6420207784/RmOx7c1Yt"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "post": {
                      "type": "object",
                      "additionalProperties": true,
                      "description": "The post. A post that does not exist or is not public is a 404 naming it.",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "The post’s numeric id, which post-detail and post-comments accept."
                        },
                        "shortId": {
                          "type": "string",
                          "description": "The id in post links (RmPD8ERtm). post-detail and post-comments accept it too."
                        },
                        "url": {
                          "type": "string",
                          "description": "Link to the post."
                        },
                        "text": {
                          "type": "string",
                          "description": "The post’s text, with #topics# and @mentions as written."
                        },
                        "textTruncated": {
                          "type": "boolean",
                          "description": "True when a list shortened a long post. post-detail always returns the full text."
                        },
                        "createdAt": {
                          "type": "string",
                          "description": "When it was posted (ISO 8601, UTC)."
                        },
                        "postedFrom": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The province or country Weibo says it was posted from, such as 广东, or null."
                        },
                        "source": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The app or label Weibo shows under the post."
                        },
                        "author": {
                          "type": "object",
                          "properties": {
                            "id": {
                              "type": "string",
                              "description": "The account’s numeric id, which user-profile and user-posts accept."
                            },
                            "screenName": {
                              "type": "string",
                              "description": "The display name."
                            },
                            "url": {
                              "type": "string",
                              "description": "Link to the profile."
                            },
                            "avatarUrl": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Avatar image."
                            },
                            "verified": {
                              "type": "boolean",
                              "description": "Whether Weibo shows a verification badge."
                            },
                            "verifiedReason": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                            },
                            "followersCount": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                            },
                            "followersCountText": {
                              "type": [
                                "string",
                                "null"
                              ],
                              "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                            }
                          },
                          "additionalProperties": false
                        },
                        "stats": {
                          "type": "object",
                          "additionalProperties": true,
                          "description": "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."
                        },
                        "roundedStats": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "Which counters in stats came back rounded. Empty means every counter is exact, which is the normal case."
                        },
                        "topics": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          },
                          "description": "The #topics# the post carries, without the #."
                        },
                        "media": {
                          "type": "array",
                          "items": {
                            "type": "object",
                            "additionalProperties": true,
                            "properties": {
                              "url": {
                                "type": "string",
                                "description": "Weibo’s own link to the file. It opens only from Weibo’s pages; use downloadUrl."
                              },
                              "downloadUrl": {
                                "type": "string",
                                "description": "A https://api.fetchlayer.dev/weibo/media link that opens anywhere and delivers the photo or video. Each request to it costs 1 credit."
                              }
                            }
                          },
                          "description": "Photos and video, in order. Each has kind (image, gif, video or live-photo), url, downloadUrl, width, height, durationSeconds and coverUrl."
                        },
                        "editCount": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "How many times the post was edited, or null."
                        },
                        "isPinned": {
                          "type": "boolean",
                          "description": "Whether the author pinned it to their profile."
                        },
                        "mediaTruncated": {
                          "type": "boolean",
                          "description": "True when a list showed fewer photos than the post has. post-detail returns every one."
                        },
                        "repostOf": {
                          "type": [
                            "object",
                            "null"
                          ],
                          "additionalProperties": true,
                          "description": "The post this one reposts, in the same shape, or null for an original post."
                        }
                      }
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:25:22.762Z",
                      "notes": [],
                      "pagesFetched": 1,
                      "post": {
                        "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
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/post-comments": {
      "post": {
        "operationId": "post-comments",
        "tags": [
          "Posts & comments"
        ],
        "summary": "Read the comments on a post",
        "description": "The comments on a Weibo post, most-liked first (hot) or newest first (latest), each with its likes, reply count, a few inline replies and where the commenter posted from. Very large threads stop at a few hundred comments (about 300 hot, about 740 latest), however many Weibo counts, and notes says so. 1 credit per 20 comments.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "post": {
                    "type": "string",
                    "description": "A post: its link (weibo.com/<user>/<id> or m.weibo.cn/detail/<id>), its numeric id, or the short id from its link (RmPD8ERtm in weibo.com/1642634100/RmPD8ERtm)."
                  },
                  "sort": {
                    "type": "string",
                    "description": "hot: most-liked first, as Weibo ranks them. latest: newest first. Case-insensitive.",
                    "example": "hot"
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum comments returned, up to 1000, or -1 for the maximum. Each 20 comments returned is 1 credit, minimum 1.",
                    "example": "20"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "Continue from a previous response’s nextCursor, passed back unchanged with the same post and sort."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "post"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "post": "5354374692867529",
                    "sort": "hot",
                    "limit": 20
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "postId": {
                      "type": "string",
                      "description": "The post’s numeric id."
                    },
                    "sort": {
                      "type": "string",
                      "description": "The order the comments came back in."
                    },
                    "totalCount": {
                      "type": "number",
                      "description": "Weibo’s own comment count for the post, which includes replies, so it is higher than the comments a full walk returns."
                    },
                    "comments": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "The comment’s id, which comment-replies takes as commentId."
                          },
                          "text": {
                            "type": "string",
                            "description": "The comment’s text."
                          },
                          "createdAt": {
                            "type": "string",
                            "description": "When it was posted (ISO 8601, UTC)."
                          },
                          "postedFrom": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The province or country Weibo says the commenter posted from, or null."
                          },
                          "likes": {
                            "type": "number",
                            "description": "Likes on the comment."
                          },
                          "replyCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Replies under it in total; comment-replies reads them."
                          },
                          "previewReplies": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true
                            },
                            "description": "The few replies Weibo shows inline under the comment, in the same shape. Usually fewer than replyCount."
                          },
                          "replyToCommentId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The comment this one answers, or null for a top-level comment."
                          },
                          "rootCommentId": {
                            "type": "string",
                            "description": "The top-level comment of the thread it belongs to."
                          },
                          "author": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The account’s numeric id, which user-profile and user-posts accept."
                              },
                              "screenName": {
                                "type": "string",
                                "description": "The display name."
                              },
                              "url": {
                                "type": "string",
                                "description": "Link to the profile."
                              },
                              "avatarUrl": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Avatar image."
                              },
                              "verified": {
                                "type": "boolean",
                                "description": "Whether Weibo shows a verification badge."
                              },
                              "verifiedReason": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                              },
                              "followersCount": {
                                "type": [
                                  "number",
                                  "null"
                                ],
                                "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                              },
                              "followersCountText": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                              }
                            },
                            "additionalProperties": false
                          },
                          "floor": {
                            "type": "number",
                            "description": "Weibo’s position number for the comment in the thread, or 0 for a reply."
                          },
                          "imageUrls": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Images attached to the comment."
                          }
                        }
                      },
                      "description": "The comments. A post with none that Weibo shows publicly returns an empty list with a note; comments on a post that does not exist are a 404."
                    },
                    "commentCount": {
                      "type": "number",
                      "description": "How many comments are in this response."
                    },
                    "hasMore": {
                      "type": "boolean",
                      "description": "Whether more comments exist beyond what was returned."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "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."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:25:22.762Z",
                      "notes": [],
                      "pagesFetched": 1,
                      "postId": "5354374692867529",
                      "sort": "hot",
                      "totalCount": 234,
                      "comments": [
                        {
                          "id": "5354375000365421",
                          "text": "全天不允许按喇叭？那买喇叭是用来？",
                          "createdAt": "2026-10-15T12:05:42.000Z",
                          "postedFrom": "江苏",
                          "likes": 80,
                          "replyCount": 10,
                          "previewReplies": [],
                          "replyToCommentId": null,
                          "rootCommentId": "5354375000365421",
                          "author": {
                            "id": "7752365556",
                            "screenName": "半岛铁壳202204",
                            "url": "https://weibo.com/u/7752365556",
                            "verified": false,
                            "verifiedReason": null,
                            "followersCount": 177,
                            "followersCountText": "177"
                          },
                          "floor": 1,
                          "imageUrls": []
                        }
                      ],
                      "commentCount": 20,
                      "hasMore": true,
                      "nextCursor": "eyJ2IjoxLCJyIjoicG9zdC1jb21tZW50cyIs…"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/comment-replies": {
      "post": {
        "operationId": "comment-replies",
        "tags": [
          "Posts & comments"
        ],
        "summary": "Read the replies to a comment",
        "description": "Every reply under one Weibo comment, oldest first, each naming the comment it answers. Take commentId from a comment’s id. 1 credit per 20 replies.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "commentId": {
                    "type": "string",
                    "description": "A comment’s id, as post-comments returns it: digits only."
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum replies returned, up to 500, or -1 for the maximum. Each 20 replies returned is 1 credit, minimum 1.",
                    "example": "20"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "Continue from a previous response’s nextCursor, passed back unchanged with the same request. It is bound to the request that issued it — the same post, comment, account, sort, tab, since and until — and anything else, including a cursor from another tool, is a 400 naming cursor."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "commentId"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "commentId": "5354375000365421"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "commentId": {
                      "type": "string",
                      "description": "The comment the replies are under."
                    },
                    "totalCount": {
                      "type": "number",
                      "description": "Weibo’s own reply count for the comment."
                    },
                    "replies": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "The comment’s id, which comment-replies takes as commentId."
                          },
                          "text": {
                            "type": "string",
                            "description": "The comment’s text."
                          },
                          "createdAt": {
                            "type": "string",
                            "description": "When it was posted (ISO 8601, UTC)."
                          },
                          "postedFrom": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The province or country Weibo says the commenter posted from, or null."
                          },
                          "likes": {
                            "type": "number",
                            "description": "Likes on the comment."
                          },
                          "replyCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Replies under it in total; comment-replies reads them."
                          },
                          "previewReplies": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true
                            },
                            "description": "The few replies Weibo shows inline under the comment, in the same shape. Usually fewer than replyCount."
                          },
                          "replyToCommentId": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The comment this one answers, or null for a top-level comment."
                          },
                          "rootCommentId": {
                            "type": "string",
                            "description": "The top-level comment of the thread it belongs to."
                          },
                          "author": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The account’s numeric id, which user-profile and user-posts accept."
                              },
                              "screenName": {
                                "type": "string",
                                "description": "The display name."
                              },
                              "url": {
                                "type": "string",
                                "description": "Link to the profile."
                              },
                              "avatarUrl": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Avatar image."
                              },
                              "verified": {
                                "type": "boolean",
                                "description": "Whether Weibo shows a verification badge."
                              },
                              "verifiedReason": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                              },
                              "followersCount": {
                                "type": [
                                  "number",
                                  "null"
                                ],
                                "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                              },
                              "followersCountText": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                              }
                            },
                            "additionalProperties": false
                          },
                          "floor": {
                            "type": "number",
                            "description": "Weibo’s position number for the comment in the thread, or 0 for a reply."
                          },
                          "imageUrls": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Images attached to the comment."
                          }
                        }
                      },
                      "description": "The replies, oldest first, in the comment shape. A comment with no replies returns an empty list with a note."
                    },
                    "replyCount": {
                      "type": "number",
                      "description": "How many replies are in this response."
                    },
                    "hasMore": {
                      "type": "boolean",
                      "description": "Whether more replies exist beyond what was returned."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "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."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:25:24.408Z",
                      "notes": [],
                      "pagesFetched": 1,
                      "commentId": "5354375000365421",
                      "totalCount": 10,
                      "replies": [
                        {
                          "id": "5354420939262870",
                          "text": "回复@KTBFFH刘少侠:这会下意识让该按的时候按慢了犹豫了不敢按了",
                          "createdAt": "2026-10-15T12:05:42.000Z",
                          "postedFrom": "福建",
                          "likes": 0,
                          "replyCount": null,
                          "previewReplies": [],
                          "replyToCommentId": "5354406438765771",
                          "rootCommentId": "5354375000365421",
                          "author": {
                            "id": "7752365556",
                            "screenName": "半岛铁壳202204",
                            "url": "https://weibo.com/u/7752365556",
                            "verified": false,
                            "verifiedReason": null,
                            "followersCount": 177,
                            "followersCountText": "177"
                          },
                          "floor": 0,
                          "imageUrls": []
                        }
                      ],
                      "replyCount": 10,
                      "hasMore": false,
                      "nextCursor": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/user-profile": {
      "post": {
        "operationId": "user-profile",
        "tags": [
          "Accounts"
        ],
        "summary": "Get an account’s profile",
        "description": "A Weibo account’s profile by numeric id, link, custom address or display name: bio, verification, exact follower, following and post counts, the reposts, comments and likes received across all its posts, location, IP location and join date. 1 credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "user": {
                    "type": "string",
                    "description": "An account: its numeric id, its profile link, its custom address (weibo.com/<name>), or its display name with or without @. A display name is the least exact: when you have the id or link, pass that."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "user"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "user": "1642634100"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "profile": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "description": "The account’s numeric id."
                        },
                        "screenName": {
                          "type": "string",
                          "description": "The display name."
                        },
                        "url": {
                          "type": "string",
                          "description": "Link to the profile."
                        },
                        "handle": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The custom address (sinatech in weibo.com/sinatech), or null."
                        },
                        "description": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The bio."
                        },
                        "avatarUrl": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Avatar image."
                        },
                        "coverUrl": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Profile cover image."
                        },
                        "gender": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "male or female, as the account states it, or null."
                        },
                        "location": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The location the account states, such as 北京 海淀区."
                        },
                        "ipLocation": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The IP location Weibo shows on the profile, or null."
                        },
                        "hometown": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Hometown, when the account shares it."
                        },
                        "birthday": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Birthday, when the account shares it."
                        },
                        "createdAt": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "When the account joined (ISO 8601)."
                        },
                        "verified": {
                          "type": "boolean",
                          "description": "Whether Weibo shows a verification badge."
                        },
                        "verifiedType": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Weibo’s verification type code, or null."
                        },
                        "verifiedReason": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Weibo’s verification text."
                        },
                        "company": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "The company the account lists."
                        },
                        "creditLevel": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Weibo’s Sunshine credit rating text, such as 阳光信用极好."
                        },
                        "activitySummary": {
                          "type": [
                            "string",
                            "null"
                          ],
                          "description": "Weibo’s one-line summary of yesterday’s activity (posts, reads, interactions), or null."
                        },
                        "stats": {
                          "type": "object",
                          "properties": {
                            "followers": {
                              "type": "number",
                              "description": "Followers, exact: 23800264, not 2380万."
                            },
                            "followersText": {
                              "type": "string",
                              "description": "Followers as Weibo displays them, rounded."
                            },
                            "following": {
                              "type": "number",
                              "description": "Accounts this one follows."
                            },
                            "posts": {
                              "type": "number",
                              "description": "Posts the account has made."
                            },
                            "totalInteractions": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Reposts, comments and likes received across all its posts."
                            },
                            "totalReposts": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Reposts received across all its posts."
                            },
                            "totalComments": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Comments received across all its posts."
                            },
                            "totalLikes": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Likes received across all its posts."
                            },
                            "videoPlays": {
                              "type": [
                                "number",
                                "null"
                              ],
                              "description": "Plays across its videos, when Weibo publishes it."
                            }
                          },
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": false
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:24:49.000Z",
                      "notes": [],
                      "pagesFetched": 1,
                      "profile": {
                        "id": "1642634100",
                        "screenName": "新浪科技",
                        "url": "https://weibo.com/u/1642634100",
                        "handle": "sinatech",
                        "description": "新浪科技是中国最有影响力的TMT产业资讯及数码产品服务平台。",
                        "gender": "male",
                        "location": "北京 海淀区",
                        "ipLocation": null,
                        "createdAt": "2009-08-28T13:07:40.000Z",
                        "verified": true,
                        "verifiedType": 3,
                        "verifiedReason": "新浪科技官方微博",
                        "company": "新浪网技术（中国）有限公司",
                        "creditLevel": "阳光信用极好",
                        "activitySummary": "昨日发博48，阅读数100万+，互动数8508",
                        "stats": {
                          "followers": 23800264,
                          "followersText": "2380万",
                          "following": 2702,
                          "posts": 266314,
                          "totalInteractions": 279672788,
                          "totalReposts": 26206649,
                          "totalComments": 21401734,
                          "totalLikes": 232064405,
                          "videoPlays": null
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/user-posts": {
      "post": {
        "operationId": "user-posts",
        "tags": [
          "Accounts"
        ],
        "summary": "List an account’s posts",
        "description": "An account’s posts, newest first and every kind, 50 a page, going back through roughly the newest 2,000 posts Weibo lists with nextCursor. With mediaOnly, only its posts that carry photos or video, which reach further back. 1 credit per 50 posts returned, or with mediaOnly 1 per 48.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "user": {
                    "type": "string",
                    "description": "An account: its numeric id, its profile link, its custom address (weibo.com/<name>), or its display name with or without @. A display name is the least exact: when you have the id or link, pass that."
                  },
                  "mediaOnly": {
                    "type": "boolean",
                    "description": "true lists only the account’s posts that carry photos or video, which reach further back than the full list, about 48 to a page. Without it the list is every kind of post, 50 to a page.",
                    "example": "false"
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum posts returned, up to 500, or -1 for the maximum.",
                    "example": "20"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "Continue a mediaOnly listing from a previous response’s nextCursor, passed back unchanged with the same request. mediaOnly: true is required alongside it; a cursor without it is a 400, because a plain listing has no further page."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "user"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "user": "1642634100",
                    "limit": 20
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "userId": {
                      "type": "string",
                      "description": "The account’s numeric id."
                    },
                    "mediaOnly": {
                      "type": "boolean",
                      "description": "Whether this is the photo-and-video listing."
                    },
                    "posts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "The post’s numeric id, which post-detail and post-comments accept."
                          },
                          "shortId": {
                            "type": "string",
                            "description": "The id in post links (RmPD8ERtm). post-detail and post-comments accept it too."
                          },
                          "url": {
                            "type": "string",
                            "description": "Link to the post."
                          },
                          "text": {
                            "type": "string",
                            "description": "The post’s text, with #topics# and @mentions as written."
                          },
                          "textTruncated": {
                            "type": "boolean",
                            "description": "True when a list shortened a long post. post-detail always returns the full text."
                          },
                          "createdAt": {
                            "type": "string",
                            "description": "When it was posted (ISO 8601, UTC)."
                          },
                          "postedFrom": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The province or country Weibo says it was posted from, such as 广东, or null."
                          },
                          "source": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The app or label Weibo shows under the post."
                          },
                          "author": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The account’s numeric id, which user-profile and user-posts accept."
                              },
                              "screenName": {
                                "type": "string",
                                "description": "The display name."
                              },
                              "url": {
                                "type": "string",
                                "description": "Link to the profile."
                              },
                              "avatarUrl": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Avatar image."
                              },
                              "verified": {
                                "type": "boolean",
                                "description": "Whether Weibo shows a verification badge."
                              },
                              "verifiedReason": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                              },
                              "followersCount": {
                                "type": [
                                  "number",
                                  "null"
                                ],
                                "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                              },
                              "followersCountText": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                              }
                            },
                            "additionalProperties": false
                          },
                          "stats": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "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."
                          },
                          "roundedStats": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Which counters in stats came back rounded. Empty means every counter is exact, which is the normal case."
                          },
                          "topics": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "The #topics# the post carries, without the #."
                          },
                          "media": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "url": {
                                  "type": "string",
                                  "description": "Weibo’s own link to the file. It opens only from Weibo’s pages; use downloadUrl."
                                },
                                "downloadUrl": {
                                  "type": "string",
                                  "description": "A https://api.fetchlayer.dev/weibo/media link that opens anywhere and delivers the photo or video. Each request to it costs 1 credit."
                                }
                              }
                            },
                            "description": "Photos and video, in order. Each has kind (image, gif, video or live-photo), url, downloadUrl, width, height, durationSeconds and coverUrl."
                          },
                          "editCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "How many times the post was edited, or null."
                          },
                          "isPinned": {
                            "type": "boolean",
                            "description": "Whether the author pinned it to their profile."
                          },
                          "mediaTruncated": {
                            "type": "boolean",
                            "description": "True when a list showed fewer photos than the post has. post-detail returns every one."
                          },
                          "repostOf": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "additionalProperties": true,
                            "description": "The post this one reposts, in the same shape, or null for an original post."
                          }
                        }
                      },
                      "description": "The posts, newest first. Long posts are shortened here (textTruncated); post-detail returns the full text."
                    },
                    "postCount": {
                      "type": "number",
                      "description": "How many posts are in this response."
                    },
                    "hasMore": {
                      "type": "boolean",
                      "description": "Whether more posts exist beyond what was returned."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "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."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:24:51.584Z",
                      "notes": [
                        "Long posts are shortened in this list (textTruncated); post-detail returns the full text."
                      ],
                      "pagesFetched": 1,
                      "userId": "1642634100",
                      "mediaOnly": false,
                      "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": "1642634100",
                            "screenName": "新浪科技",
                            "url": "https://weibo.com/u/1642634100",
                            "avatarUrl": "https://wx2.sinaimg.cn/orj480/001Nakaoly8h8vh6pbz8ij60c60c4q3602.jpg",
                            "verified": true,
                            "verifiedReason": "新浪科技官方微博",
                            "followersCount": null,
                            "followersCountText": "2380万"
                          },
                          "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": 10,
                      "hasMore": false,
                      "nextCursor": null
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/search-posts": {
      "post": {
        "operationId": "search-posts",
        "tags": [
          "Search & trending"
        ],
        "summary": "Search posts",
        "description": "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.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "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": {
                    "type": "string",
                    "description": "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.",
                    "example": "latest"
                  },
                  "since": {
                    "type": "string",
                    "description": "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": {
                    "type": "string",
                    "description": "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": {
                    "type": "integer",
                    "description": "Maximum posts returned, up to 1000, or -1 for the maximum. Each 50 posts returned is 1 credit, minimum 1.",
                    "example": "50"
                  },
                  "cursor": {
                    "type": "string",
                    "description": "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": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "query"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "query": "华为",
                    "tab": "latest",
                    "since": "2026-10-01",
                    "limit": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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": {
                      "type": "string",
                      "description": "The search term."
                    },
                    "tab": {
                      "type": "string",
                      "description": "The tab searched."
                    },
                    "since": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The start of the period searched, or null."
                    },
                    "until": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The end of the period searched, or null."
                    },
                    "newestFirst": {
                      "type": "boolean",
                      "description": "True on latest, all, original and verified, where posts come newest first; false where Weibo ranks them."
                    },
                    "posts": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "The post’s numeric id, which post-detail and post-comments accept."
                          },
                          "shortId": {
                            "type": "string",
                            "description": "The id in post links (RmPD8ERtm). post-detail and post-comments accept it too."
                          },
                          "url": {
                            "type": "string",
                            "description": "Link to the post."
                          },
                          "text": {
                            "type": "string",
                            "description": "The post’s text, with #topics# and @mentions as written."
                          },
                          "textTruncated": {
                            "type": "boolean",
                            "description": "True when a list shortened a long post. post-detail always returns the full text."
                          },
                          "createdAt": {
                            "type": "string",
                            "description": "When it was posted (ISO 8601, UTC)."
                          },
                          "postedFrom": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The province or country Weibo says it was posted from, such as 广东, or null."
                          },
                          "source": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The app or label Weibo shows under the post."
                          },
                          "author": {
                            "type": "object",
                            "properties": {
                              "id": {
                                "type": "string",
                                "description": "The account’s numeric id, which user-profile and user-posts accept."
                              },
                              "screenName": {
                                "type": "string",
                                "description": "The display name."
                              },
                              "url": {
                                "type": "string",
                                "description": "Link to the profile."
                              },
                              "avatarUrl": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Avatar image."
                              },
                              "verified": {
                                "type": "boolean",
                                "description": "Whether Weibo shows a verification badge."
                              },
                              "verifiedReason": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                              },
                              "followersCount": {
                                "type": [
                                  "number",
                                  "null"
                                ],
                                "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                              },
                              "followersCountText": {
                                "type": [
                                  "string",
                                  "null"
                                ],
                                "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                              }
                            },
                            "additionalProperties": false
                          },
                          "stats": {
                            "type": "object",
                            "additionalProperties": true,
                            "description": "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."
                          },
                          "roundedStats": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "Which counters in stats came back rounded. Empty means every counter is exact, which is the normal case."
                          },
                          "topics": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "The #topics# the post carries, without the #."
                          },
                          "media": {
                            "type": "array",
                            "items": {
                              "type": "object",
                              "additionalProperties": true,
                              "properties": {
                                "url": {
                                  "type": "string",
                                  "description": "Weibo’s own link to the file. It opens only from Weibo’s pages; use downloadUrl."
                                },
                                "downloadUrl": {
                                  "type": "string",
                                  "description": "A https://api.fetchlayer.dev/weibo/media link that opens anywhere and delivers the photo or video. Each request to it costs 1 credit."
                                }
                              }
                            },
                            "description": "Photos and video, in order. Each has kind (image, gif, video or live-photo), url, downloadUrl, width, height, durationSeconds and coverUrl."
                          },
                          "editCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "How many times the post was edited, or null."
                          },
                          "isPinned": {
                            "type": "boolean",
                            "description": "Whether the author pinned it to their profile."
                          },
                          "mediaTruncated": {
                            "type": "boolean",
                            "description": "True when a list showed fewer photos than the post has. post-detail returns every one."
                          },
                          "repostOf": {
                            "type": [
                              "object",
                              "null"
                            ],
                            "additionalProperties": true,
                            "description": "The post this one reposts, in the same shape, or null for an original post."
                          }
                        }
                      },
                      "description": "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."
                    },
                    "postCount": {
                      "type": "number",
                      "description": "How many posts are in this response."
                    },
                    "hasMore": {
                      "type": "boolean",
                      "description": "Whether more posts exist beyond what was returned."
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "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."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "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…"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/search-users": {
      "post": {
        "operationId": "search-users",
        "tags": [
          "Search & trending"
        ],
        "summary": "Search accounts",
        "description": "Accounts matching a name or keyword: the first page of results, with follower counts as Weibo displays them in search, rounded. user-profile gives the exact figure. 1 credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "A name or keyword, up to 100 characters."
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum accounts returned, up to 50, or -1 for the maximum.",
                    "example": "20"
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "query"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "query": "华为",
                    "limit": 20
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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": {
                      "type": "string",
                      "description": "The search term."
                    },
                    "users": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "id": {
                            "type": "string",
                            "description": "The account’s numeric id, which user-profile and user-posts accept."
                          },
                          "screenName": {
                            "type": "string",
                            "description": "The display name."
                          },
                          "url": {
                            "type": "string",
                            "description": "Link to the profile."
                          },
                          "avatarUrl": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Avatar image."
                          },
                          "verified": {
                            "type": "boolean",
                            "description": "Whether Weibo shows a verification badge."
                          },
                          "verifiedReason": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Weibo’s verification text, such as 新浪科技官方微博, or null."
                          },
                          "followersCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Followers as an exact figure where Weibo publishes one here, else null. user-profile always has the exact figure."
                          },
                          "followersCountText": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Followers as Weibo displays them, rounded (2380万 is 23.8 million)."
                          },
                          "description": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "The bio."
                          },
                          "postsCount": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Posts the account has made."
                          },
                          "gender": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "male or female, as the account states it."
                          }
                        }
                      },
                      "description": "The matching accounts, in Weibo’s order."
                    },
                    "userCount": {
                      "type": "number",
                      "description": "How many accounts are in this response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:24:50.000Z",
                      "notes": [
                        "Follower counts in search results are rounded the way Weibo displays them (followersCountText); user-profile returns the exact figure."
                      ],
                      "pagesFetched": 1,
                      "query": "华为",
                      "users": [
                        {
                          "id": "1839167003",
                          "screenName": "华为终端",
                          "url": "https://weibo.com/u/1839167003",
                          "verified": true,
                          "verifiedReason": "华为终端官方微博",
                          "followersCount": null,
                          "followersCountText": "2427.7万",
                          "description": "华为终端产品信息官方发布平台。",
                          "postsCount": 29798,
                          "gender": "male"
                        }
                      ],
                      "userCount": 20
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/trending": {
      "post": {
        "operationId": "trending",
        "tags": [
          "Search & trending"
        ],
        "summary": "Get the hot-search list",
        "description": "Weibo’s live hot-search list (热搜) with the exact heat score behind every topic. Paid placements are left out unless includePromoted is true. 1 credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "includePromoted": {
                    "type": "boolean",
                    "description": "Include the paid placements Weibo mixes into the list, marked isPromoted.",
                    "example": "false"
                  },
                  "limit": {
                    "type": "integer",
                    "description": "Maximum topics returned, up to 60, or -1 for the maximum. Left out, the whole list."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false
              },
              "examples": {
                "default": {
                  "value": {
                    "limit": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "transport": {
                      "type": "string",
                      "description": "The data source: always the platform id, \"weibo\"."
                    },
                    "scrapedAt": {
                      "type": "string",
                      "description": "When the result was produced (ISO 8601)."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "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": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      },
                      "description": "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": {
                      "type": "number",
                      "description": "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."
                    },
                    "topics": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true,
                        "properties": {
                          "rank": {
                            "type": "number",
                            "description": "Position on the list."
                          },
                          "word": {
                            "type": "string",
                            "description": "The topic. Pass it to search-posts to read the posts behind it."
                          },
                          "heat": {
                            "type": [
                              "number",
                              "null"
                            ],
                            "description": "Weibo’s heat score, exact."
                          },
                          "category": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Weibo’s category, such as 民生新闻."
                          },
                          "label": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "Weibo’s badge, such as 新 (new) or 热 (hot), or null."
                          },
                          "onListSince": {
                            "type": [
                              "string",
                              "null"
                            ],
                            "description": "When the topic joined the list (ISO 8601)."
                          },
                          "searchUrl": {
                            "type": "string",
                            "description": "The topic’s search page on Weibo."
                          },
                          "isPromoted": {
                            "type": "boolean",
                            "description": "True for a paid placement; only present in the list with includePromoted."
                          }
                        }
                      },
                      "description": "The list, in rank order."
                    },
                    "topicCount": {
                      "type": "number",
                      "description": "How many topics are in this response."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "transport": "weibo",
                      "skippedRecords": [],
                      "scrapedAt": "2026-10-15T15:24:48.000Z",
                      "notes": [
                        "2 paid placements were left out; includePromoted: true includes them."
                      ],
                      "pagesFetched": 1,
                      "topics": [
                        {
                          "rank": 1,
                          "word": "深圳全市全天禁鸣喇叭5年",
                          "heat": 1095555,
                          "category": "民生新闻",
                          "label": "新",
                          "onListSince": "2026-10-15T14:55:22.000Z",
                          "searchUrl": "https://s.weibo.com/weibo?q=%23%E6%B7%B1%E5%9C%B3%E5%85%A8%E5%B8%82%E5%85%A8%E5%A4%A9%E7%A6%81%E9%B8%A3%E5%96%87%E5%8F%AD5%E5%B9%B4%23",
                          "isPromoted": false
                        }
                      ],
                      "topicCount": 50
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/resolve-url": {
      "post": {
        "operationId": "resolve-url",
        "tags": [
          "Utilities"
        ],
        "summary": "Parse a Weibo link",
        "description": "Whether a Weibo address is a post, an account, a search or a topic, with its ids, canonical address and the route that reads it. Fetches nothing and costs no credit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "Any Weibo address: weibo.com, m.weibo.cn or s.weibo.com."
                  },
                  "format": {
                    "type": "string",
                    "description": "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.",
                    "example": "json"
                  },
                  "timeoutMs": {
                    "type": "integer",
                    "description": "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."
                  }
                },
                "additionalProperties": false,
                "required": [
                  "url"
                ]
              },
              "examples": {
                "default": {
                  "value": {
                    "url": "https://weibo.com/1642634100"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "description": "post, user, search, topic or unknown."
                    },
                    "postId": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The post’s numeric id, for a post."
                    },
                    "shortId": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The id in the post link, for a post."
                    },
                    "userId": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The account’s numeric id, when the link names one."
                    },
                    "handle": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The custom address, for weibo.com/<name>."
                    },
                    "screenName": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The display name, for a weibo.com/n/<name> link."
                    },
                    "query": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The search term or topic, for a search or topic link."
                    },
                    "canonicalUrl": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The canonical address."
                    },
                    "route": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "The route that reads it, such as user-profile."
                    },
                    "notes": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "What to do with a link that is not one of the above."
                    }
                  },
                  "additionalProperties": false
                },
                "examples": {
                  "default": {
                    "value": {
                      "skippedRecords": [],
                      "kind": "user",
                      "postId": null,
                      "shortId": null,
                      "userId": "1642634100",
                      "handle": null,
                      "screenName": null,
                      "query": null,
                      "canonicalUrl": "https://weibo.com/u/1642634100",
                      "route": "user-profile",
                      "notes": []
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    },
    "/media": {
      "get": {
        "operationId": "media",
        "tags": [
          "Utilities"
        ],
        "summary": "Download a photo or video",
        "description": "Delivers one photo or video from a post: what every media asset’s downloadUrl points at. It opens anywhere, unlike Weibo’s own link, and supports Range requests so players can seek and downloads can resume. Each request costs 1 credit, a range request included.",
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "A Weibo image or video link, as a media asset’s url names it (downloadUrl already carries it). Only Weibo’s own media links; anything else is a 400. A link that has expired is a 404: read the post again for a fresh one.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "filename",
            "in": "query",
            "required": false,
            "description": "Offer the file as a download with this name.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response",
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "description": "invalid_input: the request needs fixing; error names the field.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "unauthorized: the API key is missing or not valid.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "402": {
            "description": "insufficient_credits: no credits, trial or monthly allowance left.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "forbidden: this key or account is not allowed this request.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "quota_exceeded: a request-rate limit was reached.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "temporarily_unavailable, time_limit or (on a store route) store_unreachable: ask again (with time_limit, allow more time). Retryable.",
            "headers": {
              "X-Request-Id": {
                "description": "The request id, equal to requestId in the body.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "security": [
          {
            "BearerAuth": []
          }
        ]
      }
    }
  }
}