{
  "openapi": "3.0.1",
  "info": {
    "title": "Douban Pro Scraper — Reviews, Discussions & Subject Data",
    "description": "Scrape long-form reviews of movies, books and music, short book and music comments with star ratings, and group discussion titles from Douban (豆瓣), China's reviews and interest community. Plus subject and group search. For Chinese-LLM training corpora, sentiment analysis and NLP. API, no login.",
    "version": "0.1",
    "x-build-id": "MFgQzPWHIQlo1Rdc2"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zhorex~douban-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zhorex-douban-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/zhorex~douban-scraper/runs": {
      "post": {
        "operationId": "runs-sync-zhorex-douban-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/zhorex~douban-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-zhorex-douban-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": [
              "subject_reviews",
              "subject_comments",
              "group_topic",
              "subject_search",
              "group_search"
            ],
            "type": "string",
            "description": "What to scrape from Douban.",
            "default": "subject_reviews"
          },
          "subjectUrls": {
            "title": "Subject URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Douban subject URLs (movies, books, or music). Used for subject_reviews and subject_comments modes. Examples: https://movie.douban.com/subject/1292052/, https://book.douban.com/subject/2567698/, https://music.douban.com/subject/1419463/. Note: some less-popular books have moved short-comments behind AJAX-only rendering — popular subjects (rating count > 10K) reliably serve inline comments.",
            "items": {
              "type": "string"
            }
          },
          "topicUrls": {
            "title": "Group topic URLs",
            "uniqueItems": true,
            "type": "array",
            "description": "Douban group topic URLs. Used for group_topic mode. Example: https://www.douban.com/group/topic/319929381/. (Beta — group_topic mode works for most public groups but may fail on private or recently-moderated topics. Report issues at the Actor's Issues page.)",
            "items": {
              "type": "string"
            }
          },
          "searchQuery": {
            "title": "Search query",
            "type": "string",
            "description": "Search query in Chinese or English. Used for subject_search mode, and as the keyword for group_search mode: group_search returns only group topics whose TITLE contains this exact keyword (case-insensitive for Latin letters). Douban's own group search is fuzzy (李宁 also lists titles with 李 and 宁 apart), so those looser matches are dropped and never charged. One group_search run reads at most 10 search pages (about 500 listed topics)."
          },
          "searchType": {
            "title": "Search type",
            "enum": [
              "all",
              "movie",
              "book",
              "music"
            ],
            "type": "string",
            "description": "Restrict subject_search to a single category. Note on how deep each shelf goes: only MOVIE search paginates. Book and music search are single discovery calls that Douban caps at about 10 results per query each — that is the source's limit, not this Actor's. With \"all\" (the default) the run now asks books and music first and hands their unused budget to the movie feed, so maxResults is spent on the shelf that can actually fill it instead of being reserved three ways. For bulk book review extraction use subject_reviews mode with multiple subject URLs.",
            "default": "all"
          },
          "maxResults": {
            "title": "Max results",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Max records to scrape per input URL / search query.",
            "default": 50
          },
          "maxRepliesPerTopic": {
            "title": "Max replies per topic (group_topic mode)",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Cap on the number of replies attached to each group topic record.",
            "default": 50
          },
          "deltaMode": {
            "title": "Delta mode — skip what an earlier run already delivered",
            "type": "boolean",
            "description": "Turn this on and the Actor remembers the reviews, comments, replies and topics it has already delivered for this target (about 200,000), and does not deliver or <b>charge</b> those again: each run returns only rows no earlier run delivered. The first run has nothing to compare against, so it delivers (and bills) everything it finds. <b>subject_reviews and subject_comments are not a feed of newly posted reviews:</b> Douban lists them most popular first to visitors who are not logged in, and each run reads the top <b>maxResults</b> of that list again, so a run returns the rows of that top list you did not get before. A review or comment posted since your last run starts at the bottom of the list and rarely reaches the top. Off by default.",
            "default": false
          },
          "deltaStateKey": {
            "title": "Delta stream name (optional)",
            "type": "string",
            "description": "Only used when <b>Delta mode</b> is on. By default each combination of mode + targets keeps its own memory, which is what you want. Give a name here if you run several independent watches over the same targets (for example one for a weekly digest and one for a daily alert) so they do not consume each other's new rows."
          },
          "fetchFullReviewBody": {
            "title": "Fetch full review body",
            "type": "boolean",
            "description": "When true (default), each review record includes the full long-form body (extra request per review). Disable for faster, cheaper runs that only need the review meta + excerpt.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxy settings. Douban WAFs the movie subdomain — residential proxies are strongly recommended.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}