{
  "openapi": "3.0.1",
  "info": {
    "title": "Weibo Scraper 微博 - Posts, Comments, Profiles & Hot Search",
    "description": "Scrape Weibo (微博) without login: paste any post, profile, search or topic link and run, or search keywords. Hashtags, the live hot search board and Black Cat (黑猫投诉) complaints. Likes, comments, reposts, media, region, author, ad filter, lexicon sentiment, only-new mode. Error rows are free.",
    "version": "0.1",
    "x-build-id": "ESJPS7vZChBTpe4Rb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~weibo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-weibo-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/scrapewise~weibo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-weibo-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/scrapewise~weibo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-weibo-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "startUrls": {
            "title": "Weibo links (paste and run)",
            "type": "array",
            "description": "Weibo links or plain keywords, one per line. Accepted: post links (m.weibo.cn/detail/5343350941032693, weibo.com/<uid>/<bid>), profile links (weibo.com/u/1749127163), search pages (s.weibo.com/weibo?q=...), #topic# pages, the hot search board (s.weibo.com/top/summary) and Black Cat company pages (tousu.sina.com.cn/company/view/?couid=...). Links can be mixed: each one is read in its own mode, so you do not need to set 'Mode'. A plain word is searched as a keyword. When this field has entries, the keyword, hashtag, profile and post fields below are ignored. Empty by default.",
            "items": {
              "type": "string"
            }
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "search",
              "user",
              "posts",
              "hashtag",
              "hot",
              "profiles",
              "topics",
              "hot_posts",
              "complaints",
              "profile_only"
            ],
            "type": "string",
            "description": "What to scrape when 'Weibo links' is empty. Default 'search'. search: posts for each keyword, read from eleven Weibo search tabs and deduplicated (about 120 to 135 per keyword). user: a profile row plus the public posts of each profile. profile_only: just the profile row. posts: one post per URL or id. hashtag: the public timeline of each topic. hot: the live hot search board (热搜), 60 to 85 topics. profiles: accounts that match a keyword. topics: #topics# that match a keyword, with discussions and reads. hot_posts: the hot timeline. complaints: Black Cat (黑猫投诉) complaints per company. If you leave 'search' but fill another field (hashtags, profiles, post URLs), the Actor follows the field you filled.",
            "default": "search"
          },
          "searchQuery": {
            "title": "Search keyword",
            "type": "string",
            "description": "One keyword for 'search', 'profiles' and 'topics' modes, in Chinese (小米) or Latin script (Tesla). In 'search' it returns up to 'Max items' posts merged from eleven search tabs. Empty by default; with an empty input the Actor uses 小米."
          },
          "searchQueries": {
            "title": "More search keywords (optional)",
            "type": "array",
            "description": "More keywords, one per line, for the same modes as 'Search keyword' (for example 特斯拉 and Tesla to cover a brand in both scripts). Each keyword returns up to 'Max items' items. Posts found by two keywords are delivered and charged once.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags or topics",
            "type": "array",
            "description": "For 'hashtag' mode: topic names with or without the # marks, one per line (小米18 or #小米18#). Each topic returns up to 'Max items' posts from its public timeline, usually 25 to 40 because Weibo serves logged out visitors one page per list.",
            "items": {
              "type": "string"
            }
          },
          "userIds": {
            "title": "Profiles (uid, URL or display name)",
            "type": "array",
            "description": "For 'user' and 'profile_only' modes: numeric uid (1749127163), profile link (weibo.com/u/1749127163 or m.weibo.cn/u/1749127163) or display name (小米公司), one per line. A display name is resolved through Weibo's public account search. Each profile gives one profile row (when 'Profile row in user mode' is on) plus about 10 to 12 recent posts.",
            "items": {
              "type": "string"
            }
          },
          "postUrls": {
            "title": "Post URLs or ids",
            "type": "array",
            "description": "For 'posts' mode: post links (m.weibo.cn/detail/<id>, weibo.com/<uid>/<bid>), numeric ids (5343350941032693) or short bids (RibKS4kEl), one per line. Each line returns one post row with full text and stats; a deleted or hidden post returns a free row with errorCode POST_NOT_FOUND.",
            "items": {
              "type": "string"
            }
          },
          "publishedAfter": {
            "title": "Published after",
            "type": "string",
            "description": "Keep only posts published on or after this day, format YYYY-MM-DD (2026-10-01). DD/MM/YYYY and MM/DD/YYYY are read when the day is above 12. It filters what Weibo returns and cannot make Weibo serve older posts. A date that cannot be read returns one free row with errorCode INVALID_DATE. Empty means no lower limit."
          },
          "publishedBefore": {
            "title": "Published before",
            "type": "string",
            "description": "Keep only posts published on or before this day (inclusive), format YYYY-MM-DD. Same formats and same caveat as 'Published after': it filters, it does not dig into history. Empty means no upper limit."
          },
          "includeComments": {
            "title": "Public comments",
            "type": "boolean",
            "description": "Off by default. When on, adds the public comments of each post as rows with type 'comment': text, date, likes, reply count, region and the commenter's display name (never their id, link or picture). Each comment is one charged item, so 20 comments on 30 posts add 600 items.",
            "default": false
          },
          "maxCommentsPerPost": {
            "title": "Max comments per post",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Comments taken per post when 'Public comments' is on. Default 20, maximum 1,000. Up to 20 the Actor reads the first comment page of the mobile site. Above 20 it pages through the post's full list on weibo.com, hottest first and then newest, without duplicates, at about 2 to 4 seconds per 20 comments. Every comment is one item: 200 comments on 10 posts are 2,000 items.",
            "default": 20
          },
          "includeReplies": {
            "title": "Replies to comments",
            "type": "boolean",
            "description": "Off by default; needs 'Public comments' on. Adds the public replies (楼中楼) under each comment, right below it, as comment rows with parentCommentId set to the comment they answer. Same privacy rule as comments (display name only). Each reply is one charged item.",
            "default": false
          },
          "maxRepliesPerComment": {
            "title": "Max replies per comment",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Replies taken under each comment when 'Replies to comments' is on. Default 20, maximum 200. Worst case per post is 'Max comments per post' x (1 + this number) items, so keep it low (3 to 5) on busy posts.",
            "default": 20
          },
          "includeProfile": {
            "title": "Profile row in user mode",
            "type": "boolean",
            "description": "On by default. In 'user' mode, adds one row with type 'profile' per account: followers, following, post count, bio, verification badge and avatar. The row is one charged item; turn it off if you only want the posts.",
            "default": true
          },
          "includeLongText": {
            "title": "Full text of long posts",
            "type": "boolean",
            "description": "On by default. Weibo cuts long posts in lists; when on, each truncated post is opened once so 'text' holds the full text. No extra charge, slightly longer runs. Turn it off only if you need speed and the first 140 characters are enough.",
            "default": true
          },
          "adFilter": {
            "title": "Promoted posts",
            "enum": [
              "all",
              "organic_only",
              "promo_only"
            ],
            "type": "string",
            "description": "Default 'all': every post is kept and carries isPromoted (true when Weibo serves it as a paid placement with its 广告 label). 'organic_only' drops promoted posts, useful for engagement studies. 'promo_only' keeps only them, to see which brands buy reach. Dropped posts are not charged.",
            "default": "all"
          },
          "sentiment": {
            "title": "Sentiment (lexicon, no AI)",
            "type": "boolean",
            "description": "Off by default. Adds sentiment (positive, neutral or negative), sentimentScore (-1 to 1) and sentimentTerms (the words that counted) to every post and comment row. Computed inside the Actor from a Simplified Chinese word list with negation and intensifiers: no AI model, no extra charge. It misses irony; in a check of 20 posts it agreed with a human reading on 15. Use it to triage, not to judge one post.",
            "default": false
          },
          "hotCategory": {
            "title": "Hot timeline categories (optional)",
            "type": "array",
            "description": "Only for 'hot_posts'. One or more hot timeline channels, one per line: 社会 (society), 科技 (tech), 明星 (celebrity), 电影 (movies), 音乐 (music), 情感 (relationships), 时尚 (fashion), 美妆 (beauty), 榜单 (ranking), 同城 (local). Chinese names and the English words both work. Each channel returns about 15 to 20 posts and 'Max items' applies per channel. An unknown name returns a free INVALID_CATEGORY row listing the valid ones. Empty means the general hot timeline.",
            "items": {
              "type": "string"
            }
          },
          "complaintCompanies": {
            "title": "Black Cat companies (optional)",
            "type": "array",
            "description": "Only for 'complaints'. Company or brand names as Black Cat shows them (小米, 京东, 美团), a numeric company id (couid) or a company link such as https://tousu.sina.com.cn/company/view/?couid=1003627, one per line. 'Max items' applies per company. A name with no match returns a free COMPANY_NOT_FOUND row. Empty means the newest complaints on the Black Cat home feed, all companies.",
            "items": {
              "type": "string"
            }
          },
          "complaintStatus": {
            "title": "Black Cat complaint status",
            "enum": [
              "latest",
              "replied",
              "completed"
            ],
            "type": "string",
            "description": "Only for 'complaints' with companies listed. Default 'latest' (newest complaints). 'replied' reads complaints the company answered but did not resolve; 'completed' reads resolved ones. Ignored for the home feed.",
            "default": "latest"
          },
          "compareWithPreviousRun": {
            "title": "Only what changed since the previous run",
            "type": "boolean",
            "description": "Off by default. In 'search' and 'hashtag' mode: delivers and charges only posts that no previous run with the same 'Snapshot name' delivered (tagged trend 'new'); ids are kept in a key-value store in your own account, up to 20,000 per keyword. The first run delivers everything. In 'hot' mode: tags each topic new, up, down or same with previousRank, rankChange and heatChange, and adds one 'dropped' row per topic that left the board (charged like a topic). Use it with a schedule.",
            "default": false
          },
          "snapshotName": {
            "title": "Snapshot name",
            "type": "string",
            "description": "Only with 'Only what changed since the previous run'. A name that keeps separate histories for separate schedules, for example tesla-daily or hot-hourly. Letters, numbers and hyphens. Empty uses the default history."
          },
          "maxItems": {
            "title": "Max items",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Default 30, maximum 5,000. Maximum items per keyword, hashtag, profile, hot timeline channel or Black Cat company; for 'posts' and 'hot' it is the run total. Comments and replies count toward it. One keyword returns at most about 120 to 135 distinct posts, because Weibo serves logged out visitors one page per tab; add keywords for more volume. You pay per item delivered.",
            "default": 30
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Default: Apify datacenter proxy, which works for Weibo. A blocked request is retried on a new IP with a new visitor session, up to six times, with residential IPs as a reserve after three blocked datacenter attempts. Change it only if you see BLOCKED rows.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}