{
  "openapi": "3.0.1",
  "info": {
    "title": "Weibo Scraper — Posts, Comments, Profiles & Hot Search",
    "description": "Scrape Sina Weibo: keyword and date-range search, #topics# with read counts, hot search boards, posts, comments, likers, profiles, fans, KOL discovery and Black Cat complaints. 14 modes in one actor, structured JSON, change tracking. No account or cookie needed.",
    "version": "1.0",
    "x-build-id": "Ha0Ypz3WRb8vgc8pJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insights_data~weibo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insights_data-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/insights_data~weibo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-insights_data-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/insights_data~weibo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-insights_data-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": {
          "mode": {
            "title": "🚀 What to scrape",
            "enum": [
              "auto",
              "search",
              "topic",
              "hot_search",
              "hot_search_delta",
              "hot_timeline",
              "post_details",
              "post_comments",
              "post_likers",
              "user_profile",
              "user_posts",
              "user_fans",
              "user_followings",
              "kol_discovery",
              "complaints"
            ],
            "type": "string",
            "description": "Auto: every entry below is handled by its type — a keyword runs a post search, a #topic# runs topic search with topic stats, a post link returns post details, a profile link or numeric user ID returns the profile, a Black Cat link returns complaints, a hot-search link returns the hot boards. Pick a mode to apply one job to the whole list (for example the comments, likers or fans of every link). Hot boards, hot feed and complaints need no entries at all.",
            "default": "auto"
          },
          "urls": {
            "title": "🔗 Weibo links, IDs or keywords",
            "type": "array",
            "description": "One entry per line, as many as you like. Accepted: keywords (人工智能, Tesla), #topics# (#人工智能#), search pages (s.weibo.com/weibo?q=…), post links (weibo.com/<uid>/<code>, m.weibo.cn/detail/<id>, m.weibo.cn/status/<id>), numeric post IDs, short codes (in the post modes), profile links (weibo.com/u/<id>, m.weibo.cn/u/<id>), numeric user IDs, Black Cat company links (tousu.sina.com.cn/company/view/?couid=…). With the hot-board mode you can list board names (realtime, topics, entertainment …); with the hot-feed mode, category names (热门, 科技 …). Custom profile addresses like weibo.com/name are not resolved — use the numeric /u/ link.",
            "items": {
              "type": "string"
            }
          },
          "maxResults": {
            "title": "💯 Max results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Search, topic, hot feed and complaints: posts/complaints per run. User posts, likers, fans, followings: per user or post. Post details: posts per run. Free plan users are limited to 10 items per run; paid plans have no limit.",
            "default": 10
          },
          "includeComments": {
            "title": "💬 Also collect comments of each post",
            "type": "boolean",
            "description": "Search, topic, hot feed, post details and user posts: also pull each post's comment thread, one row per comment (linked by postId). Posts with no comments are skipped without a request.",
            "default": false
          },
          "maxComments": {
            "title": "🧮 Max comments per post",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Top-level comments per post (comments mode and the option above). Free plan users are limited to 10 items per run; paid plans have no limit.",
            "default": 10
          },
          "includeReplies": {
            "title": "🧵 Include replies to comments",
            "type": "boolean",
            "description": "Also collect the reply thread under each comment. Turns comment collection on in the post modes.",
            "default": false
          },
          "maxRepliesPerComment": {
            "title": "🪃 Max replies per comment",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Replies collected under each comment. Free plan users are limited to 10 items per run; paid plans have no limit.",
            "default": 1
          },
          "commentSort": {
            "title": "🔀 Comment order",
            "enum": [
              "hot",
              "time"
            ],
            "type": "string",
            "description": "Hot: the order Weibo shows by default. Newest: most recent first.",
            "default": "hot"
          },
          "searchType": {
            "title": "📂 Search results tab",
            "enum": [
              "realtime",
              "all",
              "hot",
              "video",
              "images"
            ],
            "type": "string",
            "description": "Which Weibo search tab to read for keyword and topic search.",
            "default": "realtime"
          },
          "searchDateFrom": {
            "title": "📅 Posted from",
            "type": "string",
            "description": "Earliest post date. Pick an absolute date (e.g. 2026-09-01, from 00:00 Beijing time) or a relative one counted from the run start (e.g. 7 days, 2 weeks ago). Applies to search, topic, KOL discovery and user posts. Empty = no lower limit."
          },
          "searchDateTo": {
            "title": "📆 Posted until",
            "type": "string",
            "description": "Latest post date. An absolute date includes that whole day (until 23:59:59 Beijing time); a relative date is counted from the run start (e.g. 1 day ago). Empty = now."
          },
          "sliceBy": {
            "title": "🍰 Spread over the window",
            "enum": [
              "auto",
              "day",
              "hour",
              "none"
            ],
            "type": "string",
            "description": "With a date window, split it into day or hour slices so results cover the whole period evenly instead of only its newest part. Auto picks for you.",
            "default": "auto"
          },
          "autoLocalize": {
            "title": "🈶 Also search Chinese brand names",
            "type": "boolean",
            "description": "A Latin brand name like Nike also searches its Chinese name (耐克); results are merged and deduplicated.",
            "default": true
          },
          "searchAliases": {
            "title": "🧩 Extra search variants",
            "type": "array",
            "description": "More spellings or names to search and merge with every keyword (e.g. 耐克, 特斯拉).",
            "items": {
              "type": "string"
            }
          },
          "strictQueryMatch": {
            "title": "🎯 Only posts that contain the keyword",
            "type": "boolean",
            "description": "Drop posts whose text (or quoted post) does not contain any search term. Every post row carries matchesQuery either way.",
            "default": false
          },
          "adFilter": {
            "title": "📣 Promoted posts",
            "enum": [
              "all",
              "organic_only",
              "promo_only"
            ],
            "type": "string",
            "description": "Every post carries isPromoted. Keep all, drop promoted posts, or keep only promoted posts. Filtered rows are not delivered and not charged.",
            "default": "all"
          },
          "maxScanned": {
            "title": "🔭 Max rows examined by filters",
            "minimum": 100,
            "maximum": 1000000,
            "type": "integer",
            "description": "When filters reject most rows, stop after examining this many.",
            "default": 20000
          },
          "hotBoards": {
            "title": "📶 Hot boards",
            "type": "array",
            "description": "Boards read in hot-board modes. All = every board Weibo offers right now.",
            "items": {
              "type": "string",
              "enum": [
                "realtime",
                "topics",
                "entertainment",
                "life",
                "social",
                "tech",
                "sports",
                "acg",
                "mine",
                "all"
              ],
              "enumTitles": [
                "Realtime hot search (热搜榜)",
                "Topic board (话题榜)",
                "Entertainment (文娱榜)",
                "Life (生活榜)",
                "Social (社会榜)",
                "Tech (科技榜)",
                "Sports (体育榜)",
                "ACG (动漫榜)",
                "Recommended for you",
                "All boards"
              ]
            },
            "default": [
              "realtime",
              "entertainment",
              "topics"
            ]
          },
          "hotTimelineCategories": {
            "title": "📰 Hot feed categories",
            "type": "array",
            "description": "Hot-feed categories, as Weibo names them (热门, 科技, 财经, 股市, 社会 …). Unknown names are skipped with the live list in the log.",
            "default": [
              "热门"
            ],
            "items": {
              "type": "string"
            }
          },
          "complaintTab": {
            "title": "😾 Complaint list",
            "enum": [
              "latest",
              "hot",
              "replied",
              "completed"
            ],
            "type": "string",
            "description": "Which Black Cat list to read.",
            "default": "latest"
          },
          "includeAuthorProfiles": {
            "title": "🪪 Author profile rows",
            "type": "boolean",
            "description": "In post modes, add one profile row per distinct post author (followers, bio, verification, location, influence badges).",
            "default": false
          },
          "maxAuthorProfiles": {
            "title": "👥 Max author profiles",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Cap on author profile rows per run. Free plan users are limited to 10 items per run; paid plans have no limit.",
            "default": 50
          },
          "backfillAuthors": {
            "title": "🧬 Complete author fields on posts",
            "type": "boolean",
            "description": "Fill author followers, location, bio and total interactions on post rows when the post itself does not carry them (one profile lookup per distinct author).",
            "default": true
          },
          "fetchFullText": {
            "title": "📜 Full text of long posts",
            "type": "boolean",
            "description": "Weibo cuts long posts at about 140 characters in lists; this fetches the full text.",
            "default": true
          },
          "sentimentAnalysis": {
            "title": "😊 Sentiment",
            "type": "boolean",
            "description": "Add a sentiment object (polarity + score from -1 to 1) to every post, comment and complaint, scored for Chinese text.",
            "default": false
          },
          "geoRollup": {
            "title": "🌏 Province rollup",
            "type": "boolean",
            "description": "Add one row per province / country with post count, share, promoted count and average sentiment, from the location Weibo attaches to each post. Needs at least 50 located posts.",
            "default": false
          },
          "includeUnavailableRows": {
            "title": "🚫 Rows for unavailable posts",
            "type": "boolean",
            "description": "Post details: add a status row for posts that are deleted or hidden, with the reason.",
            "default": false
          },
          "maxKols": {
            "title": "🏆 Max creators (KOL discovery)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Creators returned by KOL discovery, ranked by relevance and reach. Free plan users are limited to 10 items per run; paid plans have no limit.",
            "default": 30
          },
          "minFollowers": {
            "title": "📈 Min followers",
            "minimum": 0,
            "type": "integer",
            "description": "Skip creators with fewer followers.",
            "default": 0
          },
          "verifiedOnly": {
            "title": "✅ Verified creators only",
            "type": "boolean",
            "description": "Keep only verified accounts.",
            "default": false
          },
          "kolMetrics": {
            "title": "📐 Engagement metrics",
            "type": "boolean",
            "description": "User profiles and KOL discovery: average reposts, comments, likes, engagement rate and posting frequency over recent posts.",
            "default": true
          },
          "deltaMode": {
            "title": "🆕 Only new rows",
            "type": "boolean",
            "description": "Return only rows that no earlier run with the same monitoring key delivered (posts, comments, complaints, fans, likers). Ideal for scheduled monitoring.",
            "default": false
          },
          "deltaStateKey": {
            "title": "🔑 Monitoring key",
            "type": "string",
            "description": "Name of the tracking stream. Use different keys (e.g. nike-daily, hourly-hot) for independent monitors.",
            "default": "default"
          },
          "followUpComments": {
            "title": "⏰ Follow-up comments",
            "type": "boolean",
            "description": "Keyword search with Only new rows: a later run re-reads the comment threads of posts delivered earlier, once, when they are 1 to 7 days old, and returns comments not delivered before (isFollowUp = true).",
            "default": false
          },
          "concurrency": {
            "title": "⚡ Parallel requests",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Requests in flight at once. Higher is faster but Weibo rate-limits sooner.",
            "default": 3
          },
          "requestDelay": {
            "title": "⏳ Delay between requests",
            "minimum": 0,
            "maximum": 30,
            "type": "number",
            "description": "Seconds to pause after each request (random jitter added).",
            "default": 0.6
          },
          "maxRetries": {
            "title": "🔁 Retries per request",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Attempts per request before it is given up.",
            "default": 3
          },
          "siteSelfCheck": {
            "title": "🩺 Site self-check",
            "type": "boolean",
            "description": "Check at the start whether Weibo changed its site and name the affected modes in the log.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy",
            "type": "object",
            "description": "Default: no proxy. If Weibo blocks or rate-limits the requests, the run switches to a datacenter proxy, then to a residential proxy (with fresh IPs on retry) and keeps it for the rest of the run.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}