{
  "openapi": "3.0.1",
  "info": {
    "title": "Douyin 抖音 Video Stats Scraper: Comments & Profiles, No Login",
    "description": "For brands, agencies and researchers watching China: paste Douyin (抖音) video links, get likes, comments, shares, saves, caption, hashtags and author followers per video, plus top comments, related videos and creator profile stats. No login. Monitoring returns only new comments. CSV, Excel, JSON.",
    "version": "0.1",
    "x-build-id": "uLeDdxQkorMyAyzwW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~douyin-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-douyin-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/neverempty~douyin-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-douyin-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/neverempty~douyin-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-douyin-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": {
          "postURLs": {
            "title": "Douyin video URLs",
            "type": "array",
            "description": "Videos to read: https://www.douyin.com/video/7577614489533680959, a v.douyin.com share link, a /note/ (image post) link or the numeric video id. One per line. Each video returns one row with its likes, comments, shares, saves, caption, hashtags, author and follower count. Leave empty to read only profiles.",
            "items": {
              "type": "string"
            }
          },
          "commentsPerPost": {
            "title": "Maximum comments per video",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "How many comments to return for each video in postURLs, in the order Douyin shows them (top comments first). 0 = no comments. If Douyin lists fewer, a free row says how many came back.",
            "default": 0
          },
          "scrapeRelatedVideos": {
            "title": "Scrape related videos",
            "type": "boolean",
            "description": "On = for each video in postURLs, also return the videos Douyin recommends next to it (same columns as a video row, plus relatedTo = the video it was found on). Off (default) = only the videos you listed.",
            "default": false
          },
          "resultsPerPage": {
            "title": "Number of related videos per video",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "With related videos on: at most this many related videos per video in postURLs. Ads are never returned.",
            "default": 20
          },
          "oldestPostDateUnified": {
            "title": "Date filter: only related videos and comments posted on or after",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ][\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?|\\d{1,5}\\s*(d|day|days))$",
            "type": "string",
            "description": "Optional. A date (2026-09-01, read as 00:00 UTC), a time (2026-09-01T12:00:00Z) or a number of days back (30 days). Older related videos and comments are skipped and not charged. The videos you list in postURLs are always returned."
          },
          "newestPostDate": {
            "title": "Date filter: only related videos and comments posted before",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ][\\d:.]+(Z|[+-]\\d{2}:?\\d{2})?)?|\\d{1,5}\\s*(d|day|days))$",
            "type": "string",
            "description": "Optional. Same formats as the date above. Newer related videos and comments are skipped and not charged."
          },
          "leastDiggs": {
            "title": "Popularity filter: related videos with likes at least",
            "minimum": 0,
            "type": "integer",
            "description": "Optional. Related videos with fewer likes are skipped and not charged. Empty = no minimum."
          },
          "mostDiggs": {
            "title": "Popularity filter: related videos with likes below",
            "minimum": 1,
            "type": "integer",
            "description": "Optional. Related videos with this many likes or more are skipped and not charged. Empty = no maximum."
          },
          "profiles": {
            "title": "Douyin profile URLs",
            "type": "array",
            "description": "Creators to read: https://www.douyin.com/user/MS4wLjABAAAA..., a v.douyin.com share link of a profile, or the sec_uid. One per line. Each returns one row with followers, following, total likes, video count, bio, Douyin ID and verification. Leave empty to skip profiles.",
            "items": {
              "type": "string"
            }
          },
          "monitoringMode": {
            "title": "Monitoring mode: return only comments and related videos not returned before",
            "type": "boolean",
            "description": "Off = every run returns everything asked for. On = for each video, comments and related videos returned in an earlier run are skipped and not charged, so a schedule receives only new ones. The video rows and profile rows themselves are returned every run with their current counts. Remembered per video; do not put the same video in two schedules that can run at the same time.",
            "default": false
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears everything remembered for every video, so the next monitoring run returns comments and related videos again as on a first run. Turn it off again after one run.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}