{
  "openapi": "3.0.1",
  "info": {
    "title": "Bilibili Scraper - Videos, Comments, Channels & Stats",
    "description": "Scrape Bilibili (哔哩哔哩) videos by keyword (sort newest first, date filters), channel uploads, video URLs or trending by category, plus full comment threads with replies: views, likes, coins, danmaku, tags. No login. US$ 10 per 1,000 videos or comments.",
    "version": "0.1",
    "x-build-id": "YOBc2agInSStmHdCe"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapewise~bilibili-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapewise-bilibili-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~bilibili-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapewise-bilibili-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~bilibili-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapewise-bilibili-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": "Mode",
            "enum": [
              "search",
              "video_detail",
              "video_comments",
              "user_videos",
              "user_profile",
              "popular",
              "danmaku"
            ],
            "type": "string",
            "description": "What to scrape. Same mode names as other Bilibili scrapers, so you can switch without changing your integration. 'video_comments' returns the comments of each video in 'videoUrls', paged past the first page (up to 'Max comments per video'). 'user_profile' returns one row per channel in 'userIds' with followers, following, video count, total likes, level and official verification.",
            "default": "search"
          },
          "searchQuery": {
            "title": "Search keyword",
            "type": "string",
            "description": "Keyword for 'search' mode. Chinese (原神) and English (minecraft) both work."
          },
          "searchQueries": {
            "title": "More search keywords (optional)",
            "type": "array",
            "description": "Extra keywords for 'search' mode. Each keyword gets up to 'Max results' videos; duplicates across keywords are removed.",
            "items": {
              "type": "string"
            }
          },
          "searchAliases": {
            "title": "Search aliases (optional)",
            "type": "array",
            "description": "Other spellings of 'Search keyword' to search too and merge, for example the Chinese name of a brand (耐克 for Nike). Duplicates are removed and 'Max results' applies to the keyword and its aliases together, not to each one.",
            "items": {
              "type": "string"
            }
          },
          "sortOrder": {
            "title": "Sort order (search)",
            "enum": [
              "totalrank",
              "click",
              "pubdate",
              "dm",
              "stow",
              "scores"
            ],
            "type": "string",
            "description": "How Bilibili sorts search results.",
            "default": "totalrank"
          },
          "durationFilter": {
            "title": "Duration (search)",
            "enum": [
              "any",
              "short",
              "medium",
              "long",
              "verylong"
            ],
            "type": "string",
            "description": "Filter search results by video length.",
            "default": "any"
          },
          "pubtimeBegin": {
            "title": "Published after (search)",
            "type": "string",
            "description": "YYYY-MM-DD, China time. Leave empty for no filter. Also accepts DD/MM/YYYY and MM/DD/YYYY when the day is above 12; a date it cannot read returns one item with errorCode INVALID_DATE instead of failing the run."
          },
          "pubtimeEnd": {
            "title": "Published before (search)",
            "type": "string",
            "description": "YYYY-MM-DD, China time, inclusive. Leave empty for no filter. Also accepts DD/MM/YYYY and MM/DD/YYYY when the day is above 12; a date it cannot read returns one item with errorCode INVALID_DATE instead of failing the run."
          },
          "videoUrls": {
            "title": "Video URLs or IDs",
            "type": "array",
            "description": "For 'video_detail', 'video_comments' and 'danmaku' modes: bilibili.com/video URLs, b23.tv short links, BV ids (BV1P4YX63Eej) or av ids (av117257959120137).",
            "items": {
              "type": "string"
            }
          },
          "userIds": {
            "title": "Channel IDs or URLs",
            "type": "array",
            "description": "For 'user_videos' and 'user_profile' modes: the creator's numeric id (mid) or channel URL (space.bilibili.com/546195). 'user_videos' returns the full upload list, newest first, up to 'Max results' per channel; 'user_profile' returns one row per channel.",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "title": "Category (popular mode)",
            "enum": [
              "all",
              "animation",
              "music",
              "dance",
              "game",
              "knowledge",
              "tech",
              "sports",
              "car",
              "life",
              "food",
              "animal",
              "fashion",
              "entertainment",
              "kichiku",
              "cinephile",
              "ranking"
            ],
            "type": "string",
            "description": "For 'popular' mode: 'All' is the general trending board, as before. A category returns Bilibili's own ranking for that zone (up to 100 videos, with 'rankPosition' and 'rankScore'). The zone number also works (for example 4 for gaming).",
            "default": "all"
          },
          "includeDetails": {
            "title": "Full stats and tags",
            "type": "boolean",
            "description": "Search, channel and trending lists do not include coins, shares or tags. When on, each video is opened to add them. Same price.",
            "default": true
          },
          "includeSubtitles": {
            "title": "Subtitles when public",
            "type": "boolean",
            "description": "Adds the video's subtitles when Bilibili serves them without login. Bilibili now hides most subtitles (including AI subtitles) behind login, so expect this to be empty for most videos; 'subtitleStatus' tells you why. Same price.",
            "default": false
          },
          "includeComments": {
            "title": "Comments of every video",
            "type": "boolean",
            "description": "In search, channel, trending and video-detail modes, also returns the comments of each video found, one row per comment ('type': 'comment', linked by 'videoBvid'), right after the video. Up to 'Max comments per video'. Each comment row is one charged result. Off by default.",
            "default": false
          },
          "maxComments": {
            "title": "Max comments per video",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Most comment rows per video (top-level comments plus replies, when replies are on), for 'video_comments' mode and 'Comments of every video'. Bilibili serves 20 per page; this Actor keeps paging until it reaches this number.",
            "default": 20
          },
          "sortComments": {
            "title": "Comment order",
            "enum": [
              "hot",
              "time",
              "likes"
            ],
            "type": "string",
            "description": "'Newest first' is the way to monitor new comments on a video. 'Most liked first' reads the hot order and sorts what it read by likes.",
            "default": "hot"
          },
          "includeReplies": {
            "title": "Include replies",
            "type": "boolean",
            "description": "Each reply becomes its own comment row with 'isThreadReply' true and 'rootCommentId', so you can rebuild the threads. Replies count toward 'Max comments per video'.",
            "default": false
          },
          "includeDanmaku": {
            "title": "Danmaku reaction profile per video",
            "type": "boolean",
            "description": "Adds one 'danmaku_profile' row per video in any mode: danmaku fetched, unique senders (a count only, never who), danmaku per minute, the peak minute and its count, first and last timestamps, and a sample of texts spread across the timeline. Charged per profile, separately from the video. No login.",
            "default": false
          },
          "danmakuSampleSize": {
            "title": "Danmaku texts in each profile",
            "minimum": 0,
            "maximum": 500,
            "type": "integer",
            "description": "How many danmaku texts the profile carries, spread evenly across the video. 0 returns only the numbers. Does not add billable rows.",
            "default": 25
          },
          "maxDanmakuPerVideo": {
            "title": "Max danmaku per video (danmaku mode)",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "For 'danmaku' mode: the most danmaku rows per video (all parts together), ordered by the second of the video they appear at. Short videos usually have 500 to 3,000; long ones tens of thousands.",
            "default": 1000
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Maximum videos per keyword or per channel. For 'video_detail' and 'popular' it is the run total. Bilibili stops one search at 1,000 results (about 770 distinct videos); above that, and when you set no date filter, the Actor asks the same keyword again for 30-day windows, newest first, until it reaches this number.",
            "default": 30
          },
          "onlyNewVideos": {
            "title": "Only new videos (for schedules)",
            "type": "boolean",
            "description": "Remembers the videos already delivered for each keyword, channel and the trending board (in a named Key-Value Store in your account, 'bilibili-scraper-only-new-videos') and returns, and charges, only videos not delivered in previous runs. The first run delivers up to 'Max results'; schedule the same input daily and each run brings only what is new. Channels, and searches sorted by 'pubdate', stop reading as soon as they reach videos already delivered. Works in search, user_videos and popular modes. Also accepted as 'deltaMode', with 'deltaStateKey' to keep separate monitors apart.",
            "default": false
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Apify datacenter proxy is the default and works for Bilibili. Blocked requests are retried on a new IP.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}