{
  "openapi": "3.0.1",
  "info": {
    "title": "Douban Pro Scraper — Reviews, Discussions & Subject Data",
    "description": "The most-used Douban scraper on Apify. Scrape long-form reviews, comments and group discussions from Douban (豆瓣) — China's leading reviews and interest community. Movies, books, music, plus subject search. For Chinese-LLM training corpora, sentiment analysis and academic NLP. No auth.",
    "version": "0.1",
    "x-build-id": "a8i8nfjxgginbM683"
  },
  "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"
            ],
            "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."
          },
          "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 — only what is NEW since your last run",
            "type": "boolean",
            "description": "Turn this on and the Actor remembers every review, comment, reply and topic it has already delivered for this target, and returns <b>only the ones that appeared since your last run</b>. Already-seen rows are not pushed and <b>not charged</b>. Douban reviews and group threads only accumulate, so this is how you watch a film, a book or a group on a <b>daily Apify Schedule</b> without paying for the same rows again. The first run has nothing to compare against, so it delivers (and bills) everything it finds; every run after that bills only the new rows. 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}