{
  "openapi": "3.0.1",
  "info": {
    "title": "Weibo Scraper - Search, Accounts, Comments & Hot List",
    "description": "Weibo scraper (微博): search posts, read an account's posts and profile, pull comments, or take the hot lists and trending feed. One row per post, comment, profile or topic: text, author, followers, likes, reposts, pictures and place. A search gives the 50 to 90 posts Weibo shows without signing in.",
    "version": "0.1",
    "x-build-id": "0lEWY1HigQ934LUS8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~weibo-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-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/dami_studio~weibo-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-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/dami_studio~weibo-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-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": {
          "searchTerms": {
            "title": "Search terms",
            "maxItems": 100,
            "type": "array",
            "description": "Words to search Weibo for, one per line, in Chinese or any other language. Weibo shows people who aren't signed in the first page of each of its five result tabs (top, latest, hot, video, pictures), which usually comes to 50 to 90 different posts per search. Up to 100 searches a run.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerSearch": {
            "title": "Posts per search",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Stop a search after this many posts. Weibo rarely has more than about 90 to show for one search, so a higher number returns what there is.",
            "default": 50
          },
          "matchAllWords": {
            "title": "Only posts that contain every word",
            "type": "boolean",
            "description": "Weibo's search also returns posts that match only part of a phrase, or match on a picture. On: a post is kept only when its text, the post it reposts or its topic card contains every word you searched (words are split on spaces, so 蔚来汽车 is one word and 蔚来 汽车 is two). Off: everything Weibo's search returns. Posts left out are never charged.",
            "default": true
          },
          "users": {
            "title": "Accounts",
            "maxItems": 100,
            "type": "array",
            "description": "Accounts to read, one per line: the numeric id (1749127163), a profile link (weibo.com/u/1749127163, weibo.com/n/雷军, weibo.com/rmrb, m.weibo.cn/u/1749127163) or the screen name, with or without @. Weibo shows people who aren't signed in an account's latest ten or so posts plus the latest of each kind (original, video, photo, article), usually 25 to 35 posts in all.",
            "items": {
              "type": "string"
            }
          },
          "maxPostsPerUser": {
            "title": "Posts per account",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Stop an account after this many posts, newest first.",
            "default": 30
          },
          "includeProfiles": {
            "title": "Profile row for each account",
            "type": "boolean",
            "description": "Also return one row per account: followers, following, post count, the bio as written, the verified label and its reason, the place on the profile and the avatar. Each profile row is charged like one post.",
            "default": false
          },
          "accountSearchTerms": {
            "title": "Find accounts by keyword",
            "maxItems": 100,
            "type": "array",
            "description": "Keywords to look for accounts, one per line. Weibo shows people who aren't signed in about 20 accounts per keyword. Each account comes back as a profile row, charged like one post.",
            "items": {
              "type": "string"
            }
          },
          "maxAccountsPerSearch": {
            "title": "Accounts per keyword",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Stop a keyword after this many accounts.",
            "default": 20
          },
          "topicSearchTerms": {
            "title": "Topic search",
            "maxItems": 100,
            "type": "array",
            "description": "Words to find Weibo topics (#话题#) by, one per line. Each topic comes back as a row with its read count and discussion count. Weibo shows people who aren't signed in up to 10 topics per term. A topic from topic search is charged like a hot topic, and a topic two of your terms find is charged once.",
            "items": {
              "type": "string"
            }
          },
          "suggestionTerms": {
            "title": "Search suggestions",
            "maxItems": 100,
            "type": "array",
            "description": "Words to get Weibo's search suggestions for, one per line, usually 40 to 50 per term. They are saved as one record, SUGGESTIONS, in the run's key-value store, not in the dataset, and they are not charged.",
            "items": {
              "type": "string"
            }
          },
          "trendingPosts": {
            "title": "Trending posts",
            "type": "boolean",
            "description": "Return the posts Weibo shows as trending right now (its 热门 feed). It is what Weibo picks at the time of the run, not an archive. Charged as posts.",
            "default": false
          },
          "maxTrendingPosts": {
            "title": "Trending posts to return",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Stop the trending feed after this many posts.",
            "default": 50
          },
          "postUrls": {
            "title": "Posts for comments",
            "maxItems": 100,
            "type": "array",
            "description": "Posts whose comments you want, one per line: the post's link (weibo.com/2803301701/RkyFjzhSX, m.weibo.cn/detail/5348998178410235) or its id. Each post also comes back as a post row, charged as a post.",
            "items": {
              "type": "string"
            }
          },
          "maxCommentsPerPost": {
            "title": "Comments per post",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Stop a post after this many comments. Replies, when you ask for them, come on top of this.",
            "default": 100
          },
          "commentsOrder": {
            "title": "Comments order",
            "enum": [
              "newest",
              "hot"
            ],
            "type": "string",
            "description": "Newest first goes through every comment Weibo lists, latest at the top. Hot follows Weibo's ranking, which ends after about 300 comments.",
            "default": "newest"
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Also return the replies under each comment, as comment rows with parentCommentId set. Each reply is charged as a comment.",
            "default": false
          },
          "maxRepliesPerComment": {
            "title": "Replies per comment",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Weibo lists up to about 100 replies under one comment to people who aren't signed in.",
            "default": 20
          },
          "includeComments": {
            "title": "Comments for the posts found",
            "type": "boolean",
            "description": "Also return the comments under every post that your searches and accounts return, up to the number below for each post. Each comment is charged as a comment. Comments order and replies follow the settings above.",
            "default": false
          },
          "maxCommentsPerFoundPost": {
            "title": "Comments per found post",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "The most comments for each post a search or account found.",
            "default": 20
          },
          "hotList": {
            "title": "Hot search list",
            "type": "boolean",
            "description": "Return Weibo's real-time hot search list: about 50 ranked topics with their heat figure and category, plus the pinned topic above them. The promoted slot in the list is left out.",
            "default": false
          },
          "hotListCategories": {
            "title": "Category hot lists",
            "type": "array",
            "description": "Also return these hot lists, about 50 ranked topics each, with their heat figure. Charged as hot topics.",
            "items": {
              "type": "string",
              "enum": [
                "entertainment",
                "society"
              ],
              "enumTitles": [
                "Entertainment (文娱)",
                "Society (社会)"
              ]
            }
          },
          "postedAfter": {
            "title": "Posted after",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2}))?|\\d{1,4} ?(day|days|hour|hours))$",
            "type": "string",
            "description": "Keep only posts from searches, accounts and the trending feed posted after this: a day (2026-10-01, midnight UTC), a time with its zone (2026-10-01T08:00:00+08:00) or a span back from now (3 days, 12 hours). It narrows the 50 to 90 posts a search brings; it can't reach older posts. Posts left out are not charged."
          },
          "postedBefore": {
            "title": "Posted before",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:\\d{2}))?|\\d{1,4} ?(day|days|hour|hours))$",
            "type": "string",
            "description": "Keep only posts posted before this, in the same formats as Posted after."
          },
          "originalsOnly": {
            "title": "Original posts only",
            "type": "boolean",
            "description": "Leave out reposts. Posts left out by any filter here are not charged, and RUN_REPORT counts them.",
            "default": false
          },
          "verifiedOnly": {
            "title": "Verified authors only",
            "type": "boolean",
            "description": "Keep only posts whose author carries Weibo's verified label.",
            "default": false
          },
          "hasPictures": {
            "title": "Only posts with pictures",
            "type": "boolean",
            "description": "Keep only posts with at least one picture.",
            "default": false
          },
          "hasVideo": {
            "title": "Only posts with a video",
            "type": "boolean",
            "description": "Keep only posts with a video.",
            "default": false
          },
          "hasLink": {
            "title": "Only posts with an outside link",
            "type": "boolean",
            "description": "Keep only posts that link outside Weibo.",
            "default": false
          },
          "onlyNewSinceLastRun": {
            "title": "Only rows not returned before",
            "type": "boolean",
            "description": "For scheduled runs: leave out posts and comments that an earlier run with the same saved state name already returned. They are not charged. Needs a saved state name.",
            "default": false
          },
          "stateName": {
            "title": "Saved state name",
            "type": "string",
            "description": "A name of your choice, such as coffee-daily (letters, digits and hyphens). The run keeps what it returned in a key-value store on your account called weibo-scraper-<name>, and the next run with the same name reads it. With a hot list, it also keeps the list, so each topic gets rankChange, isNew, isRising and peakRank against the last run."
          },
          "fullText": {
            "title": "Full text of long posts",
            "type": "boolean",
            "description": "Weibo cuts long posts short in its lists. On: the whole text is fetched for each one. Off: those rows carry the shortened text, with textIsComplete set to false.",
            "default": true
          },
          "includeSentiment": {
            "title": "Tag the mood of posts and comments",
            "type": "boolean",
            "description": "Adds sentiment (positive, neutral or negative) to each post and comment. It is a word-list estimate for Chinese text: it misses sarcasm and slang it doesn't know. No extra charge.",
            "default": false
          },
          "includeRaw": {
            "title": "Include the original Weibo data",
            "type": "boolean",
            "description": "Adds raw to each row: the object Weibo sent for that post, comment, topic or account, as it came. Rows get much bigger. No extra charge.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}