{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Video Scraper & TikTok Hashtag Scraper: Stats by URL",
    "description": "TikTok video scraper, no login: video URLs, share links or hashtags in, one row per video out. Plays, likes, comments, shares, saves as TikTok shows them (rounded above 10K); caption, hashtags, mentions, date, duration, sound, author, subtitles, cover and video files. Misses free.",
    "version": "0.1",
    "x-build-id": "fmhokBnhuyHZztbXa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~tiktok-video-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-tiktok-video-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/hyperbach~tiktok-video-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-tiktok-video-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/hyperbach~tiktok-video-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-tiktok-video-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": {
          "videoUrls": {
            "title": "Video URLs",
            "maxItems": 10000,
            "type": "array",
            "description": "TikTok videos to read, one per line: a video or photo link (`https://www.tiktok.com/@user/video/7210447318028455173`), a share link (`vm.tiktok.com/…`, `vt.tiktok.com/…`, `tiktok.com/t/…`), an `m.tiktok.com/v/<id>.html` or embed link, or a bare video id. Each value gets its own row, in your order: the video, or a free row that says why not (not found, a profile link, a dead share link).",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "Hashtags",
            "maxItems": 100,
            "type": "array",
            "description": "Hashtags, one per line, with or without `#` (`olympics`, `#fyp`, a `tiktok.com/tag/…` link): the videos of the hashtag's own list, up to `maxItemsPerQuery` each, read over plain HTTP; a stealth browser reads a hashtag only when TikTok refuses the plain list, so a run with hashtags takes 4 GB of memory.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxItemsPerQuery": {
            "title": "Max videos per hashtag",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "The most videos each hashtag delivers. TikTok's logged-out list of a big hashtag ends after about 120 to 175 videos; the hashtag's row says when the list ended before your number.",
            "default": 50
          },
          "maxItems": {
            "title": "Max videos (whole run)",
            "minimum": 0,
            "maximum": 10000000,
            "type": "integer",
            "description": "The most charged videos of the whole run; 0 = no cap beyond your charge limit. Every input still gets its row.",
            "default": 0
          },
          "postedWithin": {
            "title": "Posted within",
            "enum": [
              "any",
              "day",
              "week",
              "month",
              "3months",
              "6months"
            ],
            "type": "string",
            "description": "Keep only hashtag videos posted in this window, checked on each video's own date. A video outside it is not delivered and not charged. Video URLs are always read.",
            "default": "any"
          },
          "postedAfter": {
            "title": "Posted after",
            "type": "string",
            "description": "Keep only hashtag videos posted on or after this date (UTC, YYYY-MM-DD). Checked on each video's own date."
          },
          "postedBefore": {
            "title": "Posted before",
            "type": "string",
            "description": "Keep only hashtag videos posted before this date (UTC). Checked on each video's own date."
          },
          "minPlays": {
            "title": "Min plays",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hashtag videos with at least this many plays (the figure TikTok's page shows: rounded above 10,000)."
          },
          "minLikes": {
            "title": "Min likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hashtag videos with at least this many likes."
          },
          "maxLikes": {
            "title": "Max likes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hashtag videos with at most this many likes (to find smaller creators)."
          },
          "minComments": {
            "title": "Min comments",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hashtag videos with at least this many comments."
          },
          "minShares": {
            "title": "Min shares",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only hashtag videos with at least this many shares."
          },
          "minDuration": {
            "title": "Min duration (seconds)",
            "minimum": 0,
            "maximum": 36000,
            "type": "integer",
            "description": "Keep only hashtag videos at least this long (a photo post has no duration and is left out when a duration is set)."
          },
          "maxDuration": {
            "title": "Max duration (seconds)",
            "minimum": 0,
            "maximum": 36000,
            "type": "integer",
            "description": "Keep only hashtag videos at most this long."
          },
          "excludeAds": {
            "title": "Leave out ads",
            "type": "boolean",
            "description": "Leave out hashtag videos TikTok marks as ads (`is_ad`).",
            "default": false
          },
          "strictHashtag": {
            "title": "Only videos tagged with the hashtag",
            "type": "boolean",
            "description": "Keep only the hashtag videos whose caption carries the hashtag itself. TikTok's tag page also lists videos without it (74 of 162 under #olympics in our test); those are left out, free, and counted in the hashtag's `rows_dropped`.",
            "default": false
          },
          "readCountry": {
            "title": "Read video pages from",
            "enum": [
              "US",
              "GB",
              "DE",
              "FR",
              "ES",
              "NL",
              "PL",
              "CA",
              "BR",
              "MX",
              "JP",
              "AU"
            ],
            "type": "string",
            "description": "The country video URLs are read from. TikTok's comment count differs by data centre (one video read 249, 236, 235 and 230 comments in two minutes from the US, Canada and Europe); every row names the country and the data centre it was read from. Hashtag lists are always read from the US. TikTok often walls readers in Canada, Brazil, Japan, Mexico and Australia (measured in November 2026): a run from there can end PARTIAL, and a video TikTok refuses is a free `failed` row. The US, the UK, Germany and France read reliably.",
            "default": "US"
          },
          "searchDetails": {
            "title": "Read each hashtag video's page",
            "type": "boolean",
            "description": "Read each delivered hashtag video's own page too, for what TikTok's lists leave out: the subtitle tracks, the location the video was posted from, the AI-generated label, the author's account date. About half a second a video more; no extra charge.",
            "default": false
          },
          "downloadCovers": {
            "title": "Store the cover images",
            "type": "boolean",
            "description": "Store each video's cover image in the run's key-value store, with a link that does not expire on the row (`cover_file_url`). Free with the row.",
            "default": false
          },
          "downloadSlideshowImages": {
            "title": "Store a photo post's images",
            "type": "boolean",
            "description": "Store every image of a photo post (slideshow) in the run's key-value store, each linked in `media_files`. Charged per image stored.",
            "default": false
          },
          "downloadVideos": {
            "title": "Store the video files",
            "type": "boolean",
            "description": "Store each video's MP4 file in the run's key-value store, with a link that does not expire on the row (`video_file_url`): the file TikTok's page plays, the same file the leading TikTok scraper stores. Ordinary videos are large (1.5-56 MB, 25 MB on average over 10 ordinary videos of 11-465 s). TikTok's own video link works only with the reading session's cookies. Charged per MP4 stored.",
            "default": false
          },
          "proxyUrl": {
            "title": "Proxy URL",
            "type": "string",
            "description": "Your own proxy (scheme://user:pass@host:port) for every call instead of ours. Leave empty: the Actor brings its own connections at no cost to you."
          },
          "feedback": {
            "title": "Feedback to the maintainers",
            "maxLength": 2000,
            "type": "string",
            "description": "A note to the people who maintain this Actor: what you needed and did not get. For example a missing field, a wrong or empty result, or the Actor you switch from or to, and why. The run does not read it: the rows and the charges stay the same. A person reads every note."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}